Quaternions et opengl

cs_acropole Messages postés 10 Date d'inscription vendredi 29 juillet 2005 Statut Membre Dernière intervention 26 avril 2009 - 6 sept. 2005 à 15:09
cs_acropole Messages postés 10 Date d'inscription vendredi 29 juillet 2005 Statut Membre Dernière intervention 26 avril 2009 - 8 sept. 2005 à 13:14
Bonjour,

Je cherche de l'aide pour programmer en C++ les mouvement d'objets dans un environnement openGl. J'ai commencé à programmer l'affichage (chargement de meshs, de extures, éclairage etc...) mais je me retrouve bloqué par les rotations succéssives et le gimbal lock. J'ai cherché partout sur le web une solution mais jusqu'à présent je n'ai obtenu aucun résultat viable, ce qui met tout le projet à la poubelle... Sans rotation correcte aucun objet ne pourra se déplacer ni pivoter convenablement.

Est ce que quelqu'un aurait déjà programmé le comportement suivant ?

On se palce du point de vu d'un pilote de vaisseau spatial.
Lorsqu'on bouge la souris sur l'axe vertical le vaisseau tourne sur l'axe X local.
Lorsqu'on bouge la souris sur l'axe lateral le vaisseau tourne sur l'axe Y local.
Les touches z, q, s, d, v et espace permettent de se déplacer (straffer) vers lavant, sur les cotés et de haut en bas, là aussi par rapport à l'orientation locale du vaisseau.

Merci d'avance

2 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
8 sept. 2005 à 10:55
Bon si une réponse t'intéresse toujours, demande sur ce post. Comme il est assez vieux, pas envie de perdre mon temps :)

Ceci dit, pas besoin de quaternion pour ca (ptet car j'y connais rien).
Tu utilises simplement des matrices 3x3 mais de taille (4x4). Ca a dire
que tu rajoutes seulement un 1 sur la dernière case de la diagonale de
la matrice 4x4. C'est la matrice de changement de base entre la base
opengl et la base du vaisseau. Donc ensuite quand tu fais bouger ton
vaisseau sur l'axe local, tu appliques la rotation d'axe X (celui de
ton repère local) sur le repère local lui meme. (ca engendre un
problème qu'on va voir après).

Pour afficher ton vaisseau dans opengl.

glMatrixMode(GL_MODEL_VIEW);

glMultTransposeMatrix(ta_matrice_de_chgt_de_base); // ou
glTranposeMatrix (me rappelle plus si opengl prend en colonne ou en
ligne)

glBegin...

Bon après ton vaisseau.



Le problème donc, c'est la précision du calcul, plus ca va, plus ton
repère se déforme :) enfin si tu utilises double, ca va durer quelque
temps avant de se déformer. Mais la solution c'est de temps en temps,
recalculer ta base. C'est à dire, a partir du vecteur X local et du
vecteur Y. Tu commences par renormalise le vecteur X puis tu fais Y = Y
- (X.Y)X pour enlever toute composante de Y suivant X et s'assurer donc
qu'ils sont bien orthogonaux. Tu normalises Y. Puis par produit
vectoriel, tu obtiens Z. Et la tu as une base toute neuve (ca reste
quasiment la meme qu'avant).



Bon ++
0
cs_acropole Messages postés 10 Date d'inscription vendredi 29 juillet 2005 Statut Membre Dernière intervention 26 avril 2009
8 sept. 2005 à 13:14
a priori je devrais m'en sortir avec ça :
http://nehe.gamedev.net/data/articles/article.asp?article=08
je vais essayer ce soir et ce week-end.
0
Rejoignez-nous