|
| Quaternions et développement 3D (généralités) | |

| | |
Tout d'abord, sachez qu'il n'est pas nécessaire de bien comprendre les quaternions eux-mêmes pour comprendre leurs utilisations en 3D. Mais nous allons quand même nous intéresser à leur nature pour avoir une vue d'ensemble assez complète.
La théorie des quaternions fut découverte en 1843 par William Rowan Hamilton (1805-1865), qui avait déjà développé celle des nombres complexes. Si vous connaissez les nombres complexes, vous comprendrez facilement ce qu'est un quaternion. En effet ...
Un nombre complexe s'écrit :- C = a + i.b
(où ‘a’ et ‘b’ sont des nombres réels et ‘i’ est tel que i² = -1).
Un quaternion s'écrit :- Q = a + i.b + j.c + k.d
Où ‘a’, ‘b’, ‘c’ et ‘d’ sont des réels et où ‘i’, ‘j’ et ‘k’ ont les propriétés suivantes :- i*i = j*j = k*k = -1
- i*j = -j*i = k
- j*k = -k*j = i
- k*i = -i*k = j
Tout comme pour les nombres complexes, on peut définir un certain nombre d'opérations sur les quaternions dont :
L'addition : - Q0 + Q1 = (a0+a1) + (b0+b1)i + (c0+c1)j + (d0+d1)k
La multiplication :- Q0.Q1 =
- (a0 + i.b0 + j.c0 + k.d0).( a1 + i.b1 + j.c1 + k.d1)
- = (a0.a1 - b0.b1 - c0.c1 - d0.d1)
- + (a0.b1 + b0.a1 + c0.d1 - d0.c1 ).i
- + (a0.c1 - b0.d1 + c0.a1 + d0.b1 ).j
- + (a0.d1 + b0.c1 - c0.b1 + d0.a1 ).k
Bien que l'étude des quaternions soit particulièrement passionnante, l'énoncé de l'ensemble de leurs propriétés dépasse le cadre de ce mini-article. Retenons simplement celles-ci : - Le conjugué d'un quaternion Q( a, b, c, d ) est : Q = a - i.b - j.c - k.d
- La norme d'un quaternion Q(a, b, c, d) vaut:
Lorsque la norme d'un quaternion vaut 1 on dit que le quaternion est normalisé. C'est cette catégorie de quaternions qui va nous intéresser pour la 3D. |

| | |
Après cette introduction un peu formelle, voyons comment les quaternions sont perçus en 3D. C'est donc les quaternions normalisés qui nous intéressent. Tout quaternion normalisé peut être associé à une rotation vectorielle 3D : Une rotation vectorielle est une rotation autour d'une droite qui passe par l'origine. En effet, il faut 3 valeurs pour la direction de l'axe et 1 pour l'angle de la rotation. Soit 4 valeurs, ça tombe plutôt bien ;).
Si la rotation est autour d'un axe orienté selon le vecteur V de coordonnées (x,y,z) (le vecteur étant normalisé) et d'angle a, le quaternion associé vaut :- Q = cos(a/2) + i.x.sin(a/2) + j.y.sin(a/2) + k.z.sin(a/2).
La démonstration de cette formule est trop longue pour être décrite ici et dépasse le cadre de ce mini-article. Il est à noter que la rotation d'axe orienté selon -V et d'angle -a possède la même représentation : - Q’ = cos(-a/2) + i.(-x).sin(-a/2) + j.(-y).sin(-a/2) + k.(-z).sin(-a/2)
- = cos(a/2) + i.(-x).(-sin(a/2)) + j.(-y).(-sin(a/2)) + k.(-z).(-sin(a/2))
- = cos(a/2) + i.x.sin(a/2) + j.y.sin(a/2) + k.z.sin(a/2)
- = Q
Ce qui est normal puisque les rotations sont équivalentes, mais on constate quand même que cette transformation n'est pas bijective.
Un quaternion permet de représenter une rotation autour d'une droite |

