retour à l'accueil dernière actualité articles interviews qcm dictionnaires bibliothèque forums inscription membre profile recherche sauvegardes contacts aides
entete 0titre de la page
menu du haut




Quaternions et développement 3D (généralités)
 Auteur : Patrice Arrighi Dernière révision : 18 Novembre 2005
Faire un commentaire :   0 message(s)








Introduction
   

Les moteurs 3D actuels utilisent de nombreux outils mathématiques pour augmenter leurs puissances et leurs performances. Il y a les vecteurs, les matrices (cf. mini-articles sur le sujet : A quoi servent les matrices dans un moteur 3D ? ) aujourd'hui découvrons un autre de ces composants essentiels : les quaternions.

Bonne lecture :)





Qu'est-ce qu'un quaternion ?
   

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.





Interprétation des quaternions en 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





Utilisation en 3D
   

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





Quaternion et matrice
   

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.





Principale application
   

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.





Conclusion
   

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






fonction
menu de droite
fin de menu

qcm du mois
Télescope spatial Hubble
fin qcm


Page générée en : 0.009 secondes
ligne
Technologies Onversity : Hydrogen 1.0 (moteur de base de données) - SE.EN 1.0 (moteur de recherche) - YOUM 2.0 (analyseur syntaxique temps réel)
Tous droits réservés à Jean-François MAQUINÉ
ligne