Disponible sur les quaternions et leurs avantages


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
    • 4.1. Rotors
  • 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)=(a1a2)+(b1b2)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ésien

Avion 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 complexe

Comme 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 complexe

Maintenant, 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 ,  mathbfki

L'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 mathbfj4 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 q1 . Pour calculer le quaternion inverse, nous prenons le nombre conjugué du quaternion et le divisons par le carré de la norme:

q1= fracq|q|2


Pour le montrer, nous pouvons utiliser la définition inverse:

qq1=[1, mathbf0]=1


Et multipliez les deux côtés par le nombre conjugué du quaternion, ce qui nous donnera:

qqq1=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:

q1=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 q1 :

\ 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 q1 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=q11q2


É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(q11q2 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(1t) theta sin theta mathbfv1+ frac sint theta sin theta mathbfv2


Graphiquement, cela peut être illustré dans l'image suivante.


Interpolation du quaternion

Cette formule peut être appliquée aux quaternions sans modifications:

qt= frac sin(1t) 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,,qn2,qn1,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+1q1i)+log(qi1q1i)4)qi


L'orientation le long d'une partie de la courbe est définie comme:

qi1,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(1t))


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.zip

Les références


Quaternions pour l'infographie

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.

Source: https://habr.com/ru/post/fr426863/


All Articles