Verfügbar über Quaternionen und ihre Vorteile


Von einem Übersetzer: Vor genau 175 Jahren und 3 Tagen wurden Quaternionen erfunden. Zu Ehren dieses runden Termins habe ich beschlossen, Material aufzunehmen, das dieses Konzept in einer klaren Sprache erklärt.

Das Konzept der Quaternionen wurde am Montag, den 16. Oktober 1843 in Dublin, Irland, vom irischen Mathematiker Sir William Rowan Hamilton erfunden. Hamilton und seine Frau gingen zur Royal Irish Academy und überquerten den Royal Canal über die Broome Bridge . Er machte eine atemberaubende Entdeckung, die er sofort auf den Stein der Brücke kratzte.

i 2 = j 2 = k 2 = i j k = - 1




Eine Gedenktafel auf der Broome-Brücke über den Königskanal zu Ehren der Entdeckung der Grundformel für die Multiplikation von Quaternionen.

In diesem Artikel werde ich versuchen, das Konzept der Quaternionen auf leicht verständliche Weise zu erklären. Ich werde erklären, wie Sie eine Quaternion visualisieren können, und auch über die verschiedenen Operationen sprechen, die mit Quaternionen ausgeführt werden können. Außerdem werde ich die Verwendung von Matrizen, Euler-Winkeln und Quaternionen vergleichen und dann versuchen zu erklären, wann Quaternionen anstelle von Euler-Winkeln oder -Matrizen verwendet werden sollen und wann nicht.

Inhalt


  • 1. Einleitung
  • 2. Komplexe Zahlen
    • 2.1. Addition und Subtraktion komplexer Zahlen
    • 2.2. Multiplikation einer komplexen Zahl mit einem Skalarwert
    • 2.3. Das Produkt komplexer Zahlen
    • 2.4. Das Quadrat komplexer Zahlen
    • 2.5. Komplexe Zahlen konjugieren
    • 2.6. Der absolute Wert der komplexen Zahl
    • 2.7. Quotient aus zwei komplexen Zahlen
  • 3. Grad ich
  • 4. Komplexe Ebene
    • 4.1. Rotoren
  • 5. Quaternionen
    • 5.1. Quaternionen als geordnetes Paar
    • 5.2. Quaternion Addition und Subtraktion
    • 5.3. Quaternion-Produkt
    • 5.4. Echtes Quaternion
    • 5.5. Skalare Quaternion-Multiplikation
    • 5.6. Reine Quaternionen
    • 5.7. Additive Quaternionsform
    • 5.8. Einzelne Quaternion
    • 5.9. Quaternion-Binärform
    • 5.10. Konjugierte Quaternionen
    • 5.11. Quaternionsrate
    • 5.12. Quaternion-Normalisierung
    • 5.13. Umgekehrte Quaternion
    • 5.14. Quaternion Scalar Produkt
  • 6. Drehungen
  • 7. Interpolation von Quaternionen
    • 7.1. SLERP
      • 7.1.1. Quaternionsunterschied
      • 7.1.2. Eine Quaternion zu einer Macht erheben
      • 7.1.3. Bruchteil der Quaternionen
      • 7.1.4. Zu berücksichtigende Faktoren
    • 7.2. Kader
  • 8. Fazit
  • 9. Laden Sie die Demo herunter
  • 10. Referenzen

Es ist nicht möglich, Quaternionen in 45 Minuten vollständig zu verstehen.

Dieser Artikel enthält viel Mathematik, ist also nichts für Weicheier.

Einführung


In der Computergrafik werden Matrizen verwendet, um die Position im Raum (Verschiebung) sowie die Ausrichtung im Raum (Drehung) zu beschreiben. Sie können auch eine einzelne Transformationsmatrix verwenden, um den Maßstab des Objekts zu beschreiben. Diese Matrix kann als "Basisraum" betrachtet werden. Wenn wir einen Vektor oder einen Punkt (oder sogar eine andere Matrix) mit einer Matrix von Transformationen multiplizieren, "transformieren" wir diesen Vektor, einen Punkt oder eine Matrix in den durch diese Matrix dargestellten Raum.

In diesem Artikel werde ich nicht im Detail auf Transformationsmatrizen eingehen. Details zu Transformationsmatrizen finden Sie in meinem Matrizenartikel .

In diesem Artikel möchte ich über eine alternative Möglichkeit sprechen, die Ausrichtung eines Objekts (Rotation) im Raum mithilfe von Quaternionen zu beschreiben.

Komplexe Zahlen


Um die Quaternionen vollständig zu verstehen, müssen wir zunächst verstehen, woher sie stammen. Das Quaternionsprinzip basiert auf dem Konzept eines komplexen Zahlensystems.

