Quaternions et rotation dans l'espace

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher

Les quaternions unitaires fournissent une notation mathématique commode pour représenter l'orientation et la rotation d'objets en trois dimensions. Comparés aux angles d'Euler, ils sont plus simple à composer et évitent le problème du blocage de cardan. Comparés aux matrices de rotations, ils sont plus stables numériquement et peuvent se révéler plus efficaces. Les quaternions ont été adoptés dans des applications en infographie, robotique, navigation, dynamique moléculaire et la mécanique spatiale des satellites[1].

Opérations de rotation à l'aide des quaternions[modifier | modifier le code]

Une explication très stricte des propriétés utilisées dans cette section est donnée par Altmann[2].

L'hypersphère des rotations[modifier | modifier le code]

Se faire une idée de l'espace des rotations[modifier | modifier le code]

Les quaternions unitaires représentent l'espace mathématique des rotations en trois dimensions de façon relativement simple. On peut comprendre la correspondance entre les rotations et les quaternions en commençant d'abord par se faire une idée intuitive de l'espace des rotations lui-même.

Deux rotations d'angles différents et d'axes différents dans l'espace des rotations. La norme du vecteur est liée à l'amplitude de la rotation.

Chaque rotation en trois dimensions consiste à tourner d'un certain angle autour d'un certain axe. Quand l'angle est nul, l'axe n'a pas d'importance, de telle façon qu'une rotation de zéro degré est un simple point dans l'espace des rotations (c'est la rotation identité). Pour un angle petit mais non-nul, l'ensemble des rotations possibles est une petite sphère entourant la rotation identité, où chaque point de la sphère représente un axe pointant dans une direction particulière (comparez avec la sphère céleste). Des rotations d'angles de plus en plus grands s'éloignent progressivement de la rotation identité, et nous pouvons nous les représenter comme des sphères concentriques de rayons croissants. Par conséquent, au voisinage de la rotation identité, l'espace abstrait des rotations ressemble à l'espace ordinaire en trois dimensions (qui peut également être vu comme un point central entouré de sphères de différents rayons. La ressemblance s'arrête là : lorsque l'angle de rotation dépasse 180°, les rotations suivant les différents axes cessent de diverger et commencent à nouveau à se ressembler, pour finir par devenir identiques (et égales à la rotation identité) lorsque l'angle atteint 360°.

L'hypersphère des rotations pour les rotations d'axes horizontaux (axes compris dans le plan xy).

On constate un phénomène analogue à la surface d'une sphère. Si nous nous plaçons au pôle Nord et traçons à partir de là des lignes droites (en fait, des méridiens) dans plusieurs directions, elles divergeront puis convergeront à nouveau au pôle Sud. Des cercles concentriques de rayon croissant dessinés autour du pôle Nord (des parallèles) finiront par s'effondrer en un point au pôle Sud une fois que l'on a parcouru la distance entre les pôles. On peut assimiler les différentes directions à partir du pôle (c'est-à-dire les différents méridiens) aux différents axes de rotations et les différentes distances au pôle Nord aux différents angles : on a ainsi une analogie de l'espace des rotations. Mais la surface de la sphère est en deux dimensions alors que les axes de rotation utilisent déjà trois dimensions. L'espace des rotations est donc modélisé par une sphère de dimension 3 dans un espace à 4 dimensions (une hypersphère). Nous pouvons penser à la sphère ordinaire comme à une section de l'hypersphère, de la même façon qu'un cercle est une section de sphère. On peut prendre la section pour représenter, par exemple, uniquement les rotations d'axes dans le plan xy (voir illustration ci-contre). On remarque que l'angle de la rotation est deux fois la différence de latitude avec le pôle Nord : en effet, les points de l'équateur représentent des rotations de 180°, pas de 90°, et le pôle Sud représente la rotation identité de 360°, et pas le demi-tour de 180°.

Le pôle Nord et le pôle Sud représentent la même rotation, et en fait cela s'applique à n'importe quelle paire de points aux antipodes l'un de l'autre : si un point correspond à une rotation d'angle \alpha autour de l'axe dirigé par le vecteur \vec{v}, l'autre point correspond à une rotation d'angle 360^\circ - \alpha autour de l'axe dirigé par le vecteur - \vec{v}. En fait, l'espace des rotations n'est pas l'hypersphère elle-même, mais l'hypersphère où l'on identifie les points aux antipodes l'un de l'autre. Mais dans un but de simplification, nous pouvons penser aux rotations comme à des points de la sphère en dimension 4, même si la moitié de ces points est redondante (revêtement double).

Paramétrer l'espace des rotations[modifier | modifier le code]

Nous pouvons paramétrer la surface d'une sphère à l'aide de deux coordonnées, comme la latitude et la longitude. Mais la latitude et la longitude se comportent mal (sont dégénérés) aux pôles Nord et Sud, alors que les pôles ne sont pas différents par nature des autres points de la sphère. Aux pôles Nord et Sud (de latitudes +90° et -90°), la longitude perd son sens.

On peut montrer qu'aucun système de coordonnées à deux paramètres ne peut éviter cette dégénérescence (c'est le théorème de la boule chevelue). Nous pouvons éviter de tels problèmes en plongeant la sphère dans l'espace à trois dimensions et en la paramétrant au moyen de trois coordonnées cartésiennes (ici w, x et y), en plaçant le pôle Nord à (w, x, y) = (1, 0, 0), le pôle Sud à (w, x, y) = (−1, 0, 0) et l'équateur sera le cercle d'équations w = 0 et x2 + y2 = 1. Les points de la sphère satisfont la contrainte w2 + x2 + y2 = 1, donc nous avons toujours deux degrés de liberté, bien que l'on ait trois coordonnées. Un point (w, x, y) de la sphère représente une rotation de l'espace ordinaire autour de l'axe horizontal dirigé par le vecteur \vec{v}\begin{pmatrix}x\\y\\0\end{pmatrix} et d'angle \alpha= 2 \cos^{-1} w = 2 \sin^{-1} \sqrt{x^2 + y^2}.

