2009-06-14 4 views
1

J'essaie d'obtenir la rotation de la caméra sur différents axes en OpenGL (mais en utilisant spécifiquement Java, LWJGL et jME). L'objet camera me permet d'obtenir la direction en tant que Vector3f, mais cela ne semble pas fonctionner pour obtenir la rotation componentized; chaque axe apparaît lié à un autre axe. J'ai trouvé que toAngleAxis avec le composant angle avec offset était un hack rapide, mais ne fonctionne pas correctement dans la plupart des situations. Je ne suis pas très bon en maths, sinon j'aurais pu résoudre ce problème :) Encore une fois, j'ai juste besoin des axes X, Y et Z composant et en radians, de 0 radians à 2 radians PI.Obtention de la rotation de la caméra en radians sur les axes X, Y et Z dans OpenGL?

Quelqu'un peut-il aider?

Vive et merci à l'avance, Chris

Répondre

1

Obtenir la rotation des anges ne nécessite que la transformation du vecteur de vue donné en coordonnées cartésiennes en coordonnées sphériques. Vous pouvez trouver les formules dans wikipedia.

viewvector = <x, y, z> 

r = sqrt(x² + y² + z²) 
phi = arctan2(y, x) 
theta = arccos(z/r) 

Notez que vous ne pouvez obtenir que deux angles de rotation du vecteur de vue. L'obtention du troisième angle de rotation nécessite de connaître le plan de projection x ou l'axe y.

+0

Est-ce que cela nécessite le point de référence de vue et le plan de vue normal? –

+0

J'ai trouvé une image utile à http://www.fsz.bme.hu/~coll/papers/applets/doc/images/world3D.cameras.Camera3D.Image01.gif, comment le plan de projection X ou Y axe se rapportent à cela? Est-ce aussi simple que d'utiliser le Vector3f pour un système de coordonnées y-up ou z-up? Bravo –

+0

C'est le plan de vue normal que vous devez transformer. Et l'axe x et y du plan de vue (souvent appelé vecteur droit et haut) est nécessaire pour déterminer l'angle de roulis - c'est-à-dire faire tourner la caméra autour de la direction de la vue. http://techpubs.sgi.com/library/dynaweb_docs/0620/SGI_Developer/books/Perf_PG/sgi_html/figures/04.4.plane.rotation.gif –

3

Je vous recommande de lire à propos des angles d'Euler, du lacet/tangage/roulis et de l'orientation du quaternion. Ces sujets vous aideront à comprendre tout ce qui est impliqué. Si je comprends bien, vous essayez de construire des angles d'Euler à partir d'une orientation spécifiée.

Voir ce code for some algorithms pour travailler avec les angles d'Euler. En particulier, je crois que ce que vous voulez, c'est la méthode setDirection.

Cela vous donnera un lacet et un tangage d'un vecteur directionnel. Notez que vous n'avez besoin que de 2 rotations, car "roll" nécessiterait une rotation autour du vecteur directionnel (ou votre direction spécifiée comme une seule rotation quaternion).

+0

Je ne peux pas utiliser la méthode setRotation, malheureusement - il existe d'autres systèmes agissant sur la caméra et j'ai besoin de convertir la rotation de la caméra tenue. En outre, ces systèmes font simplement des choses comme multiplier le vecteur avant de la caméra pour le faire avancer, etc. –

+1

Je soulignais setRotation() parce qu'il fait le calcul réel dont vous avez besoin - il vous donne, à partir d'un vecteur spécifique (rotation), comment obtenir le tangage et lacet (les 2 rotations pour le créer). Il n'est pas nécessaire de "définir" la rotation - cela vous donne juste un moyen de découvrir les rotations en place. –

Questions connexes