Voilà quelques jours que je m'acharne à maitriser les rotations d'une simple boite.
Impossible d'obtenir de bon résultat malgré les divers méthodes que j'ai tenté.
J'ai tout d'abord naïvement essayé de gérer mes rotations avec les angles d'Euler. Je suis rapidement tombé sur un problème connu nommé le blocage de cardan (ou gimbal lock). Ce problème engendre, par exemple l'alignement de 2 axes ( une rotation sur l'axe des X peut donner le même résultat qu'une rotation sur l'axe des Z ).
Après quelques recherche, je lis qu'en utilisant des Quaternions, il est possible d'évité le problème. J'implémente et expérimente cette solution et le blocage de cardan est totalement évité.
À ce stade, j'ai donc une fonction membre dans mes objets prototypé ainsi:
void Rotate(double x, double y, double z); //angle en Degree
Cependant, après de nombreux tests, je constate une imperfection. J'isole l'action qui pose problème; Si j'effectue 2 appels consécutifs à ma fonction Rotate(10, 10, 0) puis Rotate(-10, -10, 0), une rotation est effectué sur l'axe des Z (alors que normalement, l'objet devrait resté immobile, non?)
Est-ce que j'ai mal implémenté les quaternions ? peut être. C'est pourquoi j'ai remplacer mes quaternions pas ceux de la lib glm (OpenGL math). Toujours le même problème !
J'ai alors décidé de changer de méthode. Je suis tombé sur la technique des GLFrame dans le livre de la Bible d'OpenGL. J'ai implémenter cette nouvelle class, et essayé à nouveau. Pas de gimbal lock non plus avec cette solution ("Youpi"), mais...Toujours le même problème !
Je ne sais plus quoi faire et je commence sérieusement à me demander comment les rotations sont implémenté dans les moteurs 3D.
Pour ce qui de mon problème, j'ai réalisé un code minimal qui mets en évidence ce dernier.
Il a été réalisé avec SFML et OpenGL.
Les instructions sont affiché à l'execution du programme.
Un executable est présent dans l'archive pour observer rapidement le problème.
Un autres action problématique peut être exécuté dans la démonstration; il s'agit d'une boucle qui exécuté 360 fois une rotation de (1, 1, 0) (donc on devrait revenir au début, et ce n'est pas la cas !).
Lien du telechargement:
http://uploading.com/files/eef4cb1e/...deMinimal.rar/
Merci d'avance
Partager