Zusammen mit den bekannten Zahlenmengen ( natürlich , ganzzahlig , real und rational ) fügt das System komplexer Zahlen eine neue Menge von Zahlen hinzu, die als imaginäre Zahlen bezeichnet werden. Imaginäre Zahlen wurden erfunden, um bestimmte Gleichungen zu lösen, für die es keine Lösungen gab, zum Beispiel:

x 2 + 1 = 0


Um diesen Ausdruck zu lösen, müssen wir das angeben x 2 = - 1 und dies ist, wie Sie wissen, unmöglich, weil das Quadrat einer beliebigen Zahl (positiv oder negativ) immer positiv ist.

Mathematiker konnten sich nicht damit abfinden, dass der Ausdruck keine Lösung hat, und so wurde ein neues Konzept erfunden - eine imaginäre Zahl , mit der solche Gleichungen gelöst werden können.

Die imaginäre Zahl lautet wie folgt:

i 2 = - 1


Versuchen Sie nicht, diese Annahme zu verstehen, da es keine logischen Gründe für ihre Existenz gibt. Das müssen wir einfach akzeptieren ich - Es ist nur eine bestimmte Menge, deren Quadrat ist - 1 .

Die Menge der imaginären Zahlen kann als bezeichnet werden  m a t h b b I. .

Die Menge komplexer Zahlen (bezeichnet mit  m a t h b b C. Ist die Summe der reellen und imaginären Zahlen in der folgenden Form:

z=a+bi  a,b in mathbbR,  i2=1


Es kann auch festgestellt werden, dass alle reellen Zahlen mit komplex sind b=0 und alle imaginären Zahlen sind komplex mit a=0 .

Addition und Subtraktion komplexer Zahlen


Komplexe Zahlen können durch Addieren und Subtrahieren des Real- und Imaginärteils addiert und subtrahiert werden.

Ergänzung:

(a1+b1i)+(a2+b2i)=(a1+a2)+(b1+b2)i


Subtraktion:

(a1+b1i)(a2+b2i)=(a1a2)+(b1b2)i


Multiplikation einer komplexen Zahl mit einem Skalarwert


Die komplexe Zahl wird mit einem Skalar multipliziert, indem jedes Mitglied der komplexen Zahl mit einem Skalar multipliziert wird:

 lambda(a+bi)= lambdaa+ lambdabi


Das Produkt komplexer Zahlen


Darüber hinaus können komplexe Zahlen auch mit gewöhnlichen algebraischen Regeln multipliziert werden.

\ 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}


Das Quadrat komplexer Zahlen


Eine komplexe Zahl kann auch durch Multiplikation mit sich selbst quadriert werden:

\ begin {array} {rcl} z & = & (a + bi) \\ z ^ 2 & = & (a + bi) (a + bi) \\ & = & (a ^ 2-b ^ 2) + 2abi \ end {array}


Komplexe Zahlen konjugieren


Der konjugierte Wert einer komplexen Zahl ist eine komplexe Zahl mit einem veränderten Vorzeichen des Imaginärteils, bezeichnet als  barz oder wie z .

\ begin {array} {rcl} z & = & (a + bi) \\ z ^ * & = & (a-bi) \ end {array}


Die Multiplikation einer komplexen Zahl mit ihrem konjugierten Wert ergibt ein interessantes Ergebnis.

\ 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}


Der absolute Wert der komplexen Zahl


Wir können die konjugierte Zahl einer komplexen Zahl verwenden, um den absoluten Wert (oder die Norm oder Größe ) einer komplexen Zahl zu berechnen. Der Absolutwert einer komplexen Zahl ist die Quadratwurzel einer komplexen Zahl multipliziert mit ihrem Konjugat . Es wird bezeichnet als |z| ::

\ begin {array} {rcl} z & = & (a + bi) \\ | z | & = & \ sqrt {zz ^ *} \\ & = & \ sqrt {(a + bi) (a-bi)} \\ & = & \ sqrt {a ^ 2 + b ^ 2} \ end {array}


Quotient aus zwei komplexen Zahlen


Um den Quotienten zweier komplexer Zahlen zu berechnen, multiplizieren wir Zähler und Nenner mit der konjugierten Zahl des Nenners.

\ 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}


Grad i


Wenn wir das behaupten i2=1 dann sollte die Möglichkeit der Aufrichtung bestehen i und zu anderen Graden.

\ 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}


Wenn wir diese Serie weiterhin aufnehmen, stellen wir ein Muster fest (1,i,1,i,1, dots) .

Ein ähnliches Muster ergibt sich mit einer Zunahme der negativen Grade.

\ 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}