De la même façon, l'hypersphère décrivant l'espace des rotations dans l'espace en trois dimensions peut être paramétrée au moyen de trois angles (angles d'Euler), mais tout paramétrage de ce type dégénère en certains points de l'hypersphère, ce qui conduit au problème du blocage de cardan. Nous pouvons éviter cela en utilisant quatre coordonnées euclidennes w, x, y et z, avec w2 + x2 + y2 + z2 = 1. Le point de coordonnées (w, x, y, z) représente une rotation autour de l'axe dirigé par le vecteur \vec{v}\begin{pmatrix}x\\y\\z\end{pmatrix} et d'angle \alpha = 2 \cos^{-1} w = 2 \sin^{-1} \sqrt{x^2+y^2+z^2}.

Des rotations aux quaternions[modifier | modifier le code]

Les quaternions en bref[modifier | modifier le code]

Article principal : Quaternion.

On peut définir les nombres complexes en introduisant un symbole abstrait i qui se conforme aux règles usuelles de l'algèbre et qui en plus obéit à la règle i2 = −1. Cela suffit à reproduire toutes les règles de calcul des nombres complexes, par exemple (a + b \mathbf{i}) (c + d \mathbf{i}) = a c + a d \mathbf{i} + b \mathbf{i} c + b \mathbf{i} d \mathbf{i} = a c + a d \mathbf{i} + b c \mathbf{i} + b d \mathbf{i}^2 = (a c - b d) + (b c + a d) \mathbf{i}.

De la même façon, les quaternions peuvent être définis en introduisant des symboles abstraits i, j et k qui satisfont aux règles i2 = j2 = k2 = ijk = −1 et les règles algébriques usuelles sauf la commutativité de la multiplication (un exemple familier de multiplication non commutative est la multiplication des matrices). L'ensemble des règles de calcul découle de ces définitions ; par exemple, on peut montrer que (a + b\mathbf{i} + c\mathbf{j} + d\mathbf{k}) (e + f\mathbf{i} + g\mathbf{j} + h\mathbf{k}) = (ae - bf - cg - dh) + (af + be + ch - dg) \mathbf{i} + (ag + ce + df - bh) \mathbf{j} + (ah + de + bg - cf) \mathbf{k}.

