2010-07-28 3 views
7

Im essayant de faire une simple rotation d'un cube sur l'axe x et y:rotation de la matrice opengl escouades

Je veux tourner toujours le cube sur l'axe x d'un montant x et faites pivoter le cube sur la Yaxis par un organisme indépendant montant y de la rotation de l'axe x

premier i naïvement fait:

glRotatef(x,1,0,0); 
glRotatef(y,0,1,0); 

puis

mais que première ov fait pivoter er x tourne alors sur y Je veux tourner sur y indépendamment de l'accès x.

j'ai commencé à regarder dans escouades, j'ai donc essayé:

Quaternion Rotation1; 
Rotation1.createFromAxisAngle(0,1, 0, globalRotateY); 
Rotation1.normalize(); 

Quaternion Rotation2; 
Rotation2.createFromAxisAngle(1,0, 0, globalRotateX); 
Rotation2.normalize(); 

GLfloat Matrix[16]; 

Quaternion q=Rotation2 * Rotation1; 

q.createMatrix(Matrix); 
glMultMatrixf(Matrix); 

qui fait juste presque exactement ce qui a été accompli faire 2 glRotates consécutifs ... donc je pense im manque une étape ou 2.

est quaternions le chemin à parcourir ou devrais-je utiliser quelque chose de différent? ET si les quaternions sont le chemin à parcourir, quelles étapes puis-je ajouter pour faire tourner le cube indépendamment de chaque axe? je pense que quelqu'un d'autre a le même problème: Rotating OpenGL scene in 2 axes

+0

ok laissez-moi le dire de cette façon ... ce que je veux faire est de tourner un cube à l'aide de la souris. Je veux à gauche de contrôler la rotation de l'axe des écrans, puis de contrôler les mouvements de rotation de l'axe x. Je veux qu'ils tournent indépendamment de l'autre axe mais ne tournent que sur l'axe global des écrans. Si je fais 2 glRotations je ne suis pas ce comportement parce que la rotation d'un axe mutliplies l'autre. – yeahdixon

+0

Par exemple la rotation d'un cube: aucune opération de rotations ne révèle un seul côté alors je fais glRotatef (90,1,0,0); \t glRotatef (45,0,1,0); \t gives \t me donne un cube incliné (diamant), quand je voulais un cube qui avait son coin face à la caméra qui serait en fait le résultat de l'échange des opérations: \t glRotatef (45,0,1,0); \t glRotatef (90,1,0,0); Je voudrais juste échanger les rotations des commandes, mais qui se jette dans les mêmes problèmes lorsque les valeurs d'angle sont retournées. – yeahdixon

Répondre

3

J'ai obtenu ceci pour fonctionner correctement en utilisant des quaternions: Je suis sûr qu'il y a d'autres manières, mais après un peu de reseatch, ceci a fonctionné parfaitement pour moi. J'ai posté une version similaire sur un autre forum.http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=280859&#Post280859

d'abord créer la représentation de quaternion des angles de changement x/y ensuite chaque trame de multiplier le changement d'angle quaternions à une accumulation de quaternion, puis enfin convertir cette quaternion à la matrice sous forme de multiplier la matrice en cours. Voici le code principal de la boucle:

Quaternion3D Rotation1=Quaternion3DMakeWithAxisAndAngle(Vector3DMake(-1.0f,0,0), DEGREES_TO_RADIANS(globalRotateX)); 
Quaternion3DNormalize(&Rotation1); 

Quaternion3D Rotation2=Quaternion3DMakeWithAxisAndAngle(Vector3DMake(0.0f,-1.0f,0), DEGREES_TO_RADIANS(globalRotateY)); 
Quaternion3DNormalize(&Rotation2); 


Matrix3D Mat; 
Matrix3DSetIdentity(Mat); 
Quaternion3DMultiply(&QAccum, &Rotation1); 

Quaternion3DMultiply(&QAccum, &Rotation2); 

Matrix3DSetUsingQuaternion3D(Mat, QAccum); 
globalRotateX=0; 
globalRotateY=0; 

glMultMatrixf(Mat); 

puis dessiner cube

+0

ce site vraiment aidé: http://www.gamedev.net/reference/articles/article1095.asp mais n'a pas de sens dans un premier temps jusqu'à ce que je fait des recherches et des choses encore essayé – yeahdixon

0

Cela nous aiderait beaucoup si vous pouviez donner une explication plus détaillée de ce que vous essayez de faire et comment les résultats que vous obtenez diffèrent des résultats que vous voulez. Mais en général, l'utilisation des angles d'Euler pour la rotation pose quelques problèmes, car la combinaison des rotations peut entraîner un comportement non intuitif (et dans le pire des cas perdre un degré de liberté).

Quaternion slerp pourrait être la solution idéale si vous le pouvez. trouver un seul axe et un seul angle qui représentent la rotation que vous voulez. Mais faire des rotations successives autour des axes X et Y en utilisant des quaternions ne vous aidera pas à éviter les problèmes inhérents à la composition des rotations d'Euler.

Le message que vous liez semble toutefois impliquer un autre problème. L'affiche semble avoir traduit son objet et ensuite faire ses rotations, alors qu'il aurait dû tourner d'abord et ensuite traduire.

+0

Je décrit la question ci-dessus plus en détail, mais je pense que le terme officiel est gimbal lock – yeahdixon

0

Il n'est pas clair ce que vous voulez réaliser. Vous devriez peut-être réfléchir à certains points et à l'endroit où vous souhaitez les faire pivoter, par exemple. le sommet (1,1,1) doit correspondre à (0,1,0). Ensuite, à partir de ces informations, vous pouvez calculer la rotation requise. Les quaternions sont généralement utilisés pour interpoler entre deux «positions» de rotation. La première étape consiste donc à identifier vos «positions» de début et de fin, ce que vous n'avez pas encore. Une fois que vous avez cela, vous utilisez des quaternions pour interpoler. Il ne semble pas que vous ayez un aspect variant dans le temps ici.

+0

je l'ai décrit la question ci-dessus plus en détail, mais je pense que le terme officiel est gimbal lock – yeahdixon

0

Votre problème n'est pas le verrou de cardan. Et effectivement, il n'y a aucune raison pour que votre version de quaternion fonctionne mieux que votre version de matrice (glRotate) parce que les quaternions que vous utilisez sont mathématiquement identiques à vos matrices de rotation.

Si ce que vous voulez est un contrôle de la souris, vous voulez probablement vérifier arcballs.

+0

thankyou, ouais je suis totalement d'accord, escouades et matrices de rotation peut être échangé de sorte qu'il puisse être fait sans quaternions. La réponse à ce prob était plus dans la prémultiplication de la matrice, en utilisant des rotations incrémentales. – yeahdixon

Questions connexes