| | |
Considérons un objet 3D : modifier son orientation revient à faire pivoter l'objet autour d'un ou plusieurs axes. Or la composée de 2 rotations passant par le même point (dans notre cas l'origine) est une rotation passant par ce point. Donc, quelque soit l'orientation d'un objet dans l'espace, on peut décrire cette orientation par une rotation (celle qui résulte de la composition des rotations précédemment appliquées). On peut donc utiliser les quaternions pour représenter les orientations des objets dans l'espace.
Un quaternion permet de représenter l'orientation d'un objet Si l'on souhaite modifier l'orientation de cet objet, il suffit de construire le quaternion associé à la rotation souhaitée puis de l'appliquer : - L'orientation de l'objet est représentée par : Q
- La rotation est représentée par : Qr
- L'orientation de l'objet après rotation est : Q’ = Qr.Q
Généralement, les orientations et les rotations dans l'espace sont représentées par des matrices 3x3. Comparons donc les quaternions et les matrices pour une opération de rotation. Pour multiplier 2 matrices, il faut 27 multiplications et 18 additions scalaires. Pour multiplier deux quaternions, il faut 16 multiplications et 12 additions scalaires.
Les quaternions sont plus rapides à multiplier que les matrices Le gain n'est pas négligeable, si en plus on considère que pour mémoriser un quaternion il faut seulement 4 valeurs contre les 9 de la matrice.
Les quaternions prennent moins de place en mémoire |

| | |
Certains dirons : « Ok, tout cela est très bien mais les API 3D ne veulent que des matrices !». Heureusement, tout quaternion (normalisé) peut être converti en matrice et réciproquement.
Voici la formule pour convertir un quaternion en matrice : (Attention si vous travaillez en repère indirect, vous devrez transposer cette matrice)
Q = W + i.X + j.Y + k.Z  Exemple : Rotation d'un angle A autour de l'axe Z. Le quaternion vaut : - Q =
- cos(A/2) + i.sin(A/2).0 + j.sin(A/2).0 + k.sin(a/2).1 =
- cos(A/2) + k.sin(A/2)
Comme vous le remarquez i et j vallent 0 puisqu'ils représentent les axes X et Y qui eux ne subissent aucune rotation. Ce qui donne la matrice suivante en remplacant W par cos(A/2) et Z par sin(A/2) dans la matrtice présentée précédement :
En appliquant les formules de trigonométrie suivantes : - 1 - 2sin²(A/2) = cos(A)
- 2*sin(A/2)*cos(A/2) = sin(A)
on obtient la matrice de rotation autour de Z telle qu'elle est décrite dans le mini-article : A quoi servent les matrices dans un moteur 3D ? )
Evidemment, cela contrebalance un peu l'enthousiasme que peuvent soulever les quaternions. En effet, si dans votre moteur 3D vous avez des objets plutôt statiques, il vaut mieux, pour les représenter, mémoriser les matrices afin de ne pas faire la conversion à chaque génération d'image. Si par contre les objets sont très animés, le gain dans les calculs de composition peut largement compenser la perte due à la conversion. |

| | |
Dans le cas des objets animés, l'utilisation des quaternions est encore plus intéressante que ce que nous venons de voir. En effet, très souvent quand on souhaite animer des objets on a besoin d'interpolation. Pour les positions, les méthodes sont bien connues, mais pour les orientations ? Eh bien pour les orientations, les quaternions nous offrent une méthode très élégante, il s'agit de l'interpolation linéaire sphérique, connue sous le nom de SLERP (pour Spherical Linear intERPolation).
Les quaternions permettent d'interpoler les orientations Considérons un objet d'orientation Q, devant passer d'une orientation Q0 (à T=0) à une orientation Q1 (à T=1). Pour obtenir les positions intermédiaires, il suffit d'utiliser la formule suivante :- Pour T variant de 0 à 1 :
- Slerp( Q0, Q1, T ) = Q0*sin( (1-T).Omega )/sin(Omega) + Q1*sin( T.Omega ) /sin(Omega)
- Avec Cos( Omega ) = Q0.Q1 donc Omega = cos-1( Q0.Q1 )
Cette méthode est particulièrement utilisée par les moteurs pour l'interpolation de positions clefs (notamment pour les personnages) et pour la cinématique inverse. Il existe d'autres façons d'interpoler mais elles sont beaucoup moins utilisées. |

| | |
En 3D, on utilise essentiellement les matrices homogènes (c'est-à-dire 4x4) car elles permettent de représenter de manière homogène (c'est-à-dire en une seule notation mathématique) les transformations de l'espace. Ces transformations sont généralement des changements d'orientation et de position. Or, quand on travaille essentiellement sur les positions on préfère utiliser des vecteurs, plus faciles à manipuler et plus rapides à calculer. Les quaternions permettent de faire la même chose avec les orientations.
En 3D, les quaternions sont aux orientations ce que les vecteurs sont aux positions J'espère que ce mini-article aura permis de démystifier ces objets encore un peu exotiques que sont les quaternions et qu'il aura aider à mieux comprendre leur utilisation par les moteurs 3D. |

YOUM (analyseur syntaxique temps réel) | Nombre de définitions trouvées 26 Multi-dico par texte : actif - Multi-mots par définition : 4
|
|
|



 
|