Vielleicht haben Sie ein solches Muster bereits in der Mathematik gesehen, aber in der Form (x,y,x,y,x, dots) , die durch Drehen des Punktes um 90 ° gegen den Uhrzeigersinn auf einer zweidimensionalen kartesischen Ebene erhalten wird; Reihe (x,y,x,y,x, dots) Erstellt durch Drehen des Punktes um 90 ° Grad auf einer zweidimensionalen kartesischen Ebene.


Kartesisches Flugzeug

Komplexe Ebene


In ähnlicher Weise können wir komplexe Zahlen auf ein zweidimensionales Gitter anwenden, das als komplexe Ebene bezeichnet wird und den Realteil mit der horizontalen Achse und das Imaginäre mit der Vertikalen verbindet.


Komplexe Ebene

Wie Sie aus der vorherigen Zeile sehen können, können wir das sagen, wenn wir die komplexe Zahl mit multiplizieren i Dann können wir die komplexe Zahl auf der komplexen Ebene in Schritten von 90 ° drehen.

Lassen Sie uns überprüfen, ob dies wahr ist. Wir nehmen einen beliebigen Punkt auf der komplexen Ebene p ::

p=2+i


und multipliziere es mit i erhalten haben q ::

\ begin {array} {rcl} p & = & 2 + i \\ q & = & pi \\ & = & (2 + i) i \\ & = & 2i + i ^ 2 \\ & = & - 1 + 2i \ end {array}


Multiplizieren q auf i wir bekommen r ::

\ begin {array} {rcl} q & = & -1 + 2i \\ r & = & qi \\ & = & (-1 + 2i) i \\ & = & -i + 2i ^ 2 \\ & = & -2-i \ end {array}


Und multiplizieren r auf i wir bekommen s ::

\ begin {array} {rcl} r & = & -2-i \\ s & = & ri \\ & = & (-2-i) i \\ & = & -2i-i ^ 2 \\ & = & 1-2i \ end {array}


Und multiplizieren s auf i wir bekommen t ::

\ begin {array} {rcl} s & = & 1-2i \\ t & = & si \\ & = & (1-2i) i \\ & = & i-2i ^ 2 \\ & = & 2 + i \ end {array}


Und wir haben genau das bekommen, womit wir angefangen haben ( p ) Wenn wir diese komplexen Zahlen auf die komplexe Ebene setzen, erhalten wir das folgende Ergebnis.


Komplexe Zahlen auf der komplexen Ebene

Jetzt können wir uns auf der komplexen Ebene und im Uhrzeigersinn drehen und die komplexe Zahl mit multiplizieren i .

Rotoren


Wir können auch beliebige Kurven auf der komplexen Ebene ausführen und die komplexe Zahl in der folgenden Form festlegen:

q= cos theta+i sin theta


Beim Multiplizieren einer komplexen Zahl mit dem Rotor q wir bekommen die allgemeine Formel:

\ 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}


Was kann auch in Matrixform geschrieben werden:

\ 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}


Was ist eine Möglichkeit, einen beliebigen Punkt auf der komplexen Ebene relativ zum Ursprung gegen den Uhrzeigersinn zu drehen?

Quaternionen


Nachdem wir das System komplexer Zahlen und die komplexe Ebene kennengelernt haben, können wir sie in den dreidimensionalen Raum bringen und zusammen mit ihnen das Zahlensystem erweitern i zwei weitere imaginäre Zahlen.

Quaternionen haben die folgende verallgemeinerte Form

q=s+xi+yj+zk  s,x,y,z in mathbbR


Wo nach Hamiltons berühmtem Ausdruck:

i2=j2=k2=ijk=1



\ begin {array} {ccc} ij = k & jk = i & ki = j \\ ji = -k & kj = -i & ik = -j \ end {array}


Sie können feststellen, dass die Beziehung zwischen i , j und k sehr ähnlich zu den Regeln der Vektormultiplikation von kartesischen Einheitsvektoren:

\ 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 bemerkte auch, dass imaginäre Zahlen i , j und k kann verwendet werden, um drei kartesische Einheitsvektoren darzustellen  mathbfi ,  mathbfj und  mathbfk mit den gleichen Eigenschaften von imaginären Zahlen, so  mathbfi2= mathbfj2= mathbfk2=1 .


Grafische Darstellung von Eigenschaften  mathbfij ,  mathbfjk ,  mathbfki

Das obige Bild zeigt grafisch die Beziehung zwischen den kartesischen Einheitsvektoren in der Form  mathbfi ,  mathbfj und  mathbfk .

Quaternionen als geordnetes Paar


Wir können Quaternionen auch als geordnetes Paar darstellen:

q=[s, mathbfv]  s in mathbbR, mathbfv in mathbbR3


Wo  mathbfv kann auch als einzelne Komponenten dargestellt werden:

