Bonjour à tous.
Je suis actuellement en train de développer un moteur physique 3D (seulement sur des cubes de même taille donc assez basique) et je viens tout juste de trouver la cause de tous mes problèmes.
En effet j'ai besoin de placer chaque cube dans ma boucle de rendu en fonction de ses coordonnées (jusque là, pas de problème), et de ses angles de rotations rx, ry, rz par rapport aux trois axes X, Y, Z du repère global fixe.
Le problème étant que chaque rotation modifie le repère et que les rotations suivantes ont donc lieux dans le repère local.
Mon code initial était donc le suivant :
J'ai vu qu'il y avait plusieurs sujet qui traitait de ce problème mais aucun ne donne de solution qui me convienne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 glPushMatrix(); glTranslated(x, y, z); glRotated(rx, 1, 0, 0); glRotated(ry, 0, 1, 0); glRotated(rz, 0, 0, 1); glutSolidCube(SIZE); glPopMatrix();
Le problème peut soit-disant être résolu grâce aux quaternions, en multipliant le quaternion de rotation à effectuer avec le quaternion courant, puis en transformant ce nouveau quaternion en matrice de rotation qu'il suffit d'appliqer.
Malheuresement j'ai besoin de travailler en permanence sur les angles du repère global pour mon moteur physique donc j'aimerai construire à chaque nouvel affichage une matrice de rotation à partir de ces angles.
J'ai donc pensé à cette solution :
Mais sans résultat, les rotations dépendent encore du repère local.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 CreateQuaternion(id, 0, 1, 0, 0); CreateQuaternion(rotx, rx, 1, 0, 0); CreateQuaternion(roty, ry, 0, 1, 0); CreateQuaternion(rotz, rz, 0, 0, 1); MultQuaternions(rot3, rotx, id); MultQuaternions(rot2, roty, rot3); MultQuaternions(rot, rotz, rot2); QuaternionToMatrix(rot, rotmatrix); glPushMatrix(); glTranslated(x, y, z); glMultMatrixd(rotmatrix); glutSolidCube(SIZE); glPopMatrix();
J'ai enfin pensé à une dernière solution, qui est d'effectuer ma 1ère rotation selon l'axe X normalement, puis de faire ma rotation selon Y en donnant les nouvelles coordonnées d'un vecteur de l'axe Y.
Ce qui donne quelques chose de ce style :
Je me suis certainement trompé dans les coordonnées du vecteur de l'axe Z global dans le repère local après 2 rotations, mais même en supprimant la dernière rotation, la rotation selon Y continue à dépendre du repère local et je n'arrive pas du tout à comprendre pourquoi...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 glPushMatrix(); glTranslated(x, y, z); glRotated(rx, 1, 0, 0); glRotated(ry, 0, cos(rx), -sin(rx)); glRotated(rz, "fonction compliquée de rx et ry", "compliqué", "et compliqué"); glutSolidCube(SIZE); glPopMatrix();
Edit : Après avoir réessayé cette 3ème solution, la rotation selon Y se fait parfaitement bien, c'est en fait la rotation selon X qui dépend du repère local ! Je crois vaguement comprendre pourquoi mais j'ai vraiment aucune idée pour y résoudre pour le moment.
Si quelqu'un a une solution, ou pourquoi pas une matrice de rotation toute prête, je serais très intéressé, d'autant plus que je commence à désespérer...
J'avais pas vraiment l'intention de rester coincé sur un problème graphique pour réaliser mon moteur physique!
Merci d'avance!
Partager