PDA

Voir la version complète : Recréer un Gimbal Lock !


HanLee
02/10/2005, 13h57
Bonjour,

On entend super souvent parler du Gimbal Lock, comme quoi il faudrait utiliser les Quaternions pour les éviter et tout ça.

Mais moi j'utilise pas les quaternions, j'utilise les matrices pour toutes mes rotations, de la caméra et tout. Et j'arrive pas à perdre des degrés de liberté.

J'ai beaucoup cherché des explications sur le net, mais pas trouvé des explications explicites, qui montrent simplement d'où vient la faille.

Apparemment, ca viendrait uniquement de l'utilisation des angles d'Euler ? Du fait qu'on se trompe dans l'ordre des rotations ?

C'est pour ça que j'demande juste que vous me donniez un exemple fonctionnel d'un truc qui va me faire provoquer un Gimbal Lock.

J'ai pas dit un code complet ;)

Je veux juste que vous me disiez un truc genre :
- crée toi un pavé
- associe lui une matrice de transformation, et telles ou telles variables
- associe telle ou telle variable avec telle ou telle touche
- dans la boucle de rendu, fais tel calcul
- appuie sur telle ou telle touche et tu verras ce qui se passe

Simplement ça ;)

(En fait, j'avais trouvé un code opengl qui le recréait, mais j'ai pas compris comment il le faisait, alors c'est pour ça que je le demande en DirectX).

Merci d'avance =P

remram44
02/10/2005, 16h37
Il suffit de ne pas utiliser les matrices (donc 4x4 ou 3x3 nombres) mais simplement 3 nombres. Quand tu veux afficher, tu fais les rotations suivant les axes Y, X puis Z, et c'est bon :D

HanLee
02/10/2005, 17h52
J'mets les 3 nombres Yaw/Pitch/Roll.
Une paire de touches qui les incrémente/décrémente en fonction du temps.
Et j'fais toujours les rotations toujours dans l'ordre que tu m'as dit avec MatrixRotationYawPitchRoll ?

OK ben j'essaierai ça la semaine prochaine (pas de PC en semaine...)!

Laeti²x
02/10/2005, 19h17
je dirais... fais toi un trackball virtuel, tu dois avoir ca dans ton placard: tu sais, quand tu bouges la scene dans le repere de l'ecran en fonction de la position XY de la souris (avec du picking et une projection). Bref.
Ensuite verifie bien que tu n'as pas de blockage d'angle en bout de course (genre aux valeurs critiques pas de traitement special)
je peux me tromper (j'ai du dire ca environ autant de fois que j'ai poste, mais là j'ai beaucoup plus de doutes que d'habitude) mais je crois que le pb qui se pose en bout de course sans traitement specifique est le resultat d'un gimbal lock.

Lightness1024!
08/10/2005, 21h13
eh ben moi je rejoins fortement HanLee sur sa question car moi aussi j'ai toujours utilisé les applications linéaires de base (sans matrices) avec trois angles pour faire mes rotations autours d'axes quelconques..
et ce dans plusieurs programmes et de manieres différentes.
une fois pour calculer des départs de branchages dans des arbres procéduraux avec angles aléatoires par rapport à la branche parente, une fois pour gérer la direction de vision de la caméra en fonction des mouvements de la souris, une autre fois encore pour orienter mes billboards face à la caméra..
bref tout a la main et jamais en 4D et jamais aucuns probleme.

donc je sais toujours pas ce que c'est qu'un gimbal lock et plus j'en entend parler plus j'ai l'impression d'un canulard qui proviendrai juste de personnes ayant mal programmer leurs fonctions de rotations...

mais bon comme des gens de renoms me dépassant largement en math disent que c'est bien c'est qu'il doit y avoir une vraie raison mais que personne n'est capable d'expliquer correctement :00000020: peut etre ??

;)

Laeti²x
06/11/2005, 03h51
juste une petite note (encore un thread reveille) parce que je suis pechu ce soir et que le soir du precedent post j'ai limite delire pour de bon...
j'utilise pas les quaternions pour trouver une solution a un probleme a vrai dire
mais pour leur souplesse et leur efficacite de code, et leur facilite "a l'usage" (et non pas quand on les apprend !).
j'ai vu des "zamis" qui se depatouillent tres bien sans avec des angles d'euler depuis toujours et qui vivent sans souci, je crois que c'est aussi une question de snobisme mathematique, quand tu t'es embete a comprendre ca, tu t'en sers.

et aussi, j'evite d'utiliser des angles avec les vecteurs 3d meme si parfois je suis reduit a utiliser des acos, atan, et asin avec les vecteurs, parce que c'est souvent imprecis, du coup j'essaie d'uniformiser le code en utilisant une bonne vieille matrice de rotation avec un dot est un cross... ce qui se ramene... a un quaternion.

HanLee
06/11/2005, 09h29
Ouais bah en fait moi j'vais continuer à faire ce que je fais, et puis je pense que ce sera quand j'aurai un problème que j'comprendrais ce qu'est un Gimbal Lock ;)

En fait, à ce que j'ai pu comprendre, utiliser des matrices ou des quaternions c'est pareil sauf que le quaternion prend moins de place ?

Lenolian
06/11/2005, 12h16
Une matrice de rotation ou un quaternion exprime la même chose : une rotation autour d'un axe. L'intérêt des quaternions est la facilité avec laquelle on les combines (multiplier deux quaternions est beaucoup plus rapide que multiplier deux matrices). Avec les quaternions on peut aussi facilement faire de l'interpolation linéaire ou sphérique.

Edit :

En fait les angles d'euler pour les rotations sont exprimé en fonction des axes globaux (invariants) et non pas en fontion des axes de l'objet à tourner.

Imagines un vecteur parrallèle à l'axe des X, fais une rotation de ce vecteur autour de l'axe des Y pour qu'il devienne parrallèle à l'axe des Z. Alors une rotation autour de l'axe des Z n'a plus d'effet, tu viens de perdre un degré de liberté (plus que 2 axes de rotations qui fonctionne) : c'est le gimbal lock.

HanLee
06/11/2005, 13h19
Une matrice de rotation ou un quaternion exprime la même chose : une rotation autour d'un axe. L'intérêt des quaternions est la facilité avec laquelle on les combines (multiplier deux quaternions est beaucoup plus rapide que multiplier deux matrices). Avec les quaternions on peut aussi facilement faire de l'interpolation linéaire ou sphérique.

Edit :

En fait les angles d'euler pour les rotations sont exprimé en fonction des axes globaux (invariants) et non pas en fontion des axes de l'objet à tourner.

Imagines un vecteur parrallèle à l'axe des X, fais une rotation de ce vecteur autour de l'axe des Y pour qu'il devienne parrallèle à l'axe des Z. Alors une rotation autour de l'axe des Z n'a plus d'effet, tu viens de perdre un degré de liberté (plus que 2 axes de rotations qui fonctionne) : c'est le gimbal lock.

Ah ok ! J'ai compris :).
Le problème c'est que le programmeur quand il a un problème de gimbal lock c'est qu'à un moment il a cru tourner par rapport à un axe local de l'objet alors qu'en fait il a tourné a partir d'un axe du repère global... Et donc parfois on arrive ce problème, parce que le programmeur a eu une confusion dans sa tête.
C'est ça ? :)