q=[s,x mathbfi+y mathbfj+z mathbfk]  s,x,y,z in mathbbR


Mit diesem Eintrag können wir die gemeinsamen Merkmale von Quaternionen und komplexen Zahlen leichter darstellen.

Quaternion Addition und Subtraktion


Quaternionen können ähnlich wie komplexe Zahlen addiert und subtrahiert werden:

\ 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}


Quaternion funktioniert


Wir können auch das Produkt zweier Quaternionen ausdrücken:

\ 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}


Was uns eine weitere Quaternion gibt. Wenn wir die imaginären Zahlen im vorherigen Ausdruck ersetzen i , j und k geordnete Paare (auch als Quaternion-Einheiten bekannt), dann bekommen wir

i=[0, mathbfi] j=[0, mathbfj] k=[0, mathbfk]


Und zurück in den ursprünglichen Ausdruck durch ersetzen [1, mathbf0]=1 wir bekommen:

\ 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}


Wenn wir diesen Ausdruck in die Summe der geordneten Paare erweitern, erhalten wir:

\ 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}


Wenn wir mit einer quaternionischen Einheit multiplizieren und die gemeinsamen Vektorkomponenten extrahieren, können wir diese Gleichung wie folgt umschreiben:

\ 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}


Diese Gleichung gibt uns die Summe zweier geordneter Paare. Das erste geordnete Paar ist das materielle Quaternion und das zweite ist das reine Quaternion. Diese zwei geordneten Paare können zu einem geordneten Paar kombiniert werden:

\ 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}


Wenn wir ersetzen, dann bekommen wir

\ 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}


Wir bekommen:

[sa, mathbfa][sb, mathbfb]=[sasb mathbfa cdot mathbfb,sa mathbfb+sb mathbfa+ mathbfa times mathbfb]


Dies ist die allgemeine Gleichung für das Produkt von Quaternionen.

Echtes Quaternion


Eine echte Quaternion ist eine Quaternion, in die ein Vektor eingeht  mathbf0 ::

q=[s, mathbf0]


Und das Produkt zweier materieller Quaternionen ist eine weitere materielle Quaternion:

\ 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}


Dies ähnelt dem Produkt zweier komplexer Zahlen, die den imaginären Term Null enthalten.

\ 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}


Skalare Quaternion-Multiplikation


Wir können die Quaternion auch mit einem Skalar multiplizieren, wobei wir die folgende Regel einhalten:

\ begin {array} {rcl} q & = & [s, \ mathbf {v}] \\ \ lambda {q} & = & \ lambda [s, \ mathbf {v}] \\ & = & [\ lambda {s}, \ lambda \ mathbf {v}] \ end {array}


Wir können dies anhand des oben gezeigten Produkts realer Quaternionen überprüfen, indem wir das Quaternion mit einem Skalar als reales Quaternion multiplizieren:

\ 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}


Reine Quaternionen


Zusätzlich zu den materiellen Quaternionen definierte Hamilton das reine Quaternion als ein Quaternion mit einem skalaren Nullterm:

q=[0, mathbfv]


Oder wenn Sie die Komponenten aufschreiben:

q=xi+yj+zk


Und wieder können wir das Produkt zweier reiner Quaternionen nehmen:

\ 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}


in Übereinstimmung mit der oben dargestellten Quaternion-Produktregel.

Additive Quaternionsform


Zusätzlich können wir die Quaternionen als die Summe der realen und reinen Teile der Quaternion ausdrücken:

\ begin {array} {rcl} q & = & [s, \ mathbf {v}] \\ & = & [s, \ mathbf {0}] + [0, \ mathbf {v}] \ end {array }


Einzelne Quaternion


Einen beliebigen Vektor nehmen  mathbfv kann dieser Vektor sowohl als Skalarwert als auch in seiner Richtung wie folgt ausgedrückt werden:

 mathbfv=v mathbf hatv  textwobei v=| mathbfv|  textund | mathbf hatv|=1


Wenn wir diese Definition mit der Definition der reinen Quaternion kombinieren, erhalten wir:

\ begin {array} {rcl} q & = & [0, \ mathbf {v}] \\ & = & [0, v \ mathbf {\ hat {v}}] \\ & = & v [0, \ mathbf {\ hat {v}}] \ end {array}


Wir können auch eine Einheitsquaternion mit einem Nullskalar und einem Einheitsvektor beschreiben:

 hatq=[0, mathbf hatv]


Quaternion-Binärform


Jetzt können wir die Definitionen eines einzelnen Quaternions und die additive Form eines Quaternions kombinieren und so eine Form von Quaternionen erhalten, die der in der Beschreibung komplexer Zahlen verwendeten Notation ähnelt:

\ 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}


