D'après un traducteur: il y a exactement 175 ans et 3 jours, les quaternions ont été inventés. En l'honneur de cette date ronde, j'ai décidé de ramasser du matériel qui explique ce concept dans un langage clair.Le concept de quaternion a été inventé par le mathématicien irlandais
Sir William Rowan Hamilton le lundi 16 octobre 1843 à Dublin, en Irlande. Hamilton et sa femme sont allés à
la Royal Irish Academy , et en traversant le
canal royal sur
le pont Broome , il a fait une découverte étonnante, qu'il a immédiatement grattée sur la pierre du pont.
i 2 = j 2 = k 2 = i j k = - 1
Une plaque commémorative sur le pont Broome sur le canal Royal en l'honneur de la découverte de la formule fondamentale de la multiplication des quaternions.Dans cet article, je vais essayer d'expliquer le concept de quaternions d'une manière facile à comprendre. Je vais vous expliquer comment vous pouvez visualiser un quaternion, et aussi parler des différentes opérations qui peuvent être effectuées avec des quaternions. De plus, je comparerai l'utilisation des matrices, des angles d'Euler et des quaternions, puis j'essaierai d'expliquer quand utiliser des quaternions au lieu des angles ou des matrices d'Euler, et quand vous n'en avez pas besoin.
Table des matières
- 1. Introduction
- 2. Nombres complexes
- 2.1. Addition et soustraction de nombres complexes
- 2.2. Multiplication d'un nombre complexe par une valeur scalaire
- 2.3. Le produit de nombres complexes
- 2.4. Le carré des nombres complexes
- 2.5. Conjuguer des nombres complexes
- 2.6. La valeur absolue du nombre complexe
- 2.7. Quotient de deux nombres complexes
- 3. Degrés je
- 4. Plan complexe
- 5. Quaternions
- 5.1. Quaternions en paire ordonnée
- 5.2. Addition et soustraction de quaternion
- 5.3. Produit Quaternion
- 5.4. Véritable Quaternion
- 5.5. Multiplication scalaire du quaternion
- 5.6. Quaternions purs
- 5.7. Forme de quaternion additif
- 5.8. Quaternion unique
- 5.9. Forme binaire quaternion
- 5.10. Quaternions conjugués
- 5.11. Taux de quaternion
- 5.12. Normalisation du Quaternion
- 5.13. Quaternion inversé
- 5.14. Produit scalaire Quaternion
- 6. Tours
- 7. Interpolation des quaternions
- 7.1. SLERP
- 7.1.1. Différence quaternion
- 7.1.2. Élever un quaternion à un pouvoir
- 7.1.3. Différence fractionnelle des quaternions
- 7.1.4. Facteurs à considérer
- 7.2. Effectif
- 8. Conclusion
- 9. Télécharger la démo
- 10. Références
Il n'est pas possible de comprendre pleinement les quaternions en 45 minutes.
Cet article a beaucoup de mathématiques, donc ce n'est pas pour les mauviettes.
Présentation
En infographie, les matrices sont utilisées pour décrire une position dans l'espace (déplacement), ainsi qu'une orientation dans l'espace (rotation). Vous pouvez également utiliser une matrice de transformation unique pour décrire l'échelle de l'objet. Cette matrice peut être considérée comme un «espace de base». Si nous multiplions un vecteur ou un point (ou même une autre matrice) par une matrice de transformations, alors nous «transformons» ce vecteur, un point ou une matrice en l'espace représenté par cette matrice.
Dans cet article, je ne parlerai pas en détail des matrices de transformation. Des détails sur les matrices de transformation peuvent être trouvés dans mon article
Matrices .
Dans cet article, je veux parler d'une autre façon de décrire l'orientation d'un objet (rotation) dans l'espace à l'aide de quaternions.
Nombres complexes
Afin de bien comprendre les quaternions, nous devons d'abord comprendre d'où ils viennent. Le principe du quaternion est basé sur le concept d'un système numérique complexe.
Parallèlement aux ensembles de nombres bien connus (
naturels ,
entiers ,
réels et
rationnels ), le système de nombres complexes ajoute un nouvel ensemble de nombres, appelés nombres imaginaires. Des nombres imaginaires ont été inventés pour résoudre certaines équations qui n'avaient pas de solutions, par exemple:
x 2 + 1 = 0
Pour résoudre cette expression, nous devons déclarer que
x 2 = - 1 , et cela, comme vous le savez, est impossible, car le carré de n'importe quel nombre (positif ou négatif) est toujours positif.
Les mathématiciens ne pouvaient pas accepter que l'expression n'ait pas de solution, donc un nouveau concept a été inventé - un
nombre imaginaire qui peut être utilisé pour résoudre de telles équations.
Le nombre imaginaire est le suivant:
i 2 = - 1
N'essayez pas de comprendre cette hypothèse, car il n'existe aucune raison logique à son existence. Nous devons juste accepter cela
je - c'est juste une certaine quantité dont le carré est
- 1 .
L'ensemble des nombres imaginaires peut être noté comme
m a t h b b I .
L'ensemble des nombres complexes (noté par
m a t h b b C Est la somme des nombres réels et imaginaires sous la forme suivante:
z=a+bi a,b in mathbbR, i2=−1
On peut également dire que tous les nombres réels sont complexes avec
b=0 , et tous les nombres imaginaires sont complexes avec
a=0 .
Addition et soustraction de nombres complexes
Les nombres complexes peuvent être ajoutés et soustraits en ajoutant et en soustrayant les parties réelles et imaginaires.
Ajout:
(a1+b1i)+(a2+b2i)=(a1+a2)+(b1+b2)i
Soustraction:
(a1+b1i)−(a2+b2i)=(a1−a2)+(b1−b2)i
Multiplication d'un nombre complexe par une valeur scalaire
Le nombre complexe est multiplié par un scalaire en multipliant chaque membre du nombre complexe par un scalaire:
lambda(a+bi)= lambdaa+ lambdabi
Le produit de nombres complexes
De plus, les nombres complexes peuvent également être multipliés en utilisant des règles algébriques ordinaires.
\ begin {array} {rcl} z_1 & = & (a_1 + b_1i) \\ z_2 & = & (a_2 + b_2i) \\ z_1z_2 & = & (a_1 + b_1i) (a_2 + b_2i) \\ & = & & a_1a_2 + a_1b_2i + b_1a_2i + b_1b_2i ^ 2 \\ & = & (a_1a_2-b_1b_2) + (a_1b_2 + b_1a_2) i \ end {array}
Le carré des nombres complexes
De plus, un nombre complexe peut être carré en le multipliant par lui-même:
\ begin {array} {rcl} z & = & (a + bi) \\ z ^ 2 & = & (a + bi) (a + bi) \\ & = & (a ^ 2-b ^ 2) + 2abi \ end {array}
Conjuguer des nombres complexes
La valeur conjuguée d'un nombre complexe est un nombre complexe avec un signe changé de la partie imaginaire, noté comme
barz ou comment
z∗ .
\ begin {array} {rcl} z & = & (a + bi) \\ z ^ * & = & (a-bi) \ end {array}
La multiplication d'un nombre complexe avec sa valeur conjuguée donne un résultat intéressant.
\ begin {array} {rcl} z & = & (a + bi) \\ z ^ * & = & (a-bi) \\ zz ^ * & = & (a + bi) (a-bi) \ \ & = & a ^ 2-abi + abi + b ^ 2 \\ & = & a ^ 2 + b ^ 2 \ end {array}
La valeur absolue du nombre complexe
Nous pouvons utiliser le
nombre conjugué d'un nombre complexe pour calculer la valeur absolue (ou la
norme ou la
magnitude ) d'un nombre complexe. La valeur absolue d'un nombre complexe est la racine carrée d'un nombre complexe multipliée par son
conjugué . Il est noté comme
|z| :
\ begin {array} {rcl} z & = & (a + bi) \\ | z | & = & \ sqrt {zz ^ *} \\ & = & \ sqrt {(a + bi) (a-bi)} \\ & = & \ sqrt {a ^ 2 + b ^ 2} \ end {array}
Quotient de deux nombres complexes
Pour calculer le quotient de deux nombres complexes, nous multiplions le numérateur et le dénominateur par le nombre conjugué du dénominateur.
\ begin {array} {rcl} z_1 & = & (a_1 + b_1i) \\ z_2 & = & (a_2 + b_2i) \\ \ cfrac {z_1} {z_2} & = & \ cfrac {a_1 + b_1i} { a_2 + b_2i} \\ & = & \ cfrac {(a_1 + b_1i) (a_2-b_2i)} {(a_2 + b_2i) (a_2-b_2i)} \\ & = & \ cfrac {a_1a_2-a_1b_2i + b_1a_2i-bi ^ 2} {a_2 ^ 2 + b_2 ^ 2} \\ & = & \ cfrac {a_1a_2 + b_1b_2} {a_2 ^ 2 + b_2 ^ 2} + \ cfrac {b_1a_2-a_1b_2} {a_2 ^ 2 + b_2 ^ 2} i \ end {array}
Diplômes i
Si nous affirmons que
i2=−1 alors il devrait y avoir la possibilité d'ériger
i et à d'autres degrés.
\ begin {array} {rrrrrrr} i ^ 0 & = & & & & & & & 1 \\ i ^ 1 & = & & & & & & i \\ i ^ 2 & = & & & & & & & -1 \\ i ^ 3 & = & ii ^ 2 & = & & & -i \\ i ^ 4 & = & i ^ {2} i ^ {2} & = & & & 1 \\ i ^ 5 & = & ii ^ 4 & = & & & i \\ i ^ 6 & = & ii ^ 5 & = & i ^ 2 & = & -1 \ end {array}
Si nous continuons à enregistrer cette série, nous notons un schéma
(1,i,−1,−i,1, points) .
Un schéma similaire apparaît avec une augmentation des degrés négatifs.
\ begin {array} {rcr} i ^ 0 & = & 1 \\ i ^ {- 1} & = & -i \\ i ^ {- 2} & = & -1 \\ i ^ {- 3} & = & i \\ i ^ {- 4} & = & 1 \\ i ^ {- 5} & = & -i \\ i ^ {- 6} & = & -1 \ end {array}
Vous avez peut-être déjà vu un tel modèle en mathématiques, mais sous la forme
(x,y,−x,−y,x, points) , qui est obtenu en tournant le point de 90 ° dans le sens antihoraire sur un plan cartésien bidimensionnel; ligne
(x,−y,−x,y,x, points) créé en tournant le point à 90 ° sur un plan cartésien bidimensionnel.
Plan cartésienAvion complexe
Nous pouvons également appliquer des nombres complexes à une grille à deux dimensions, appelée le
plan complexe , reliant la partie
réelle à l'axe horizontal et l'
imaginaire à la verticale.
Avion complexeComme vous pouvez le voir sur la ligne précédente, nous pouvons dire que si nous multiplions le nombre complexe par
i , alors nous pouvons faire pivoter le nombre complexe sur le plan complexe par incréments de 90 °.
Vérifions si c'est vrai. Nous prenons un point arbitraire sur le plan complexe
p :
p=2+i
et multipliez-le par
i avoir reçu
q :
\ begin {array} {rcl} p & = & 2 + i \\ q & = & pi \\ & = & (2 + i) i \\ & = & 2i + i ^ 2 \\ & = & - 1 + 2i \ end {array}
Multiplier
q sur
i nous obtenons
r :
\ begin {array} {rcl} q & = & -1 + 2i \\ r & = & qi \\ & = & (-1 + 2i) i \\ & = & -i + 2i ^ 2 \\ & = & -2-i \ end {array}
Et en multipliant
r sur
i nous obtenons
s :
\ begin {array} {rcl} r & = & -2-i \\ s & = & ri \\ & = & (-2-i) i \\ & = & -2i-i ^ 2 \\ & = & 1-2i \ end {array}
Et en multipliant
s sur
i nous obtenons
t :
\ begin {array} {rcl} s & = & 1-2i \\ t & = & si \\ & = & (1-2i) i \\ & = & i-2i ^ 2 \\ & = & 2 + i \ end {array}
Et nous avons exactement ce avec quoi nous avons commencé (
p ) Si nous mettons ces nombres complexes sur le plan complexe, nous obtenons le résultat suivant.
Nombres complexes sur le plan complexeMaintenant, nous pouvons tourner sur le plan complexe et dans le sens des aiguilles d'une montre, en multipliant le nombre complexe par
−i .
Rotors
Nous pouvons également effectuer des virages arbitraires sur le plan complexe, en définissant le nombre complexe sous la forme suivante:
q= cos theta+i sin theta
Lors de la multiplication d'un nombre complexe par le rotor
q on obtient la formule générale:
\ begin {array} {rcl} p & = & a + bi \\ q & = & \ cos \ theta + i \ sin \ theta \\ pq & = & (a + bi) (\ cos \ theta + i \ sin \ theta) \\ a ^ {\ prime} + b ^ {\ prime} i & = & a \ cos \ theta-b \ sin \ theta + (a \ sin \ theta + b \ cos \ theta) i \ end {array}
Ce qui peut également être écrit sous forme matricielle:
\ begin {bmatrix} a ^ {\ prime} & -b ^ {\ prime} \\ b ^ {\ prime} & a ^ {\ prime} \ end {bmatrix} = \ begin {bmatrix} \ cos \ theta & - \ sin \ theta \\ \ sin \ theta & \ cos \ theta \ end {bmatrix} \ begin {bmatrix} a & -b \\ b & a \ end {bmatrix}
Quelle est la façon de tourner dans le sens antihoraire un point arbitraire sur le plan complexe par rapport à l'origine.
Quaternions
Après avoir appris le système des nombres complexes et le plan complexe, nous pouvons les introduire dans un espace tridimensionnel, ajoutant au système des nombres avec
i deux autres nombres imaginaires.
Les quaternions ont la forme généralisée suivante
q=s+xi+yj+zk s,x,y,z in mathbbR
Où, selon la célèbre expression de Hamilton:
i2=j2=k2=ijk=−1
\ begin {array} {ccc} ij = k & jk = i & ki = j \\ ji = -k & kj = -i & ik = -j \ end {array}
Vous remarquerez peut-être que la relation entre
i ,
j et
k très similaire aux règles de multiplication vectorielle des vecteurs cartésiens unitaires:
\ begin {array} {ccc} \ mathbf {x} \ times \ mathbf {y} = \ mathbf {z} & \ mathbf {y} \ times \ mathbf {z} = \ mathbf {x} & \ mathbf { z} \ times \ mathbf {x} = \ mathbf {y} \\ \ mathbf {y} \ times \ mathbf {x} = - \ mathbf {z} & \ mathbf {z} \ times \ mathbf {y} = - \ mathbf {x} & \ mathbf {x} \ times \ mathbf {z} = - \ mathbf {y} \ end {array}
Hamilton a également remarqué que les nombres imaginaires
i ,
j et
k peut être utilisé pour représenter trois vecteurs unitaires cartésiens
mathbfi ,
mathbfj et
mathbfk avec les mêmes propriétés de nombres imaginaires, donc
mathbfi2= mathbfj2= mathbfk2=−1 .
Représentation graphique des propriétés mathbfij , mathbfjk , mathbfkiL'image ci-dessus montre graphiquement la relation entre les vecteurs unitaires cartésiens sous la forme
mathbfi ,
mathbfj et
mathbfk .
Quaternions en paire ordonnée
Nous pouvons également représenter les quaternions comme une paire ordonnée:
q=[s, mathbfv] s in mathbbR, mathbfv in mathbbR3
O Where
mathbfv peut également être représenté comme ses composants individuels:
q=[s,x mathbfi+y mathbfj+z mathbfk] s,x,y,z in mathbbR
En utilisant cette entrée, nous pouvons représenter plus facilement les caractéristiques communes des quaternions et des nombres complexes.
Addition et soustraction de quaternion
Les quaternions peuvent être ajoutés et soustraits de manière similaire aux nombres complexes:
\ begin {array} {rcl} q_a & = & [s_a, \ mathbf {a}] \\ q_b & = & [s_b, \ mathbf {b}] \\ q_a + q_b & = & [s_a + s_b, \ mathbf {a} + \ mathbf {b}] \\ q_a-q_b & = & [s_a-s_b, \ mathbf {a} - \ mathbf {b}] \ end {array}
Œuvres du Quaternion
On peut également exprimer le produit de deux quaternions:
\ begin {array} {rcl} q_a & = & [s_a, \ mathbf {a}] \\ q_b & = & [s_b, \ mathbf {b}] \\ q_ {a} q_ {b} & = & & [s_ {a}, \ mathbf {a}] [s_ {b}, \ mathbf {b}] \\ & = & (s_ {a} + x_ {a} i + y_ {a} j + z_ {a } k) (s_ {b} + x_ {b} i + y_ {b} j + z_ {b} k) \\ & = & (s_ {a} s_ {b} -x_ {a} x_ {b} -y_ {a} y_ {b} -z_ {a} z_ {b}) \\ & & + (s_ {a} x_ {b} + s_ {b} x {a} + y_ {a} z_ {b } -y_ {b} z_ {a}) i \\ & & + (s_ {a} y_ {b} + s_ {b} y_ {a} + z_ {a} x_ {b} -z_ {b} x_ {a}) j \\ & & + (s_ {a} z_ {b} + s_ {b} z_ {a} + x_ {a} y_ {b} -x_ {b} y_ {a}) k \ end {array}
Ce qui nous donne un autre quaternion. Si nous remplaçons les nombres imaginaires dans l'expression précédente
i ,
j et
k paires ordonnées (également connues sous le nom d'unités quaternion), alors nous obtenons
i=[0, mathbfi] j=[0, mathbfj] k=[0, mathbfk]
Et en replaçant dans l'expression originale avec
[1, mathbf0]=1 nous obtenons:
\ begin {array} {rcl} [s_ {a}, \ mathbf {a}] [s_ {b}, \ mathbf {b}] & = & (s_ {a} s_ {b} -x_ {a} x_ {b} -y_ {a} y_ {b} -z_ {a} z_ {b}) [1, \ mathbf {0}] \\ & & + (s_ {a} x_ {b} + s_ {b } x {a} + y_ {a} z_ {b} -y_ {b} z_ {a}) [0, \ mathbf {i}] \\ & & + (s_ {a} y_ {b} + s_ { b} y_ {a} + z_ {a} x_ {b} -z_ {b} x_ {a}) [0, \ mathbf {j}] \\ & & + (s_ {a} z_ {b} + s_ {b} z_ {a} + x_ {a} y_ {b} -x_ {b} y_ {a}) [0, \ mathbf {k}] \ end {array}
En développant cette expression dans la somme des paires ordonnées, nous obtenons:
\ begin {array} {rcl} [s_ {a}, \ mathbf {a}] [s_ {b}, \ mathbf {b}] & = & [s_ {a} s_ {b} -x_ {a} x_ {b} -y_ {a} y_ {b} -z_ {a} z_ {b}, \ mathbf {0}] \\ & & + [0, (s_ {a} x_ {b} + s_ {b } x {a} + y_ {a} z_ {b} -y_ {b} z_ {a}) \ mathbf {i}] \\ & & + [0, (s_ {a} y_ {b} + s_ { b} y_ {a} + z_ {a} x_ {b} -z_ {b} x_ {a}) \ mathbf {j}] \\ & & + [0, (s_ {a} z_ {b} + s_ {b} z_ {a} + x_ {a} y_ {b} -x_ {b} y_ {a}) \ mathbf {k}] \ end {array}
Si nous multiplions par une unité quaternionique et extrayons les composantes vectorielles communes, alors nous pouvons réécrire cette équation comme suit:
\ begin {array} {rcl} [s_ {a}, \ mathbf {a}] [s_ {b}, \ mathbf {b}] & = & [s_ {a} s_ {b} -x_ {a} x_ {b} -y_ {a} y_ {b} -z_ {a} z_ {b}, \ mathbf {0}] \\ & & + [0, s_ {a} (x_ {b} \ mathbf {i } + y_ {b} \ mathbf {j} + z_ {b} \ mathbf {k}) + s_ {b} (x_ {a} \ mathbf {i} + y_ {a} \ mathbf {j} + z_ { a} \ mathbf {k}) \\ & & (y_ {a} z_ {b} -y_ {b} z_ {a}) \ mathbf {i} + (z_ {a} x_ {b} -z_ { b} x_ {a}) \ mathbf {j} + (x_ {a} y_ {b} -x_ {b} y_ {a}) \ mathbf {k}] \ end {array}
Cette équation nous donne la somme de deux paires ordonnées. La première paire ordonnée est le
quaternion matériel , et la seconde est le quaternion
pur . Ces deux paires ordonnées peuvent être combinées en une seule paire ordonnée:
\ begin {array} {rcl} [s_ {a}, \ mathbf {a}] [s_ {b}, \ mathbf {b}] & = & [s_ {a} s_ {b} -x_ {a} x_ {b} -y_ {a} y_ {b} -z_ {a} z_ {b}, \\ & & s_ {a} (x_ {b} \ mathbf {i} + y_ {b} \ mathbf {j } + z_ {b} \ mathbf {k}) + s_ {b} (x_ {a} \ mathbf {i} + y_ {a} \ mathbf {j} + z_ {a} \ mathbf {k}) \\ & & + (y_ {a} z_ {b} -y_ {b} z_ {a}) \ mathbf {i} + (z_ {a} x_ {b} -z_ {b} x_ {a}) \ mathbf { j} + (x_ {a} y_ {b} -x_ {b} y_ {a}) \ mathbf {k}] \ end {array}
Si nous remplaçons, nous obtenons
\ begin {array} {rcl} \ mathbf {a} & = & x_ {a} \ mathbf {i} + y_ {a} \ mathbf {j} + z_ {a} \ mathbf {k} \\ \ mathbf {b} & = & x_ {b} \ mathbf {i} + y_ {b} \ mathbf {j} + z_ {b} \ mathbf {k} \\ \ mathbf {a} \ cdot \ mathbf {b} & = & x_ {a} x_ {b} + y_ {a} y_ {b} + z_ {a} z_ {b} \\ \ mathbf {a} \ times \ mathbf {b} & = & (y_ {a} z_ {b} -y_ {b} z_ {a}) \ mathbf {i} + (z_ {a} x_ {b} -z_ {b} x_ {a}) \ mathbf {j} + (x_ {a} y_ {b} -x_ {b} y_ {a}) \ mathbf {k} \ end {array}
Nous obtenons:
[sa, mathbfa][sb, mathbfb]=[sasb− mathbfa cdot mathbfb,sa mathbfb+sb mathbfa+ mathbfa times mathbfb]
Il s'agit de l'équation générale pour le produit des quaternions.
Véritable Quaternion
Un vrai quaternion est un quaternion dans lequel un vecteur
mathbf0 :
q=[s, mathbf0]
Et le produit de deux quaternions
matériels est un autre quaternion
matériel :
\ begin {array} {rcl} q_a & = & [s_a, \ mathbf {0}] \\ q_b & = & [s_b, \ mathbf {0}] \\ q_ {a} q_ {b} & = & & [s_a, \ mathbf {0}] [s_b, \ mathbf {0}] \\ & = & [s_ {a} s_ {b}, \ mathbf {0}] \ end {array}
Ce qui est similaire au produit de deux nombres complexes contenant le terme imaginaire nul.
\ begin {array} {rcl} z_1 & = & a_1 + 0i \\ z_2 & = & a_2 + 0i \\ z_ {1} z_ {2} & = & (a_1 + 0i) (a_2 + 0i) \\ & = & a_ {1} a_ {2} \ end {array}
Multiplication scalaire du quaternion
On peut également multiplier le quaternion par un scalaire, tout en respectant la règle suivante:
\ begin {array} {rcl} q & = & [s, \ mathbf {v}] \\ \ lambda {q} & = & \ lambda [s, \ mathbf {v}] \\ & = & [\ lambda {s}, \ lambda \ mathbf {v}] \ end {array}
Nous pouvons le vérifier en utilisant le produit des quaternions
réels montré ci-dessus en multipliant le quaternion par un scalaire comme le quaternion
réel :
\ begin {array} {rcl} q & = & [s, \ mathbf {v}] \\ \ lambda & = & [\ lambda, \ mathbf {0}] \\ \ lambda {q} & = & [ \ lambda, \ mathbf {0}] [s, \ mathbf {v}] \\ & = & [\ lambda {s}, \ lambda \ mathbf {v}] \ end {array}
Quaternions purs
En plus des quaternions
matériels , Hamilton a également défini
le quaternion
pur comme un quaternion avec un terme scalaire nul:
q=[0, mathbfv]
Ou si vous notez les composants:
q=xi+yj+zk
Et encore une fois, nous pouvons prendre le produit de deux quaternions
purs :
\ begin {array} {rcl} q_a & = & [0, \ mathbf {a}] \\ q_b & = & [0, \ mathbf {b}] \\ q_ {a} q_ {b} & = & [0, \ mathbf {a}] [0, \ mathbf {b}] \\ & = & [- \ mathbf {a} \ cdot \ mathbf {b}, \ mathbf {a} \ times \ mathbf {b} ] \ end {array}
conformément à la règle du produit quaternion présentée ci-dessus.
Forme de quaternion additif
De plus, nous pouvons exprimer les quaternions comme la somme des parties
réelles et
pures du quaternion:
\ begin {array} {rcl} q & = & [s, \ mathbf {v}] \\ & = & [s, \ mathbf {0}] + [0, \ mathbf {v}] \ end {array }
Quaternion unique
Prendre un vecteur arbitraire
mathbfv , ce vecteur peut être exprimé à la fois en termes de valeur scalaire et dans sa direction comme suit:
mathbfv=v mathbf hatv textwhere v=| mathbfv| textand | mathbf hatv|=1
En combinant cette définition avec la définition du quaternion pur, on obtient:
\ begin {array} {rcl} q & = & [0, \ mathbf {v}] \\ & = & [0, v \ mathbf {\ hat {v}}] \\ & = & v [0, \ mathbf {\ hat {v}}] \ end {array}
On peut également décrire un quaternion unitaire ayant un scalaire nul et un vecteur unitaire:
hatq=[0, mathbf hatv]
Forme binaire quaternion
Maintenant, nous pouvons combiner les définitions d'un quaternion unique et la forme additive d'un quaternion, obtenant une forme de quaternions similaire à la notation utilisée dans la description des nombres complexes:
\ begin {array} {rcl} q & = & [s, \ mathbf {v}] \\ & = & [s, \ mathbf {0}] + [0, \ mathbf {v}] \\ & = & [s, \ mathbf {0}] + v [0, \ mathbf {\ hat {v}}] \\ & = & s + v \ hat {q} \ end {array}
Ce qui nous donne un moyen de représenter un quaternion sous une forme très similaire aux nombres complexes:
\ begin {array} {rcl} z & = & a + bi \\ q & = & s + v \ hat {q} \ end {array}
Le nombre conjugué d'un quaternion
Le nombre conjugué du quaternion peut être calculé en prenant la partie vectorielle du quaternion opposé en signe:
\ begin {array} {rcl} q & = & [s, \ mathbf {v}] \\ q ^ * & = & [s, - \ mathbf {v}] \ end {array}
Le produit du quaternion et son nombre conjugué nous donnent ce qui suit:
\ begin {array} {rcl} qq ^ * & = & [s, \ mathbf {v}] [s, - \ mathbf {v}] \\ & = & [s ^ 2- \ mathbf {v} \ cdot- \ mathbf {v}, - s \ mathbf {v} + s \ mathbf {v} + \ mathbf {v} \ times- \ mathbf {v}] \\ & = & [s ^ 2 + \ mathbf { v} \ cdot \ mathbf {v}, \ mathbf {0}] \\ & = & [s ^ 2 + v ^ 2, \ mathbf {0}] \ end {array}
Norme quaternion
Rappelons la définition de la norme d'un nombre complexe:
\ begin {array} {rcl} | z | & = & \ sqrt {a ^ 2 + b ^ 2} \\ zz ^ * & = & | z | ^ 2 \ end {array}
De même, la norme (ou magnitude) d'un quaternion est définie comme:
\ begin {array} {rcl} q & = & [s, \ mathbf {v}] \\ | q | & = & \ sqrt {s ^ 2 + v ^ 2} \ end {array}
Ce qui nous permet d'exprimer la norme quaternion comme suit:
qq∗=|q|2
Normalisation du Quaternion
Ayant une définition de la norme quaternion, nous pouvons l'utiliser pour normaliser le quaternion. Le quaternion est normalisé en divisant par
|q| :
q prime= fracq sqrts2+v2
Par exemple, normalisons le quaternion:
q=[1,4 mathbfi+4 mathbfj−4 mathbfk]
Nous devons d'abord calculer
le taux de quaternion:
\ begin {array} {rcl} | q | & = & \ sqrt {1 ^ 2 + 4 ^ 2 + 4 ^ 2 + (- 4) ^ 2} \\ & = & \ sqrt {49} \\ & = & 7 \ end {array}
Ensuite, nous devons diviser le quaternion par la norme du quaternion afin de calculer le quaternion normalisé:
\ begin {array} {rcl} q ^ {\ prime} & = & \ cfrac {q} {| q |} \\ [1.0em] & = & \ cfrac {(1 + 4 \ mathbf {i} + 4 \ mathbf {j} -4 \ mathbf {k})} {7} \\ [1.0em] & = & \ cfrac {1} {7} + \ cfrac {4} {7} \ mathbf {i} + \ cfrac {4} {7} \ mathbf {j} - \ cfrac {4} {7} \ mathbf {k} \ end {array}
Quaternion inversé
Le quaternion inversé est désigné par
q−1 . Pour calculer le quaternion inverse, nous prenons le nombre conjugué du quaternion et le divisons par le carré de la norme:
q−1= fracq∗|q|2
Pour le montrer, nous pouvons utiliser la définition inverse:
qq−1=[1, mathbf0]=1
Et multipliez les deux côtés par le nombre conjugué du quaternion, ce qui nous donnera:
q∗qq−1=q∗
Par substitution, nous obtenons:
\ begin {array} {rcl} | q | ^ {2} q ^ {- 1} & = & q ^ {*} \\ q ^ {- 1} & = & \ cfrac {q ^ {*}} {| q | ^ {2}} \ end {array}
Pour les normes à quaternion unique dont la norme est 1, on peut écrire:
q−1=q∗
Produit scalaire Quaternion
De façon similaire au produit scalaire des vecteurs, nous pouvons calculer le produit scalaire de deux quaternions en multipliant les parties scalaires correspondantes et en résumant les résultats:
\ begin {array} {rcl} q_1 & = & [s_1, x_1 \ mathbf {i} + y_1 \ mathbf {j} + z_1 \ mathbf {k}] \\ q_2 & = & [s_2, x_2 \ mathbf { i} + y_2 \ mathbf {j} + z_2 \ mathbf {k}] \\ q_1 {\ cdot} q_2 & = & s_ {1} s_ {2} + x_ {1} x_ {2} + y_ {1} y_ {2} + z_ {1} z_ {2} \ end {array}
Nous pouvons également utiliser le produit scalaire des quaternions pour calculer la différence angulaire entre les quaternions:
cos theta= fracs1s2+x1x2+y1y2+z1z2|q1||q2|
Pour les normes quaternions simples, nous pouvons simplifier l'équation:
cos theta=s1s2+x1x2+y1y2+z1z2
Tours
Permettez-moi de vous rappeler que nous avons identifié une forme spéciale d'un nombre complexe appelé
rotor , qui peut être utilisée pour faire pivoter un point sur un plan bidimensionnel comme suit:
q= cos theta+i sin theta
En raison de la similitude des nombres complexes avec les quaternions, il devrait être possible d'exprimer un quaternion qui peut être utilisé pour faire pivoter un point dans l'espace tridimensionnel:
q=[ cos theta, sin theta mathbfv]
Vérifions si cette théorie est vraie en calculant le produit quaternion
q et vecteur
mathbfp . Tout d'abord, nous pouvons exprimer
mathbfp comme
quaternion pur comme suit:
p=[0, mathbfp]
Un
q Est une norme quaternion unique sous la forme:
q=[s, lambda mathbf hatv]
Alors
\ begin {array} {rcl} p ^ {\ prime} & = & qp \\ & = & [s, \ lambda \ mathbf {\ hat {v}}] [0, \ mathbf {p}] \\ & = & [- \ lambda \ mathbf {\ hat {v}} \ cdot \ mathbf {p}, s \ mathbf {p} + \ lambda \ mathbf {\ hat {v}} \ times \ mathbf {p}] \ end {array}
Nous voyons que le résultat est un quaternion commun avec des parties scalaires et vectorielles.
Voyons d'abord un cas «spécial» dans lequel
mathbfp perpendiculaire
mathbf hatv . Dans ce cas, le membre du produit scalaire
− lambda mathbf hatv cdot mathbfp=0 et le résultat devient
pur quaternion:
p prime=[0,s mathbfp+ lambda mathbf hatv times mathbfp]
Dans ce cas, tourner
mathbfp concernant
mathbf hatv nous substituons juste
s= cos theta et
lambda= sin theta .
p prime=[0, cos theta mathbfp+ sin theta mathbf hatv times mathbfp]
Par exemple, tournons le vecteur
mathbfp 45 ° par rapport à l'axe Z; alors notre quaternion
q sera égal à:
\ begin {array} {rcl} q & = & [\ cos \ theta, \ sin \ theta \ mathbf {k}] \\ & = & \ left [\ frac {\ sqrt {2}} {2}, \ frac {\ sqrt {2}} {2} \ mathbf {k} \ right] \ end {array}
Et prenons un vecteur
mathbfp qui se rapporte à un cas particulier où
mathbfp perpendiculaire
mathbfk :
p=[0,2 mathbfi]
Maintenant trouvons un morceau
qp
:
\ begin {array} {rcl} p ^ {\ prime} & = & qp \\ & = & \ left [\ frac {\ sqrt {2}} {2}, \ frac {\ sqrt {2}} { 2} \ mathbf {k} \ droite] [0,2 \ mathbf {i}] \\ & = & \ left [0,2 \ frac {\ sqrt {2}} {2} \ mathbf {i} +2 \ frac {\ sqrt {2}} {2} \ mathbf {k} \ times \ mathbf {i} \ right] \\ & = & [0, \ sqrt {2} \ mathbf {i} + \ sqrt {2 } \ mathbf {j}] \ end {array}
Ce qui nous donne un quaternion
propre tourné à 45 ° autour de l'axe
mathbfk . Nous pouvons également nous assurer que la valeur du vecteur final est préservée:
\ begin {array} {rcl} | \ mathbf {p} ^ {\ prime} | & = & \ sqrt {\ sqrt {2} ^ {2} + \ sqrt {2} ^ {2}} \\ & = & 2 \ end {array}
Exactement ce que nous attendions!
Nous pouvons le montrer graphiquement avec l'image suivante:
Faire tourner le quaternion (1)Regardons maintenant un quaternion non orthogonal à
mathbfp . Si nous prenons pour la partie vectorielle du quaternion un décalage de 45 ° par rapport à
mathbfp on obtient alors:
\ begin {array} {rcl} \ mathbf {\ hat {v}} & = & \ frac {\ sqrt {2}} {2} \ mathbf {i} + \ frac {\ sqrt {2}} {2 } \ mathbf {k} \\ \ mathbf {p} & = & 2 \ mathbf {i} \\ q & = & [\ cos \ theta, \ sin \ theta \ mathbf {\ hat {v}}] \\ p & = & [0, \ mathbf {p}] \ end {array}
Et en multipliant notre vecteur
mathbfp sur
q nous obtenons:
\ begin {array} {rcl} p ^ {\ prime} & = & qp \\ & = & [\ cos \ theta, sin \ theta \ mathbf {\ hat {v}}] [0, \ mathbf {p }] \\ & = & [- \ sin \ theta \ mathbf {\ hat {v}} \ cdot \ mathbf {p}, \ cos \ theta \ mathbf {p} + \ sin \ theta \ mathbf {\ hat { v}} \ times \ mathbf {p}] \ end {array}
Après substitution
mathbf hatv ,
mathbfp et
theta=45 circ nous obtenons:
\ begin {array} {rcl} p ^ {\ prime} & = & \ left [- \ frac {\ sqrt {2}} {2} \ left (\ frac {\ sqrt {2}} {2} \ mathbf {i} + \ frac {\ sqrt {2}} {2} \ mathbf {k} \ right) \ cdot (2 \ mathbf {i}), \ frac {\ sqrt {2}} {2} 2 \ mathbf {i} + \ frac {\ sqrt {2}} {2} \ left (\ frac {\ sqrt {2}} {2} \ mathbf {i} + \ frac {\ sqrt {2}} {2} \ mathbf {k} \ right) \ times2 \ mathbf {i} \ right] \\ & = & [-1, \ sqrt {2} \ mathbf {i} + \ mathbf {j}] \ end {array}
Autrement dit, il n'est plus
du quaternion
pur , il n'est pas tourné de 45 ° et la norme du vecteur n'est plus égale à 2 (elle a diminué à
sqrt3 )
Ce résultat peut être représenté graphiquement.
Tour du Quaternion (2)À strictement parler, il est incorrect de représenter un quaternion p prime dans l'espace en trois dimensions, car en fait c'est un vecteur en quatre dimensions! Par souci de simplicité, je ne montrerai que la composante vectorielle des quaternions.
Cependant, tout n'est pas perdu. Hamilton a découvert (mais ne l'a pas publié) que si nous multiplions ensuite le résultat
qp à la valeur opposée
q , alors le résultat sera un quaternion
pur et la norme de la composante vectorielle sera préservée. Voyons si cela peut être appliqué dans notre exemple.
Commençons par calculer
q−1 :
\ begin {array} {rcl} q & = & \ left [\ cos \ theta, \ sin \ theta \ left (\ frac {\ sqrt {2}} {2} \ mathbf {i} + \ frac {\ sqrt {2}} {2} \ mathbf {k} \ right) \ right] \\ q ^ {- 1} & = & \ left [\ cos \ theta, - \ sin \ theta \ left (\ frac {\ sqrt {2}} {2} \ mathbf {i} + \ frac {\ sqrt {2}} {2} \ mathbf {k} \ right) \ right] \ end {array}
À
theta=45 circ nous obtenons:
\ begin {array} {rcl} q ^ {- 1} & = & \ left [\ frac {\ sqrt {2}} {2}, - \ frac {\ sqrt {2}} {2} \ left ( \ frac {\ sqrt {2}} {2} \ mathbf {i} + \ frac {\ sqrt {2}} {2} \ mathbf {k} \ right) \ right] \\ & = & \ frac {1 } {2} \ left [\ sqrt {2}, - \ mathbf {i} - \ mathbf {k} \ right] \ end {array}
Combiner la valeur précédente
qp et
q−1 nous obtenons:
\ begin {array} {rcl} qp & = & \ left [-1, \ sqrt {2} \ mathbf {i} + \ mathbf {j} \ right] \\ qpq ^ {- 1} & = & \ gauche [-1, \ sqrt {2} \ mathbf {i} + \ mathbf {j} \ droite] \ frac {1} {2} \ left [\ sqrt {2}, - \ mathbf {i} - \ mathbf {k} \ right] \\ & = & \ frac {1} {2} \ left [- \ sqrt {2} - \ left (\ sqrt {2} \ mathbf {i} + \ mathbf {j} \ right ) \ cdot (- \ mathbf {i} - \ mathbf {k}), \ mathbf {i} + \ mathbf {k} + \ sqrt {2} \ left (\ sqrt {2} \ mathbf {i} + \ mathbf {j} \ droite) - \ mathbf {i} + \ sqrt {2} \ mathbf {j} + \ mathbf {k} \ right] \\ & = & \ frac {1} {2} \ left [- \ sqrt {2} + \ sqrt {2}, \ mathbf {i} + \ mathbf {k} +2 \ mathbf {i} + \ sqrt {2} \ mathbf {j} - \ mathbf {i} + \ sqrt {2} \ mathbf {j} + \ mathbf {k} \ right] \\ & = & \ left [0, \ mathbf {i} + \ sqrt {2} \ mathbf {j} + \ mathbf {k} \ droite] \ end {array}
Ce qui est du
pur quaternion, et la norme du résultat est:
\ begin {array} {rcl} | p ^ {\ prime} | & = & \ sqrt {1 ^ 2 + \ sqrt {2} ^ 2 + 1 ^ 2} \\ & = & \ sqrt {4} \\ & = & 2 \ end {array}
ce qui est égal
mathbfp c'est-à-dire que la norme du vecteur est préservée.
L'image ci-dessous montre le résultat de la rotation.
Tour du Quaternion (3)On voit que le résultat est un pur quaternion, et la norme du vecteur d'origine est préservée, mais le vecteur a pivoté de 90 °, pas 45 °, ce qui est deux fois plus que nécessaire! Par conséquent, pour la rotation correcte du vecteur
mathbfp au coin
theta par rapport à un axe arbitraire
mathbf hatv nous devons prendre le demi-angle et créer le quaternion suivant:
q= left[ cos frac12 theta, sin frac12 theta mathbf hatv right]
Quelle est la vue générale d'un tournage quaternion!
Interpolation du quaternion
L'une des raisons les plus importantes de l'utilisation des quaternions en infographie est que les quaternions décrivent très bien les rotations dans l'espace. Les quaternions éliminent le fardeau d'autres façons de tourner les points dans l'espace 3D, tels que
les cadres pliants , dans lesquels le problème représente la rotation dans les coins d'Euler.
À l'aide de quaternions, nous pouvons définir plusieurs méthodes qui représentent l'interpolation de rotation dans l'espace 3D. La première méthode que
j'envisage s'appelle
SLERP . Il est utilisé pour interpoler en douceur un point entre deux orientations. La deuxième méthode est un développement de
SLERP et s'appelle
SQUAD . Il est utilisé pour interpoler le long d'une série d'orientations qui spécifient le chemin.
SLERP
SLERP signifie Spherical
L inear Interpolation (interpolation linéaire sphérique).
SLERP offre la possibilité d'interpoler en douceur un point entre deux orientations.
Je désignerai la première orientation comme
q1 , et le second comme
q2 . Le point interpolé est désigné par
mathbfp , le point interpolé est désigné par
mathbfp prime . Paramètre d'interpolation
t va interpoler
mathbfp de
q1 à
t=0 avant
q2 à
t=1 .
La formule d'interpolation linéaire standard est:
mathbfp prime= mathbfp1+t( mathbfp2− mathbfp1)
Voici les étapes de base pour appliquer cette équation:
- Nous calculons la différence entre mathbfp1 et mathbfp2 .
- Prenez la fraction de cette différence.
- Corrigez la valeur initiale par la différence fractionnaire entre les deux points.
On peut utiliser le même principe de base pour interpoler entre deux orientations de quaternions.
Différence quaternion
La première étape signifie que nous devons calculer la différence entre
q1 et
q2 . Dans le contexte des quaternions, cela revient à calculer la différence angulaire entre deux quaternions.
Deltaq=q−11q2
Élever un quaternion à un pouvoir
L'étape suivante consiste à prendre la partie fractionnaire de cette différence. Nous pouvons calculer la partie fractionnaire du quaternion en l'élevant à une puissance dont la valeur est dans la plage
[0...1] .
La formule générale pour élever un quaternion à une puissance a la forme suivante:
qt= exp(t logq)
Où la fonction exponentielle des quaternions ressemble à ceci:
\ begin {array} {rcl} \ exp (q) & = & \ exp \ left ([0, \ theta \ mathbf {\ hat {v}}] \ right) \\ & = & [\ cos \ theta , \ sin \ theta \ mathbf {\ hat {v}}] \ end {array}
Et le logarithme d'un quaternion est:
\ begin {array} {rcl} \ log {q} & = & \ log (\ cos \ theta {+} \ sin \ theta \ mathbf {\ hat {v}}) \\ & = & \ log \ left (\ exp (\ theta \ mathbf {\ hat {v}}) \ right) \\ & = & \ theta \ mathbf {\ hat {v}} \\ & = & [0, \ theta \ mathbf {\ hat {v}}] \ end {array}
À
t=0 nous avons ce qui suit:
\ begin {array} {rcl} q ^ 0 & = & \ exp (0 \ log {q}) \\ & = & \ exp ([\ cos (0), \ sin (0) \ mathbf {\ hat {v}}]) \\ & = & \ exp ([1, \ mathbf {0}]) \\ & = & [1, \ mathbf {0}] \ end {array}
Et quand
t=1 nous avons
\ begin {array} {rcl} q ^ 1 & = & \ exp (\ log {q}) \\ & = & q \ end {array}
Différence fractionnelle des quaternions
Pour calculer la rotation angulaire interpolée, on change l'orientation initiale
q1 à la partie fractionnaire de la différence entre
q1 et
q2 .
q prime=q1 gauche(q−11q2 droite)t
Qu'est-ce qu'une vue générale de l'interpolation linéaire sphérique pour les quaternions. Cependant, ce n'est pas le type d'équation
SLERP qui est couramment utilisé dans la pratique.
Nous pouvons appliquer une formule similaire pour effectuer une interpolation sphérique de vecteurs en quaternions. La forme générale d'interpolation sphérique pour les vecteurs est définie comme suit:
mathbfvt= frac sin(1−t) theta sin theta mathbfv1+ frac sint theta sin theta mathbfv2
Graphiquement, cela peut être illustré dans l'image suivante.
Interpolation du quaternionCette formule peut être appliquée aux quaternions sans modifications:
qt= frac sin(1−t) theta sin thetaq1+ frac sint theta sin thetaq2
Et nous pouvons obtenir l'angle
theta calcul du produit scalaire
q1 et
q2 .
\ begin {array} {rcl} \ cos \ theta & = & \ cfrac {q_1 {\ cdot} q_2} {| q_1 || q_2 |} \\ & = & \ cfrac {s_ {1} s_ {2} + x_ {1} x_ {2} + y_ {1} y_ {2} + z_ {1} z_ {2}} {| q_1 || q_2 |} \\ \ theta & = & \ cos ^ {- 1} \ left (\ cfrac {s_ {1} s_ {2} + x_ {1} x_ {2} + y_ {1} y_ {2} + z_ {1} z_ {2}} {| q_1 || q_2 |} \ right) \ end {array}
Facteurs à considérer
Cette implémentation a deux problèmes à considérer lors de son utilisation.
Premièrement, si le produit scalaire des quaternions se révèle être une valeur négative, alors l'interpolation ira loin sur la sphère à quatre dimensions, et ce n'est pas toujours souhaitable.
Pour résoudre ce problème, nous pouvons vérifier le résultat du produit scalaire et s'il est négatif, alors nous pouvons prendre la valeur opposée à l'une des orientations. L'inversion des parties scalaires et vectorielles du quaternion ne change pas l'orientation qu'elles représentent, mais en faisant cela, nous garantissons que la rotation se produira le long du chemin "le plus court".Un autre problème se pose si la différence angulaire entreq1 et
q2 très petit, tandis que sinθ devient 0. Si cela se produit, la division par sinθnous pouvons obtenir un résultat incertain. Dans ce cas, vous pouvez revenir à l'utilisation de l'interpolation linéaire entreq1 et
q2 .
Effectif
Tout comme SLERP peut être utilisé pour l'interpolation entre deux quaternions, SQUAD ( S pherical et Quad rangle - sphérique et quadrangulaire) peut être utilisé pour une interpolation fluide le long du chemin de rotation.Si nous avons un certain nombre de quaternions:q1,q2,q3,⋯,qn−2,qn−1,qn
Et nous avons défini le quaternion «auxiliaire» ( si ), que nous pouvons considérer comme un point de contrôle intermédiaire:si=exp(−log(qi+1q−1i)+log(qi−1q−1i)4)qi
L'orientation le long d'une partie de la courbe est définie comme:qi−1,qi,qi+1,qi+2
au temps t cela nous donne:squad(qi,qi+1,si,si+1,t)=slerp(slerp(qi,qi+1,t),slerp(si,si+1,t),2t(1−t))
Conclusion
Malgré la difficulté à comprendre, lorsque vous travaillez avec des virages, les quaternions offrent plusieurs avantages évidents par rapport aux matrices et angles d'Euler.- SLERP SQUAD .
- , , .
- - . , ( , ).
- , .
- 4 (3, . ), 9 .
Cependant, avec tous les avantages de l'utilisation des quaternions, il existe également plusieurs inconvénients.- Les quaternions peuvent devenir invalides en raison d'une erreur d'arrondi des nombres à virgule flottante; cependant, ce "glissement par erreur" peut être éliminé en renormalisant le quaternion.
- L'obstacle le plus important à l'utilisation des quaternions est probablement la grande complexité de leur compréhension. J'espère que vous résolvez ce problème en lisant mon article.
Il existe de nombreuses bibliothèques mathématiques qui implémentent les quaternions, et seules certaines d'entre elles implémentent correctement les quaternions. D'après ma propre expérience, une bonne bibliothèque de mathématiques avec une implémentation de haute qualité des quaternions est GLM (OpenGL Math Library). Si vous souhaitez utiliser des quaternions dans vos propres applications, je recommande cette bibliothèque.Télécharger la démo
J'ai créé une petite démo démontrant l'utilisation d'un quaternion pour faire pivoter un objet dans l'espace. La démo a été créée dans Unity 3.5.2, vous pouvez télécharger gratuitement télécharger ce moteur et voir le code source de la démo. Le fichier zip contient également l'exécutable binaire Windows, mais dans Unity, vous pouvez également créer une application pour Mac.Comprendre quaternions.zipLes références

Vince, J (2011). Quaternions pour l'infographie. 1er. éd. Londres: Springer.
| 
Dunn, F. et Parberry, I. (2002). 3D Math Primer for Graphics and Game Development. 1er. éd. Plano, Texas: Wordware Publishing, Inc. |