La partie imaginaire b\mathbf{i} + c\mathbf{j} + d\mathbf{k} d'un quaternion se comporte comme un vecteur \vec{v}\begin{pmatrix}b\\c\\d\end{pmatrix} d'un espace vectoriel à trois dimensions et la partie réelle a comme un scalaire de \mathbb{R}. Quand les quaternions sont utilisés en géométrie, il est pratique de les définir comme un scalaire plus un vecteur: a + b\mathbf{i} + c\mathbf{j} + d\mathbf{k} = a + \vec{v}.

Ceux qui ont étudié les vecteurs à un niveau élémentaire pourraient trouver étrange d'additionner un nombre à un vecteur, car ce sont des objets de natures très différentes, ou de multiplier deux vecteurs entre eux, car cette opération n'est d'habitude pas définie. Néanmoins, si l'on se souvient qu'il ne s'agit là que d'une notation pour les parties réelles et imaginaires d'un quaternion, cela devient plus légitime.

Nous pouvons exprimer la multiplication de quaternions dans le langage moderne du produit vectoriel et du produit scalaire de vecteurs (qui ont en fait été inspirés au début par les quaternions). À la place des règles i2 = j2 = k2 = ijk = −1, nous avons la règle de multiplication de deux vecteurs \vec{v} \vec{w} = \vec{v} \wedge \vec{w} - \vec{v} \cdot \vec{w}, où :

  • \vec{v} \vec{w} est la multiplication de vecteurs,
  • \vec{v} \wedge \vec{w} est le produit vectoriel (un vecteur),
  • \vec{v} \cdot \vec{w} est le produit scalaire (un nombre).

La multiplication de vecteurs n'est pas commutative (à cause du produit vectoriel), alors que la multiplication entre scalaires et entre un scalaire et un vecteur sont commutatives. Il découle de manière immédiate de ces règles que (s + \vec{v}) (t + \vec{w}) = (s t - \vec{v} \cdot \vec{w}) + (s \vec{w} + t \vec{v} + \vec{v} \wedge \vec{w}).

L'inverse (à gauche et à droite) d'un quaternion non nul est (s + \vec{v})^{-1} = \frac{s - \vec{v}}{s^2 + |\vec{v}|^2}, comme cela peut être vérifié par calcul direct.

Relation entre les rotations et les quaternions unitaires[modifier | modifier le code]

Soient (w, x, y, z) les coordonnées d'une rotation, comme décrit précédemment. Définissons le quaternion : q = w + x\mathbf{i} + y\mathbf{j} + z\mathbf{k} = w + \vec{u}\begin{pmatrix}x\\y\\z\end{pmatrix} = \cos (\alpha/2) + \vec{u} \sin (\alpha/2)\vec{u} est un vecteur unitaire. Soit également \vec{v} un vecteur ordinaire de l'espace en 3 dimensions, considéré comme un quaternion avec une coordonnée réelle nulle. On peut alors montrer (voir section suivante) que le produit de quaternions

q \vec{v} q^{-1}

renvoie le vecteur \vec{v} tourné d'un angle \alpha autour de l'axe dirigé par \vec{u}. La rotation se fait dans le sens des aiguilles d'une montre si notre ligne de vue pointe dans la même direction que \vec{u}. Cette opération est connue comme la conjugaison par q.

Il s'ensuit que la multiplication de quaternions correspond à la composition de rotations, car si p et q sont des quaternions représentant des rotations, alors la rotation (conjugaison) par pq est

p q \vec{v} (p q)^{-1} = p q \vec{v} q^{-1} p^{-1} = p (q \vec{v} q^{-1}) p^{-1},

ce qui revient à tourner (conjuguer) par q, puis par p.

Le quaternion inverse d'une rotation correspond à la rotation inverse, car q^{-1} (q \vec{v} q^{-1}) q = \vec{v}. Le carré d'un quaternion correspond à la rotation de deux fois le même angle autour du même axe. Plus généralement, qn correspond à une rotation de n fois l'angle autour du même axe que q. Cela peut être étendu à un réel arbitraire n, ce qui permet de calculer des rotations intermédiaires de façon fluide entre des rotations de l'espace, c'est l'interpolation linéaire sphérique (en)).

Démonstration de l'équivalence entre conjugaison de quaternions et rotation de l'espace[modifier | modifier le code]