Dies gibt uns die Möglichkeit, eine Quaternion in einer Form darzustellen, die komplexen Zahlen sehr ähnlich ist:

\ begin {array} {rcl} z & = & a + bi \\ q & = & s + v \ hat {q} \ end {array}


Die konjugierte Nummer eines Quaternions


Die konjugierte Zahl des Quaternions kann berechnet werden, indem der Vektorteil des Quaternions mit entgegengesetztem Vorzeichen genommen wird:

\ begin {array} {rcl} q & = & [s, \ mathbf {v}] \\ q ^ * & = & [s, - \ mathbf {v}] \ end {array}


Das Produkt des Quaternions und seiner konjugierten Zahl ergibt Folgendes:

\ 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}


Quaternion Norm


Erinnern Sie sich an die Definition der Norm einer komplexen Zahl:

\ begin {array} {rcl} | z | & = & \ sqrt {a ^ 2 + b ^ 2} \\ zz ^ * & = & | z | ^ 2 \ end {array}


In ähnlicher Weise ist die Norm (oder Größe) einer Quaternion definiert als:

\ begin {array} {rcl} q & = & [s, \ mathbf {v}] \\ | q | & = & \ sqrt {s ^ 2 + v ^ 2} \ end {array}


Was uns erlaubt, die Quaternionsnorm wie folgt auszudrücken:

qq=|q|2


Quaternion-Normalisierung


Mit einer Definition der Quaternion-Norm können wir sie verwenden, um die Quaternion zu normalisieren. Quaternion wird durch Teilen durch normalisiert |q| ::

q prime= fracq sqrts2+v2


Normalisieren wir zum Beispiel die Quaternion:

q=[1,4 mathbfi+4 mathbfj4 mathbfk]


Zuerst müssen wir die Quaternionsrate berechnen :

\ begin {array} {rcl} | q | & = & \ sqrt {1 ^ 2 + 4 ^ 2 + 4 ^ 2 + (- 4) ^ 2} \\ & = & \ sqrt {49} \\ & = & 7 \ end {array}


Dann müssen wir die Quaternion durch die Norm der Quaternion teilen, um die normalisierte Quaternion zu berechnen:

\ 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}


Umgekehrte Quaternion


Die umgekehrte Quaternion wird als bezeichnet q1 . Um die inverse Quaternion zu berechnen, nehmen wir die konjugierte Zahl der Quaternion und dividieren sie durch das Quadrat der Norm:

q1= fracq|q|2


Um dies zu zeigen, können wir die inverse Definition verwenden:

qq1=[1, mathbf0]=1


Und multipliziere beide Seiten mit der konjugierten Zahl des Quaternions, die uns geben wird:

qqq1=q


Durch Substitution erhalten wir:

\ begin {array} {rcl} | q | ^ {2} q ^ {- 1} & = & q ^ {*} \\ q ^ {- 1} & = & \ cfrac {q ^ {*}} {| q | ^ {2}} \ end {array}


Für einzelne Quaternionsnormen, deren Norm 1 ist, können wir schreiben:

q1=q


Quaternion Scalar Produkt


Ähnlich wie beim Skalarprodukt von Vektoren können wir das Skalarprodukt zweier Quaternionen berechnen, indem wir die entsprechenden Skalarteile multiplizieren und die Ergebnisse zusammenfassen:

\ 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}


Wir können auch das Skalarprodukt von Quaternionen verwenden, um die Winkeldifferenz zwischen Quaternionen zu berechnen:

 cos theta= fracs1s2+x1x2+y1y2+z1z2|q1||q2|


Für einzelne Quaternionsnormen können wir die Gleichung vereinfachen:

 cos theta=s1s2+x1x2+y1y2+z1z2


Dreht sich


Ich möchte Sie daran erinnern, dass wir eine spezielle Form einer komplexen Zahl namens Rotor identifiziert haben, mit der ein Punkt auf einer zweidimensionalen Ebene wie folgt gedreht werden kann:

q= cos theta+i sin theta


Aufgrund der Ähnlichkeit komplexer Zahlen mit Quaternionen sollte es möglich sein, eine Quaternion auszudrücken, mit der ein Punkt im dreidimensionalen Raum gedreht werden kann:

q=[ cos theta, sin theta mathbfv]


Lassen Sie uns überprüfen, ob diese Theorie wahr ist, indem wir das Quaternionsprodukt berechnen q und Vektor  mathbfp . Erstens können wir ausdrücken  mathbfp als reine Quaternion wie folgt:

p=[0, mathbfp]


A. q Ist eine einzelne Quaternionsnorm in der Form:

q=[s, lambda mathbf hatv]


Dann

\ 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}


Wir sehen, dass das Ergebnis eine häufige Quaternion mit Skalar- und Vektorteilen ist.

