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
- 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)=(a1−a2)+(b1−b2)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 FlugzeugKomplexe 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 EbeneWie 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 EbeneJetzt 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 , mathbfkiDas 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 mathbfj−4 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
q−1 . Um die inverse Quaternion zu berechnen, nehmen wir die konjugierte Zahl der Quaternion und dividieren sie durch das Quadrat der Norm:
q−1= fracq∗|q|2
Um dies zu zeigen, können wir die inverse Definition verwenden:
qq−1=[1, mathbf0]=1
Und multipliziere beide Seiten mit der konjugierten Zahl des Quaternions, die uns geben wird:
q∗qq−1=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:
q−1=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
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}
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
q−1 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=q−11q2
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(q−11q2 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(1−t) theta sin theta mathbfv1+ frac sint theta sin theta mathbfv2
Grafisch kann dies im folgenden Bild gezeigt werden.
Quaternion InterpolationDiese Formel kann ohne Änderungen auf Quaternionen angewendet werden:
qt= frac sin(1−t) 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,⋯,qn−2,qn−1,qn
Und wir haben die "Hilfs" -Quaternion definiert ( si ), die wir als Zwischenkontrollpunkt betrachten können:si=exp(−log(qi+1q−1i)+log(qi−1q−1i)4)qi
Die Ausrichtung entlang eines Teils der Kurve ist definiert als:qi−1,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(1−t))
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.zipReferenzen

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