Soit \vec{u} un vecteur unitaire (l'axe de rotation) et soit q = \cos \frac{\alpha}{2} + \vec{u} \sin \frac{\alpha}{2}. Notre but est de montrer que

\vec{v'} = q \vec{v} q^{-1} = \left( \cos \frac{\alpha}{2} + \vec{u} \sin \frac{\alpha}{2} \right) \, \vec{v} \, \left( \cos \frac{\alpha}{2} - \vec{u} \sin \frac{\alpha}{2} \right)

renvoie le vecteur \vec{v} tourné d'un angle \alpha autour de l'axe dirigé par \vec{u}. En développant, on obtient

\begin{array}{lll}
\vec{v'} &=& \vec{v} \cos^2 \frac{\alpha}{2} + (\vec{u}\vec{v} - \vec{v}\vec{u}) \sin \frac{\alpha}{2} \cos \frac{\alpha}{2} - \vec{u}\vec{v}\vec{u} \sin^2 \frac{\alpha}{2} \\
&=& \vec{v} \cos^2 \frac{\alpha}{2} + 2 (\vec{u} \wedge \vec{v}) \sin \frac{\alpha}{2} \cos \frac{\alpha}{2} - (\vec{v} (\vec{u} \cdot \vec{u}) - 2 \vec{u} (\vec{u} \cdot \vec{v})) \sin^2 \frac{\alpha}{2} \\
&=& \vec{v} (\cos^2 \frac{\alpha}{2} - \sin^2 \frac{\alpha}{2}) + (\vec{u} \wedge \vec{v}) (2 \sin \frac{\alpha}{2} \cos \frac{\alpha}{2}) + \vec{u} (\vec{u} \cdot \vec{v}) (2 \sin^2 \frac{\alpha}{2}) \\
&=& \vec{v} \cos \alpha + (\vec{u} \wedge \vec{v}) \sin \alpha + \vec{u} (\vec{u} \cdot \vec{v}) (1 - \cos \alpha) \\
&=& (\vec{v} - \vec{u} (\vec{u} \cdot \vec{v})) \cos \alpha + (\vec{u} \wedge \vec{v}) \sin \alpha + \vec{u} (\vec{u} \cdot \vec{v}) \\
&=& \vec{v}_{\bot} \cos \alpha + (\vec{u} \wedge \vec{v}_{\bot}) \sin \alpha + \vec{v}_{\|}
\end{array}

\vec{v}_{\bot} et \vec{v}_{\|} sont les composantes de \vec{v} respectivement orthogonale et colinéaire à \vec{u}. C'est là la formule de Olinde Rodrigues qui donne la rotation d'angle \alpha autour de l'axe dirigé par \vec{u}.

Exemple[modifier | modifier le code]

Une rotation de 120° autour de la première diagonale pemute i, j et k circulairement.

Considérons la rotation f autour de l'axe dirigé par \vec{v} = \mathbf{i} + \mathbf{j} + \mathbf{k} et d'angle 120°, c'est-à-dire /3 radians.

\alpha = \frac{2 \pi}{3}

La norme de \vec{v} est √3, le demi-angle est π/3 (60°), le cosinus de ce demi-angle est 1/2, (cos 60° = 0,5) et son sinus est √3/2, (sin 60° ≈ 0,866). Nous devons donc conjuguer avec le quaternion unitaire :

\begin{array}{lll}
u
&=& \cos\frac{\alpha}{2} + \sin\frac{\alpha}{2}\cdot \frac{1}{\| \vec{v} \| }\vec{v}\\
&=& \cos \frac{\pi}{3} + \sin \frac{\pi}{3}\cdot \frac{1}{\sqrt{3}}\vec{v}\\
&=& \frac{1}{2} + \frac{\sqrt{3}}{2}\cdot \frac{1}{\sqrt{3}}\vec{v}\\
&=& \frac{1}{2} + \frac{\sqrt{3}}{2}\cdot \frac{\mathbf{i} + \mathbf{j} + \mathbf{k}}{\sqrt{3}}\\
&=& \frac{1 + \mathbf{i} + \mathbf{j} + \mathbf{k}}{2}
\end{array}

Si f est la fonction de rotation,

f(a\mathbf{i} + b\mathbf{j} + c\mathbf{k}) = u (a\mathbf{i} + b\mathbf{j} + c\mathbf{k}) u^{-1}

On peut prouver que l'on obtient l'inverse d'un quaternion unitaire simplement en changeant le signe de ses coordonnées imaginaires. En conséquence,

u^{-1} = \frac{1- \mathbf{i} - \mathbf{j} - \mathbf{k}}{2}

et

f(a\mathbf{i} + b\mathbf{j} + c\mathbf{k}) = \frac{1 + \mathbf{i} + \mathbf{j} + \mathbf{k}}{2} (a\mathbf{i} + b\mathbf{j} + c\mathbf{k}) \frac{1 - \mathbf{i} - \mathbf{j} - \mathbf{k}}{2}

En appliquant les règles ordinaires de calcul avec les quaternions, on obtient

f(a\mathbf{i} + b\mathbf{j} + c\mathbf{k}) = c\mathbf{i} + a\mathbf{j} + b\mathbf{k}

Comme on s'y attendait, la rotation revient à tenir un cube par un de ses sommets, puis à le faire tourner de 120° selon la diagonale la plus longue qui passe par ce point. On observe comment les trois axes subissent une permutation circulaire.

Expliquer les propriétés des quaternions à l'aide des rotations[modifier | modifier le code]

Non-commutativité[modifier | modifier le code]

La multiplication des quaternions est non commutative. Comme multiplier des quaternions unitaires revient à composer les rotations dans l'espace à trois dimensions, on peut rendre cette propriété intuitive grâce au fait que les rotations en trois dimensions ne commutent pas en général.

Un simple exercice consistant à appliquer deux rotations successives à un objet asymétrique (par exemple un livre) peut l'expliquer. D'abord, tournez un livre de 90 degrés dans le sens des aiguilles d'une montre autour de l'axe des Z. Ensuite, basculez-le de 180 degrés autour de l'axe des X et mémorisez le résultat. Revenez à la position de départ, de manière à pouvoir lire à nouveau le titre du livre, et appliquez les rotations en ordre inverse. Comparez le résultat au résultat précédent. Cela montre que, en général, la composition de deux rotations différentes autour de deux axes distincts de l'espace ne commute pas.

Les quaternions sont-ils orientés ?[modifier | modifier le code]

Il convient de remarquer que les quaternions, comme n'importe quelle rotation ou application linéaire, ne sont pas "orientés" (il n'y a pas de sens direct ou indirect). L'orientation d'un système de coordonnées provient de l'interprétation des nombres dans l'espace physique. Quelle que soit la convention d'orientation que l'on choisisse, faire tourner le vecteur X de 90 degrés autour du vecteur Z renverra le vecteur Y — la théorie et les calculs donnent le même résultat.

Les quaternions et les autres représentations des rotations[modifier | modifier le code]

Description qualitative des avantages des quaternions[modifier | modifier le code]

La représentation d'une rotation sous la forme d'un quaternion (4 nombres) est plus compacte que la représentation en tant que matrice orthogonale (9 nombres). De plus, pour un axe et un angle donné, on peut facilement construire le quaternion correspondant, et réciproquement, pour un quaternion donné, on peut facilement extraire l'axe et l'angle. Toutes ces opérations sont beaucoup plus difficiles avec des matrices ou des angles d'Euler.

Dans les jeux vidéo et dans d'autres applications, on a souvent besoin de « rotations fluides », c'est-à-dire que la scène représentée doit tourner harmonieusement et pas d'un seul coup. On peut obtenir ce résultat en choisissant une courbe comme celle de l'interpolation linéaire sphérique dans l'espace des quaternions, avec une extrémité qui est la transformation identique 1 (ou correspondant à une autre rotation initiale) et l'autre extrémité correspondant à la rotation finale désirée. C'est plus difficile à faire avec d'autres représentations des rotations.

Quand on compose plusieurs rotations sur un ordinateur, les erreurs d'arrondi s'accumulent forcément. Un quaternion qui est légèrement erroné représente toujours une rotation après avoir été renormalisé ; une matrice qui est légèrement erronée ne sera plus orthogonale et sera difficile à convertir à nouveau en une matrice orthogonale qui convienne.

Les quaternions évitent également un phénomène appelé le blocage de cardan qui peut apparaître lorsque, par exemple dans des systèmes de rotations décrivant le roulis, le tangage et le lacet, le tangage est de 90° vers le haut ou le bas, de telle façon que le roulis et le lacet correspondent au même mouvement, et qu'un degré de liberté ait été perdu. Dans un système de navigation inertielle à base de cardans, par exemple, cela peut avoir des conséquences désastreuses si l'avion monte en flèche ou descend à pic.

Conversion vers et depuis la représentation sous forme de matrice[modifier | modifier le code]

D'un quaternion en matrice orthogonale[modifier | modifier le code]

La matrice orthogonale correspondant à une rotation au moyen du quaternion unitaire z = a+bi+cj+dk (avec |z| = 1) est donnée par

\begin{pmatrix}
a^2+b^2-c^2-d^2&2bc-2ad        &2ac+2bd        \\
2ad+2bc        &a^2-b^2+c^2-d^2&2cd-2ab        \\
2bd-2ac        &2ab+2cd        &a^2-b^2-c^2+d^2\\
\end{pmatrix}.

D'une matrice orthogonale en quaternion[modifier | modifier le code]

Chercher le quaternion (q_0 + q_xi + q_yj + q_zk) correspondant à la matrice de rotation Q_{ij} peut être instable numériquement si la trace (la somme des éléments de la diagonale de la matrice) de la matrice de rotation est nulle ou très petite. Une méthode robuste consiste à choisir l'élément de la diagonale ayant la valeur Q_{uu} la plus grande en valeur absolue. Considérons

r=\pm \frac{1}{2}\sqrt{1+Q_{uu}+Q_{vv}+Q_{ww}}

Cette écriture est légitime car l'expression sous la racine est positive. Si r est nul, la matrice est la matrice identité donc le quaternion est le quaternion identité (1 ,0 ,0 ,0). Sinon le quaternion peut alors être écrit sous la forme [3]:

q_0 = r
q_u = \frac{1}{4}(Q_{wv}-Q_{vw})
q_v = \frac{1}{4}(Q_{uw}-Q_{wu})
q_w = \frac{1}{4}(Q_{vu}-Q_{uv})

Attention, il y a deux conventions pour les vecteurs : l'une suppose que les matrices de rotation sont multipliées par des vecteurs-ligne à gauche, l'autre par des vecteurs-colonne à droite ; les deux conventions conduisent à des matrices qui sont transposées l'une de l'autre. La matrice ci-dessus suppose que l'on utilise des vecteurs colonne à droite. Historiquement, la convention vecteur-colonne-à-droite provient des mathématiques et de la mécanique classique, alors que la convention vecteur-ligne-à-gauche provient de l'infographie, où il était plus facile de saisir des vecteurs-lignes aux débuts de la discipline.


Quaternions optimaux[modifier | modifier le code]

La section ci-dessus a décrit comment récupérer un quaternion q à partir d'une matrice de rotation 3 × 3 Q. Supposons, néanmoins, que nous avons une matrice Q qui n'est pas celle d'une rotation pure, à cause d'erreurs d'arrondi, par exemple, et que nous souhaitions trouver le quaternion q qui représente Q le plus précisément possible. Dans ce cas, nous construisons une matrice 4 × 4 symétrique

 K = \frac13
 \begin{bmatrix}
  Q_{xx}-Q_{yy}-Q_{zz} & Q_{yx}+Q_{xy} & Q_{zx}+Q_{xz} & Q_{yz}-Q_{zy} \\
  Q_{yx}+Q_{xy} & Q_{yy}-Q_{xx}-Q_{zz} & Q_{zy}+Q_{yz} & Q_{zx}-Q_{xz} \\
  Q_{zx}+Q_{xz} & Q_{zy}+Q_{yz} & Q_{zz}-Q_{xx}-Q_{yy} & Q_{xy}-Q_{yx} \\
  Q_{yz}-Q_{zy} & Q_{zx}-Q_{xz} & Q_{xy}-Q_{yx} & Q_{xx}+Q_{yy}+Q_{zz}
 \end{bmatrix}

et nous cherchons le vecteur propre de coordonnées (x, y, z, w) correspondant à la plus grande valeur propre (cette valeur vaut 1 si et seulement si Q est une rotation pure). Le quaternion ainsi obtenu correspondra à la rotation la plus proche de la matrice Q de départ[4].

Comparaisons de performances avec d'autres méthodes de rotation[modifier | modifier le code]

Cette section traite des implications en termes de performances de l'utilisation de quaternions par rapport à d'autres méthodes (axe et angle ou matrices de rotation) pour effectuer des rotations en 3D.

Résultats[modifier | modifier le code]

Espace mémoire nécessaire
Méthode Mémoire
Matrice de rotation 9
Quaternion 4
Axe et angle 4*

* Note : la représentation sous forme d'angle et d'axe peut être stockée dans 3 emplacements seulement en multipliant l'axe de rotation par l'angle de rotation ; néanmoins, avant de l'utiliser, il faut récupérer le vecteur unitaire et l'angle en renormalisant, ce qui coûte des opérations mathématiques supplémentaires.

Comparaison de performances de la composition de rotations
Méthode Multiplications Additions et soustractions Nombre total d'opérations
Matrices de rotation 27 18 45
Quaternions 16 12 28
Comparaison de performances de la rotation de vecteurs
Méthode Multiplications Additions et soustractions sin et cos Nombre total d'opérations
Matrice de rotation 9 6 0 15
Quaternions 21 18 0 39
Axe et angle 23 16 2 41

Méthodes utilisées[modifier | modifier le code]

Il y a trois techniques de base pour faire tourner un vecteur \vec{v} :

  1. Calculer le produit matriciel de la matrice de rotation 3 × 3 représentant la rotation R par la matrice colonne 3 × 1 représentant le vecteur \vec{v}. Cela nécessite 3 x (3 multiplications + 2 additions) = 9 multiplications at 6 additions, c'est la méthode la plus efficace pour faire tourner un vecteur.
  2. Utiliser la formule de rotation avec des quaternions dite action par conjugaison \vec{v}_\text{new}= z \vec{v} z^{-1}. Calculer ce résultat revient à transformer le quaternion en une matrice de rotation R en utilisant la formule de conversion d'un quaternion en matrice orthogonale, puis à multiplier le résultat par la matrice-colonne représentant le vecteur. En procédant à une recherche de sous-expressions communes, l'algorithme se ramène à 21 multiplications et 18 additions. Une autre approche peut consister à convertir d'abord le quaternion dans la représentation sous forme d'axe et d'angle équivalente, puis à s'en servir pour faire tourner le vecteur. Néanmoins, c'est à la fois moins efficace et moins stable numériquement lorsque le quaternion est voisin de la rotation identité.
  3. Convertir la représentation sous forme d'axe et d'angle en matrice de rotation R, puis multiplier par la matrice-colonne représentant le vecteur. La conversion coûte 14 multiplications, 2 appels de fonction (sin et cos) et 10 additions ou soustractions après recherche de sous-expressions communes, puis la rotation ajoute 9 multiplications et 6 additions pour un total de 23 multiplications, 16 additions ou soustractions et deux appels de fonctions trigonométriques.

Pseudo-code pour la rotation à l'aide de quaternions

Étant donné un quaternion z = a + bi + cj + dk (avec |z| = 1) et un vecteur \vec{v} de coordonnées v1, v2 et v3, le code qui suit effectue une rotation. Notez l'utilisation de variables temporaires txx. Notez aussi l'optimisation des éléments de la diagonale de la matrice R : comme a^2 + b^2 + c^2 + d^2 = 1, on réécrit l'élément en haut à gauche sous la forme a^2 + b^2 + c^2 + d^2 - 2c^2 - 2d^2 = 1 - 2c^2 - 2d^2 ; les deux autres éléments de la diagonale peuvent être réécrits de même.

t2 =   a*b
t3 =   a*c
t4 =   a*d
t5 =  -b*b
t6 =   b*c
t7 =   b*d
t8 =  -c*c
t9 =   c*d
t10 = -d*d
v1new = 2*( (t8 + t10)*v1 + (t6 -  t4)*v2 + (t3 + t7)*v3 ) + v1
v2new = 2*( (t4 +  t6)*v1 + (t5 + t10)*v2 + (t9 - t2)*v3 ) + v2
v3new = 2*( (t7 -  t3)*v1 + (t2 +  t9)*v2 + (t5 + t8)*v3 ) + v3

Pseudo-code pour créer une matrice angle et axe

Étant donné un vecteur unitaire de coordonnées (v1, v2, v3) et un angle θ, la matrice de rotation peut être calculée avec :

t1 =  cos(theta)
t2 =  1 - t1
t3 =  v1*v1
t6 =  t2*v1
t7 =  t6*v2
t8 =  sin(theta)
t9 =  t8*v3
t11 = t6*v3
t12 = t8*v2
t15 = v2*v2
t19 = t2*v2*v3
t20 = t8*v1
t24 = v3*v3
R[1, 1] = t1 + t2*t3
R[1, 2] = t7 - t9
R[1, 3] = t11 + t12
R[2, 1] = t7 + t9
R[2, 2] = t1 + t2*t15
R[2, 3] = t19 - t20
R[3, 1] = t11 - t12
R[3, 2] = t19 + t20
R[3, 3] = t1 + t2*t24

Les paires de quaternions unitaires comme rotations dans l'espace à 4 dimensions[modifier | modifier le code]

Une paire de quaternions unitaires zl et zr peut représenter n'importe quelle rotation de l'espace en quatre dimensions. Étant donné un vecteur \vec{v} en quatre dimensions, considéré comme un quaternion, nous pouvons faire tourner \vec{v} ainsi :

f(v) = z_l v z_r =
\begin{pmatrix}
a_l&-b_l&-c_l&-d_l\\
b_l&a_l&-d_l&c_l\\
c_l&d_l&a_l&-b_l\\
d_l&-c_l&b_l&a_l
\end{pmatrix}\begin{pmatrix}
a_r&-b_r&-c_r&-d_r\\
b_r&a_r&d_r&-c_r\\
c_r&-d_r&a_r&b_r\\
d_r&c_r&-b_r&a_r
\end{pmatrix}\begin{pmatrix}
w\\x\\y\\z
\end{pmatrix}

Les deux matrices vérifient M \, \!^t M  = I : chacune de ces deux matrices (et donc également la combinaison des deux) représente une rotation. On remarquera que comme (z_{l} \vec{v}) z_{r} = z_{l} (\vec{v} z_{r}), les deux matrices doivent commuter. Par conséquent, il y a deux sous-groupes commutant de l'ensemble des rotations de l'espace en quatre dimensions. Il y a six degrés de liberté pour une rotation quelconque de l'espace à 4 dimensions, chacune de ces deux matrices représente 3 de ces 6 degrés de liberté.

De la même façon qu'une rotation en quatre dimensions infinitésimale peut être représentée comme suit, par une paire de quaternions, on peut représenter toutes les rotations de l'espace en 4 dimensions.

z_l \vec{v} z_r = \begin{pmatrix}
1      &-dt_{ab}&-dt_{ac}&-dt_{ad}\\
dt_{ab}&1       &-dt_{bc}&-dt_{bd}\\
dt_{ac}& dt_{bc}&1       &-dt_{cd}\\
dt_{ad}& dt_{bd}& dt_{cd}&1
\end{pmatrix}\begin{pmatrix}
w\\
x\\
y\\
z
\end{pmatrix}

z_l=
1+{dt_{ab}+dt_{cd}\over 2}i+{dt_{ac}-dt_{bd}\over 2}j+{dt_{ad}+dt_{bc}\over 2}k

z_r=
1+{dt_{ab}-dt_{cd}\over 2}i+{dt_{ac}+dt_{bd}\over 2}j+{dt_{ad}-dt_{bc}\over 2}k

Voir aussi[modifier | modifier le code]

Références[modifier | modifier le code]

  1. (en) Kuipers, Jack B., Quaternions and rotation Sequences: a Primer with Applications to Orbits, Aerospace, and Virtual Reality, Princeton University Press, 1999.
  2. (en) Altmann, Simon L., Rotations, Quaternions, and Double Groups, Dover Publications, 1986 (voir en particulier le ch. 12).
  3. (en) J. Vince, Quaternions for Computer Graphics,‎ 2011 (lire en ligne)
  4. (en) Itzhack Y. Bar-Itzhack, New method for extracting the quaternion from a rotation matrix, vol. 23,‎ 11-12 2000, 3 p. (ISSN 0731-5090)

Liens externes et ressources[modifier | modifier le code]