Schauen wir uns zunächst einen „Sonderfall“ an, in dem  mathbfp senkrecht  mathbf hatv . In diesem Fall das Mitglied des Skalarprodukts  lambda mathbf hatv cdot mathbfp=0 und das Ergebnis wird reine Quaternion:

p prime=[0,s mathbfp+ lambda mathbf hatv times mathbfp]


In diesem Fall drehen  mathbfp in Bezug auf  mathbf hatv wir ersetzen nur s= cos theta und  lambda= sin theta .

p prime=[0, cos theta mathbfp+ sin theta mathbf hatv times mathbfp]


Drehen wir zum Beispiel den Vektor  mathbfp 45 ° relativ zur Z-Achse; dann unsere Quaternion q wird gleich sein:

\ begin {array} {rcl} q & = & [\ cos \ theta, \ sin \ theta \ mathbf {k}] \\ & = & \ left [\ frac {\ sqrt {2}} {2}, \ frac {\ sqrt {2}} {2} \ mathbf {k} \ right] \ end {array}


Und nehmen wir einen Vektor  mathbfp was sich auf einen Sonderfall bezieht, in dem  mathbfp senkrecht  mathbfk ::

p=[0.2 mathbfi]


Jetzt lass uns ein Stück finden

qp

::

\ begin {array} {rcl} p ^ {\ prime} & = & qp \\ & = & \ left [\ frac {\ sqrt {2}} {2}, \ frac {\ sqrt {2}} { 2} \ mathbf {k} \ right] [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}


Was uns ein sauberes Quaternion gibt, das um 45 ° um die Achse gedreht ist  mathbfk . Wir können auch sicherstellen, dass der Wert des endgültigen Vektors erhalten bleibt:

\ begin {array} {rcl} | \ mathbf {p} ^ {\ prime} | & = & \ sqrt {\ sqrt {2} ^ {2} + \ sqrt {2} ^ {2}} \\ & = & 2 \ end {array}


Genau das, was wir erwartet hatten!

Wir können dies grafisch mit dem folgenden Bild zeigen:


Quaternion drehen (1)

Betrachten wir nun eine Quaternion, die nicht orthogonal zu ist  mathbfp . Nehmen wir für den Vektorteil der Quaternion einen Versatz von 45 ° von  mathbfp dann bekommen wir:

\ 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}


Und unseren Vektor multiplizieren  mathbfp auf q wir bekommen:

\ 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}


Nach der Substitution  mathbf hatv ,  mathbfp und  theta=45 circ wir bekommen:

\ 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}


Das heißt, es ist keine reine Quaternion mehr, es wird nicht um 45 ° gedreht und die Norm des Vektors ist nicht mehr gleich 2 (sie hat sich auf verringert  sqrt3 )

Dieses Ergebnis kann grafisch dargestellt werden.


Quaternion Turn (2)

Genau genommen ist es falsch, eine Quaternion darzustellen p prime im dreidimensionalen Raum, weil es tatsächlich ein vierdimensionaler Vektor ist! Der Einfachheit halber werde ich nur die Vektorkomponente der Quaternionen zeigen.

Es ist jedoch nicht alles verloren. Hamilton fand heraus (veröffentlichte dies aber nicht), dass wenn wir dann das Ergebnis multiplizieren qp auf den entgegengesetzten Wert q Dann ist das Ergebnis eine reine Quaternion und die Norm der Vektorkomponente bleibt erhalten. Mal sehen, ob dies in unserem Beispiel angewendet werden kann.

Lassen Sie uns zuerst berechnen 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}


Bei  theta=45 circ wir bekommen:

\ 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}


Den vorherigen Wert kombinieren qp und q1 wir bekommen:

\ begin {array} {rcl} qp & = & \ left [-1, \ sqrt {2} \ mathbf {i} + \ mathbf {j} \ right] \\ qpq ^ {- 1} & = & \ links [-1, \ sqrt {2} \ mathbf {i} + \ mathbf {j} \ rechts] \ frac {1} {2} \ links [\ 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} \ right) - \ 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} \ rechts] \ end {array}


Welches ist reine Quaternion, und die Norm des Ergebnisses ist:

\ begin {array} {rcl} | p ^ {\ prime} | & = & \ sqrt {1 ^ 2 + \ sqrt {2} ^ 2 + 1 ^ 2} \\ & = & \ sqrt {4} \\ & = & 2 \ end {array}


das ist gleich  mathbfp Das heißt, die Norm des Vektors bleibt erhalten.

Das Bild unten zeigt das Ergebnis der Drehung.


Quaternion Turn (3)

