2009-08-14 4 views
4

J'ai une scène qui contient des objets situés n'importe où dans l'espace et je crée une interface ressemblant à une boule de commande.Rotation de la scène OpenGL sur 2 axes

Je voudrais faire en sorte que je puisse déplacer 2 curseurs séparés pour tourner dans x et y axes respectivement:

glRotatef(drawRotateY,0.0,1.0f,0); 
glRotatef(drawRotateX,1.0f,0.0,0.0); 
//draw stuff in space 

Cependant, le code ci-dessus ne fonctionnera pas parce que la rotation de X alors dépend de la rotation Y

Comment puis-je y parvenir sans utiliser gluLookAt()?

Editer: Je voudrais dire que ma mise en œuvre est encore plus simple qu'une interface de trackball. Fondamentalement, si la valeur du curseur x est de 80 et que le curseur y est de 60, tournez verticalement de 80 degrés et horizontalement de 60 degrés. J'ai juste besoin de les rendre indépendants les uns des autres!

+1

Août 14 ... Avez-vous encore besoin d'une explication? –

Répondre

0

Vous pouvez probablement utiliser quelque chose comme ceci:

Vector v = new Vector(drawRotateX, drawRotateY, 0); 
float length = v.length(); 
v.normalize(); 
glRotatef(length, v.x, v.y, v.z); 
+0

Trouvé une implémentation Vec3f ici: http://wwwx.cs.unc.edu/~lastra/Courses/COMP238_F2000/Code/vec3f.hpp Quoi qu'il en soit, cela n'a pas fonctionné. – KeniF

0

Quand vous dites faites pivoter verticalement et horizontalement, voulez-vous dire comme un canon antiaérien - rotation autour de l'axe vertical Z, pour faire face à une boussole particulière direction (lacet), puis tourner vers une élévation particulière (hauteur)?

Si c'est le cas, alors vous avez juste besoin de faire vos deux rotations dans le bon ordre, et tout ira bien. Dans cet exemple, vous devez d'abord effectuer la rotation «pitch», puis la rotation «yaw». Tout ira bien.

Si vous voulez dire quelque chose de plus compliqué (par exemple, comme le vaisseau spatial 'Cobra' dans Elite), vous aurez besoin d'une solution plus sophistiquée.

+0

vous avez raison, mais mes objets ne sont pas à l'origine. Par conséquent, une rotation deux fois signifie que la seconde rotation est affectée par la première. – KeniF

+0

Hé là. Je ne pense pas que cela devrait avoir de l'importance, tant que vous faites toutes vos rotations avant de faire votre traduction. Peut-être que je ne comprends pas ce dont vous avez besoin. Mon exemple de «canon antiaérien» est-il une bonne comparaison? Ou pas tellement? Merci! –

+0

Maintenant que j'y reviens, des mois plus tard, il me vient un commentaire très tardif mais peut-être constructif: Afin d'obtenir les bonnes rotations, il est courant de s'assurer que tous vos objets commencent à l'origine. Faites les rotations que je décris, puis transférez l'objet à sa position dans le monde. Tout cela est fait par la seule matrice modelview, donc ce n'est pas plus cher que de faire les rotations. –

Questions connexes