2009-05-16 14 views
0

J'essaie de faire en sorte que, peu importe à quelle distance deux objets sont, ils resteront à l'écran. J'utilise JOGL, mais cela ne devrait pas avoir d'importance car j'ai juste besoin d'aide pour les maths. Voilà ce que j'ai jusqu'à présent:Caméra 3D Zoom et suivre la physique en Java?

float distance = (float) ((Math.sqrt((p1.x - p2.x) + (p1.y - p2.y)))); 
float camx = (float)((p1.x + p2.x) * 0.5); 
float camy = (float)((p1.y + p2.y) * 0.5); 
float camz = (float) (distance * 5); 

Qu'est-ce que les mathématiques que j'ai besoin de sorte que le Z effectue un zoom avant et correctement?

+0

Je vous suggère d'utiliser double au lieu de float. float ne vous épargnera pas beaucoup de mémoire, mais il ajoute de la complexité à vos calculs. –

+1

@Peter: Quelle complexité ajoute-t-elle? (Je suis d'accord, cependant, «double» est généralement préférable pour le gain de précision quasi-gratuit.) –

+0

@Tomalak, Vous me testez là-bas comme j'ai fait le commentaire il y a presque un an. ;) Dans cet exemple, j'ai supposé qu'il y avait un besoin de lancer, mais en le regardant maintenant, il semble qu'ils soient tous redondants, alors changer en double ne fera peut-être aucune différence. –

Répondre

0
float distance = (float) ((Math.sqrt(Math.pow((p1.x - p2.x),2.0) + Math.pow((p1.y - p2.y), 2.0)))); 
float camx = (float)((p1.x + p2.x) * 0.5); 
float camy = (float)((p1.y + p2.y) * 0.5); 
float camz = (float) Math.abs(distance); 
2

Peut-être que je suis mal compris votre situation, mais ne pouvait pas vous faire juste

float camx = (p1.x + p2.x) * 0.5; 
float camy = (p1.y + p2.y) * 0.5; 
float camz = (p1.z + p2.z) * 0.5; 

qui placerait l'appareil photo directement entre les deux objets.

+0

Cela a fonctionné pour X et Y, mais pas pour Z. Merci beaucoup. – William

+1

Cela signifie simplement que vous n'essayez pas de placer la caméra entre les deux objets. Il serait probablement utile de modifier plus en détail votre question sur ce que vous essayez exactement de faire. –

+0

J'essaie de faire en sorte que, peu importe la distance entre certains objets, ils resteront à l'écran. – William

1

Au cas où il faut corriger comme,

float distance = (float) ((Math.sqrt ((P1.x - p2.x)^2 + (p1.y - p2.y)^2)));

Je ne suis pas vraiment sûr de la syntaxe. Je dis juste que vous devez obtenir la puissance de 2 avant d'ajouter des vecteurs.

3

Si les deux objets ont z = 0, et l'écran angle de visualisation (du centre de l'écran à un bord) est ax et ay pour les angles horizontaux et verticaux, alors:

zx = abs((p1.x-p2.x)*0.5)/tan(ax) 
zy = abs((p1.y-p2.y)*0.5)/tan(ay) 

et

camz = max(zx, zy) 

ici zx et zy sont les distances pour obtenir les objets sur les dimensions horizontales et verticales de l'écran, et Camz est la distance qui satisfait les deux critères. Notez également que ax et ay sont en radians (par exemple, si vous supposez que votre écran est de 40 degrés de large, alors ax est de 20 degrés, ou ax = 20 * (pi/180) = 0,3419 radians).

Vos valeurs pour camx et camy étaient correctes.