Wir sehen, dass das Ergebnis eine reine Quaternion ist und die Norm des ursprünglichen Vektors erhalten bleibt, aber der Vektor um 90 ° gedreht wurde, nicht um 45 °, was doppelt so viel ist wie nötig! Daher für die korrekte Drehung des Vektors  mathbfp an der Ecke  theta relativ zu einer beliebigen Achse  mathbf hatv Wir müssen den halben Winkel nehmen und die folgende Quaternion erstellen:

q= left[ cos frac12 theta, sin frac12 theta mathbf hatv right]


Was ist eine allgemeine Ansicht einer Quaternion, die sich dreht!

Quaternion-Interpolation


Einer der wichtigsten Gründe für die Verwendung von Quaternionen in der Computergrafik ist, dass Quaternionen Rotationen im Raum sehr gut beschreiben. Quaternionen eliminieren die Last anderer Arten von Wendepunkten im 3D-Raum, wie z. B. Faltrahmen , bei denen das Problem darin besteht, die Drehung in den Eulerecken darzustellen.

Mithilfe von Quaternionen können wir verschiedene Methoden definieren, die die Rotationsinterpolation im 3D-Raum darstellen. Die erste Methode, die ich in Betracht ziehe, heißt SLERP . Es wird verwendet, um einen Punkt zwischen zwei Ausrichtungen reibungslos zu interpolieren. Die zweite Methode ist eine Entwicklung von SLERP und heißt SQUAD . Es wird verwendet, um entlang einer Reihe von Ausrichtungen zu interpolieren, die den Pfad angeben.

SLERP


SLERP steht für Spherical L inear Interpolation (sphärische lineare Interpolation). SLERP bietet die Möglichkeit, einen Punkt zwischen zwei Ausrichtungen reibungslos zu interpolieren.

Ich werde die erste Orientierung als bezeichnen q1 und der zweite als q2 . Der interpolierte Punkt wird mit bezeichnet  mathbfp wird der interpolierte Punkt mit bezeichnet  mathbfp prime . Interpolationsparameter t wird interpolieren  mathbfp von q1 bei t=0 vorher q2 bei t=1 .

Die Standardformel für die lineare Interpolation lautet:

 mathbfp prime= mathbfp1+t( mathbfp2 mathbfp1)


Hier sind die grundlegenden Schritte zum Anwenden dieser Gleichung:

  • Wir berechnen die Differenz zwischen  mathbfp1 und  mathbfp2 .
  • Nehmen Sie den Bruchteil dieser Differenz.
  • Korrigieren Sie den Anfangswert um die Bruchdifferenz zwischen den beiden Punkten.

Wir können dasselbe Grundprinzip verwenden, um zwischen zwei Orientierungen von Quaternionen zu interpolieren.

Quaternionsunterschied


Der erste Schritt bedeutet, dass wir die Differenz zwischen berechnen müssen q1 und q2 . Im Zusammenhang mit Quaternionen ähnelt dies der Berechnung der Winkeldifferenz zwischen zwei Quaternionen.

 Deltaq=q11q2


Eine Quaternion zu einer Macht erheben


Der nächste Schritt besteht darin, den Bruchteil dieser Differenz zu nehmen. Wir können den Bruchteil des Quaternions berechnen, indem wir ihn auf eine Potenz erhöhen, deren Wert im Bereich liegt [0...1] .

Die allgemeine Formel zum Erhöhen einer Quaternion zu einer Macht hat die folgende Form:

qt= exp(t logq)


Wo die Exponentialfunktion für Quaternionen so aussieht:

\ begin {array} {rcl} \ exp (q) & = & \ exp \ left ([0, \ theta \ mathbf {\ hat {v}}] \ right) \\ & = & [\ cos \ theta , \ sin \ theta \ mathbf {\ hat {v}}] \ end {array}


Und der Logarithmus einer Quaternion hat die Form:

\ 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}


Bei t=0 wir haben folgendes:

\ 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}


Und wann t=1 wir haben

\ begin {array} {rcl} q ^ 1 & = & \ exp (\ log {q}) \\ & = & q \ end {array}


Bruchteil der Quaternionen


Um die interpolierte Winkeldrehung zu berechnen, ändern wir die Anfangsorientierung q1 auf den Bruchteil der Differenz zwischen q1 und q2 .

q prime=q1 left(q11q2 right)t


Was ist eine allgemeine Ansicht der sphärischen linearen Interpolation für Quaternionen? Dies ist jedoch nicht die Art von SLERP- Gleichung, die üblicherweise in der Praxis verwendet wird.

Wir können eine ähnliche Formel anwenden, um eine sphärische Interpolation von Vektoren in Quaternionen durchzuführen. Die allgemeine Form der sphärischen Interpolation für Vektoren ist wie folgt definiert:

 mathbfvt= frac sin(1t) theta sin theta mathbfv1+ frac sint theta sin theta mathbfv2


Grafisch kann dies im folgenden Bild gezeigt werden.


Quaternion Interpolation

Diese Formel kann ohne Änderungen auf Quaternionen angewendet werden:

qt= frac sin(1t) theta sin thetaq1+ frac sint theta sin thetaq2


Und wir können den Winkel bekommen  theta Berechnung des Skalarprodukts q1 und 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}


Zu berücksichtigende Faktoren


Diese Implementierung weist bei der Verwendung zwei Probleme auf.

Erstens, wenn sich herausstellt, dass das Skalarprodukt von Quaternionen ein negativer Wert ist, wird die Interpolation auf der vierdimensionalen Kugel den langen Weg gehen, und dies ist nicht immer wünschenswert.Um dieses Problem zu lösen, können wir das Ergebnis des Skalarprodukts überprüfen. Wenn es negativ ist, können wir den Wert annehmen, der einer der Orientierungen entgegengesetzt ist. Das Invertieren der Skalar- und Vektorteile des Quaternions ändert nicht die Ausrichtung, die sie darstellen. Auf diese Weise garantieren wir jedoch, dass die Drehung entlang des „kürzesten“ Pfades erfolgt.

Ein weiteres Problem ergibt sich, wenn der Winkeldifferenz zwischenq1 und q2 sehr klein, während sinθ wird 0. Wenn dies passiert, dann dividieren durch sinθWir können ein ungewisses Ergebnis erzielen. In diesem Fall können Sie zur linearen Interpolation zwischen zurückkehrenq1 und q2 .

Kader


So wie Slerp kann zur Interpolation zwischen zwei Quaternionen verwendet werden, SQUAD ( S pherical und Quad rangle - sphärisch und viereckigen) für glatte Interpolation Kurvenpfad verwendet werden.

Wenn wir eine Reihe von Quaternionen haben:

q1,q2,q3,,qn2,qn1,qn


Und wir haben die "Hilfs" -Quaternion definiert ( si ), die wir als Zwischenkontrollpunkt betrachten können:

si=exp(log(qi+1q1i)+log(qi1q1i)4)qi


Die Ausrichtung entlang eines Teils der Kurve ist definiert als:

qi1,qi,qi+1,qi+2


zum Zeitpunkt t gibt uns dies:

squad(qi,qi+1,si,si+1,t)=slerp(slerp(qi,qi+1,t),slerp(si,si+1,t),2t(1t))


Fazit


Trotz der Schwierigkeit zu verstehen, bieten Quaternionen beim Arbeiten mit Kurven einige offensichtliche Vorteile gegenüber Euler-Matrizen und -Winkeln.

  • SLERP SQUAD .
  • , , .
  • - . , ( , ).
  • , .
  • 4 (3, . ), 9 .

Neben allen Vorteilen der Verwendung von Quaternionen gibt es jedoch auch mehrere Nachteile.

  • Quaternionen können aufgrund eines Rundungsfehlers von Gleitkommazahlen ungültig werden. Dieser "Fehler" kann jedoch durch Renormierung der Quaternion beseitigt werden.
  • Das wahrscheinlich bedeutendste Hindernis für die Verwendung von Quaternionen ist die hohe Komplexität ihres Verständnisses. Ich hoffe, Sie lösen dieses Problem, indem Sie meinen Artikel lesen.

Es gibt viele Mathematikbibliotheken, die Quaternionen implementieren, und nur einige von ihnen implementieren Quaternionen korrekt. Nach meiner eigenen Erfahrung ist GLM (OpenGL Math Library) eine gute Mathematikbibliothek mit einer qualitativ hochwertigen Implementierung von Quaternionen . Wenn Sie Quaternionen in Ihren eigenen Anwendungen verwenden möchten, empfehle ich diese Bibliothek.

Demo herunterladen


Ich habe eine kleine Demo erstellt, die die Verwendung einer Quaternion zum Drehen eines Objekts im Raum demonstriert. Die Demo wurde in Unity 3.5.2 erstellt. Sie können diese Engine kostenlos herunterladen und den Quellcode der Demo anzeigen. Die Zip-Datei enthält auch die ausführbare Windows-Binärdatei. In Unity können Sie jedoch auch eine Anwendung für den Mac erstellen.

Grundlegendes zu quaternions.zip

Referenzen


Quaternionen für Computergrafik

Vince, J (2011). Quaternionen für Computergrafik. 1 .. ed. London: Springer.



Dunn, F. und Parberry, I. (2002). 3D Math Primer für Grafik und Spieleentwicklung. 1 .. ed. Plano, Texas: Wordware Publishing, Inc.

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


All Articles