Universität Osnabrück Fachbereich Informatik Quaternionen Vortrag gehalten: Eugenia Schwamberger Seminar Computergrafik betreut von Dipl.-Phys. Olaf Mueller [email protected] Wintersemester 2002/2003 Vortrag vom 3.12.2002 1 Inhalt I. Komplexe Zahlen.............................................3 II. Quaternionen....................................................3 III. Transformation mit Quaternionen.....................6 IV. Matrix Conversion............................................7 V. Sphärische lineare Interpolation......................11 VI. Vorteile und Nachteile....................................12 VII. Anhang A........................................................13 VIII. Anhang B........................................................13 IX. Literatur..........................................................14 2 I. Komplexe Zahlen Neben dem Körper der reellen Zahlen spielt noch der Körper der komplexen Zahlen eine wichtige Rolle. Mit der Hilfe komplexen Zahlen lassen sich sehr viele Zusammenhänge einfacher und übersichtlicher gestalten. Definition Es sei C = R*R – das kartesische Produkt. An der Stelle des geordneten Tupels (x, y) schreiben wir x + iy ∈ C für x, y ∈ R. Auf dieser so definierten Menge der komplexen Zahlen definieren wir eine Addition und eine Multiplikation durch (x + iy) + (u + iv) = (x + u) + i(y + v) (x + iy) * (u + iv) = (xu – yv) + i(xv + yu). Ist z = x + iy ∈ C mit x, y ∈ R so heißt x der Realteil von z: x = Rez und y der Imaginärteil von z: Imz. (C, +, *) ist ein kommutativer Körper mit 1 = 1 + i0 als Einselement der Multiplikation Für z = x + iy ∈ C definieren wir den Betrag |z| und die konjugiert komplexe Zahl z durch |z| = x ² + y ² , z = x – iy. II. Quaternionen Quaternionen wurden schon im Jahr 1843 von W. R. Hamilton als Erweiterung von Komplexen Zahlen beschrieben, aber erst 1995 wurden sie von Shoemake im Feld der Computergrafik eingeführt. In manchen Bereichen sind Quaternionen besser als Euler Winkel bzw. Matrizen, vor allem, wenn es zu Rotation und Orientierung kommt. Ein Quaternion hat 4 Komponenten, deshalb wählen wir seine Darstellung in Form eines Vektors. Wir beginnen mit dem mathematischen Hintergrund von Quaternionen. Mathematischer Hintergrund Definition. Die folgenden Definitionen sind äquivalent: q = ( qv, qw ) = (qx, qy, qz, qw) = i ⋅ qx + j ⋅ qy + k ⋅ qz + qw mit qx, qy, qz, qw ∈R und i ⋅ i = -1; j ⋅ j = -1; k ⋅ k = -1; i ⋅ j = - j ⋅ i = k; k ⋅ i = -i ⋅ k = j; j ⋅ k = - k ⋅ j = i. 3 * i j k i -1 k j -k -1 i k j -i -1 -j Tabelle 1 Hamilton suchte 15 Jahre lang nach einer geeigneten Multiplikation in der vierten Dimension. Auf einem Spaziergang kam ihm dann die geniale Idee, einfach auf das Kommutativgesetz zu verzichten. Er ritzte sofort diese Formeln in einen Stein auf der Brougham Bridge. Den Vektor qv = (qx, qy, qz) nennt man den imaginären Teil und qw den reellen Teil des Quaternions q Vektoren und Skalare können in der Form: v = (v, 0) und s = (0, s) geschrieben werden. Für den imaginären Teil können wir Vektoroperationen wie Addition, Skalierung, Produkt, Kreuzprodukt und mehr benutzen. Wie aus der Verknüpfungstabelle ersichtlich wird, ist die Multiplikation nicht kommutativ Die Quaternionen bilden also einen Schiefkörper. (Siehe: Anhang A) Wir betrachten die Multiplikation von zwei Quaternionen q und r: q r = (i qx + j qy + k qz + qw )x(i rx + j ry + k rz + rw) = i (qyrz – qzry + qxrw – qwrx) + j (-qxrz + qzrx + qyrw + qwry) + k (qxry – qyrx + qzrw – qwrz) + qwrw - qxrx - qyry – qzrz = (qvxrv + rwqv + qwrv, qwrw – qvrv) (i) (Definitionen von Skalar- und Vektorprodukt im Anhang B). Weiter definieren wir für Quaternionen: die Addition, konjugierte Quaternion, der Norm und die Identität. Die Addition: q + r = (q , q ) + (r , r ) =(q + r , q + r ) v w v w v v w w Konjugierter Quaternion: q* = (qv, qw)* = ( - qv, qw) Die Norm: N(q) N(q) = q q* = q* q = qv qv + qw² = qx² + qy² + qz² + qw² Die Norm von q ist manchmal notiert als ||q||² = Ν(q). Die Identität: I = (0, 1) 4 Eine Folge von den obigen Gleichungen ist die multiplikative Inverse, bezeichnet mit q-1. Behauptung: Die zu einem Quaternion q multiplikative Inverse ist: q-1 = q*/N(q) Beweis: Für die Inverse gilt die Gleichung q-1 * q = q * q-1 Wir leiten diese Formel von der Definition der Normen her. q-1 · q = q · q-1 = 1 gilt für Inverse N(q) = q · q* ⇔ 1 = (q · q* ) / N(q) => q-1 = q*/N(q) In dieser Formel braucht man ein Skalarprodukt, das wir schon in Formel (i) betrachten haben s * q = (o, s) * (gv , qw) = (s * gv , s * qw) und q * s = (gv , qw) * (0, s) = (gv * s , qw * s) = (s * gv , s * qw), dies bedeutet, dass das Skalarprodukt kommutativ ist: s * q = q * s = (s * gv , s * qw). Die folgenden Regeln stammen aus der Definition: Regeln für Konjugierte Quaternionen: (q*)* = q (q + r)* = q* + r* (q r)* = r* q* Regeln für die Norm: N(q*) = N(q) N(q r) = N(q) N(r) Gesetzte für Multiplikation: Distributivgesetze p (s q + t r) = s p q + t p r wobei p, q, r Quaternionen sind, und s, t - Skalaren (s p + t q) r = s p r + t q r Assoziativität p (q r) = (p q) r Quaternionen mit N(q) = 1 heißen Einheitsquaternionen. Deshalb schreiben wir Quaternion q weiter als q = (sinφ * uq, cosφ) für solch einen dreidimensionalen Vektor uq, für den gilt N(uq) = 1, weil N(q) = n(uq sinφ, cosφ) = sin² φ (uq uq) + cos² φ = sin² φ + cos² φ = 1 Die Menge aller Einheitsquaternionen bildet eine Einheitssphäre im vierdimensionalen Raum. 5 III. Transformation mit Quaternionen Zuerst setzen wir vier Koordinaten von einem Vektor p= (px, py, pz, pw)T in die Komponenten von einem Quaternion qp ein und nehmen an, dass wir einen Einheitsquaternion q haben mit: (ii) q = (sinφ * uq, cosφ). Sei P ein Punkt im dreidimensionalen Raum, dargestellt durch einen Quaternion p = (qx, qy, qz, qw), außerdem sei q ein Quaternion, der ungleich Null ist. Dann gilt: Das Produkt q p q-1 führt p = ( qv, qw ) nach p´ = ( qv´, qw ) über, wobei N(v) = N(v´) ist. Die Länge des Vektors hat sich nicht geändert. Jede Vielfache(!= 0) von q gibt dasselbe Ergebnis. Die Potenz eines Quaternions q ist qt und bedeutet geometrisch eine t-fache Drehung wie q. Wenn N(q) = 1 ist, dann ist q = (sinφ * uq, cosφ) eine Rotation um eine Achse uq mit dem Winkel 2φ, oder mit anderen Worten: Das Produkt q p q-1 rotiert p (und auch der Punkt P) um die Achse uq mit dem Winkel 2φ. Beispiel: Der Punkt P(0, 2, 6) soll um 60° bzgl. der z-Achse rotiert werden. p = 0i + 2j + 6k, q = (uqsinφ, cosφ), uq= (0, 0, -1), φ = 30° => q = (- 0.5k + cos30°) = (√3/2 – 0.5k) = q* = (√3 / 2 + 0.5k) Berechne q p q* q p q* = (√3/2-0.5k)(2j + 6k)( √3/2 + 0.5k) = (i + √3j + 3 √3k + 0.5 · 6)( √3/2 + 0.5k) = (√3i + j +6k) Wenn man das Ergebnis in die Vektorschreibweise überführt, erhält man P‘ = (1.73 1 6)T Vergleiche mit den Berechnungen aus der CG - Vorlesung: http://www-lehre.inf.uos.de/~cg/2002/Aufgaben/Blatt7/blatt/node1.html 6 IV. Matrix Conversion (Konvertierung) Da manche Systeme Matrixmultiplikation in Hardware implementiert haben, betrachten wir die Konvertierung eines Quaternions in eine Matrix und umgekehrt. Es kann bewiesen werden, dass ein Quaternion q in eine Matrix Mq folgendermaßen konvertiert werden kann: Mq = 1-s(qy² +qz²) s(qxqy + qwqz) s(qxqz - qwqy) 0 s(qxqy - qwqz) 1-s(qx² +qz²) s(qyqz + qwqx) 0 s(qxqz + qwqy) 0 s(qyqz – qwqx) 0 1-s(qx² +qy²) 0 0 1 Hier ist der Skalar s= 2/N(q). Für Einheitsquaternionen ist diese Matrix einfacher: Mq = 1-2(qy² +qz²) 2(qxqy + qwqz) 2(qxqz - qwqy) 0 2(qxqy - qwqz) 1-2(qx² +qz²) 2(qyqz + qwqx) 0 2(qxqz + qwqy) 2(qyqz – qwqx) 1-2(qx² +qy²) 0 0 0 0 1 Wie bekommt man diese Matrix? Es sei gegeben Vektor p = (px, py, pz, 0) = ipx + jpy + kpz + 0 und Einheitsquaternion q = (uqsinφ, cosφ) = (qx, qy, qz, qw) = uxsinφ + uysinφ + uz sinφ + cosφ. Dann ist q-1 = - uxsinφ - uysinφ - uz sinφ + cosφ (laut Definition). Wir berechnen das Produkt q p q-1 Es sei nun: a = cosφ = qw, b = uxsinφ = qx, (iii) c = uysinφ = qy, d = uz sinφ = qz; Dann gilt q p q-1 = (ib + jc + kd + a) (ipx + jpy + kpz + 0) (- ib - jc - kd + a) Nachdem wir ausmultipliziert, reelle und imaginäre Faktoren gruppiert, die imaginären Produkte bestimmt und sortiert haben, bekommen wir folgendes: 7 q p q-1 = (ib + jc + kd + a) (ipx + jpy + kpz + 0) (- ib - jc - kd + a) = ((b² – c² – d² + a²) px + 2(bc – ad ) py + 2(ac + bd)pz ) i + (2(ad + bc) px + (- b² + c² – d² + a²) py +2(cd - ab)pz ) j + (2(bd - ac) px + 2(ab + cd)py + (- b² - c² + d² + a²) px )k Dies lässt sich dann auch in Matrixform schreiben: M= b² – c² – d² + a² 2(bc – ad ) 2(ac + bd) px 2(ad + bc) - b² + c² – d² + a² 2(cd - ab) py 2(bd - ac) 2(ab + cd) - b² - c² + d² + a² pz Nach dem Einsetzen von a = qw, b = qx, c = qy, d = qz und aufgrund von qx² + qy² + qz² + qw² = 1 ist die Matrix M = Mq. Wir wollen zeigen, dass diese Matrix tatsächlich eine Rotationsmatrix ist. Die Strategie dabei ist, die einzelnen Elemente der Matrix M durch Einsetzen der Werte für a, b, c und d auszurechnen (die Formeln (iii)) und das Ergebnis dann mit einer bekanten Rotationsmatrix zu vergleichen. Erinnern wir uns an die wichtigen Sinus- und Kosinusbeziehungen: (1) sin (2α) = 2sinα cosα (2) cos (2α) = cos²α - sin²α (3) sin²α + cos²α = 1 (4) 2 sin²α = 1 – cos(2α) Außerdem soll (ux, uy, uz ) laut der Annahme ein Einheitsvektor sein, d.h. (5) ux² + uy² + uz² = 1 Also, b² – c² – d² + a² = ux² sin²φ - uy² sin²φ - uz² sin²φ + cos²φ = sin²φ( ux² - uy² - uz²) + cos²φ (nach 5) = sin²φ( 2ux² - 1) + cos²φ = cos²φ - sin²φ + 2 ux² sin²φ (nach 2 und 4) = cos(2φ) + (1 - cos(2φ)) ux² analog gilt es für die anderen Diagonalelemente: - b² + c² – d² + a² = cos(2φ) + (1 - cos(2φ)) uy² 8 - b² – c² + d² + a² = cos(2φ) + (1 - cos(2φ)) uz² Für das mittlere Element der oberen Zeile von M ergibt sich: 2(bc – ad ) = 2(ux sinφ uy sinφ - cosφ uz sinφ) = 2 sin²φ ux uy - 2 sinφ cosφ uz = (1 – cos(2φ)) ux uy - sin(2φ) uz analog für die übrigen Elemente ist: 2(ac + bd) = (1 – cos(2φ)) ux uz + sin(2φ) uy 2(ad + bc) = (1 – cos(2φ)) ux uy + sin(2φ) uz 2(cd - ab) = (1 – cos(2φ)) uy uz - sin(2φ) ux 2(bd - ac) = (1 – cos(2φ)) ux uz - sin(2φ) uy 2(ab + cd) = (1 – cos(2φ)) uy uz + sin(2φ) ux Wir definieren zusätzlich folgende Abkürzungen: r = cos(2φ) s = sin(2φ) t = 1-cos(2φ) Damit erhalten wir für M insgesamt: M= r + t ux² t ux uy - s uz t ux uz + s uy t ux uy + s uz r + t uy² t uy uz - s ux t ux uz - s uy t uy uz + s ux r + t uz² Und dies ist genau die Matrix, die man aus dem im Skript angegebenen Produkt für Rotationen um den Vektor (ux, uy, uz ) und den Winkel 2φ bekommt. Die Rückwärtsumrechnung ist komplizierter. Schlüssel dieses Prozesses sind folgende Differenzen: m21q - m12q = 4qwqx m02q - m20q = 4qwqy m10q - m01q = 4qwqz (*) (wobei mij sind Elemente von Matrix M) d.h. wenn qw bekannt ist, können wir qx, qy, qz berechnen. Der „trace“ einer Matrix M - tr(M) ist die Summe der Diagonalelemente der Matrix M, also tr(Mq) = 4- 2s(qx² +qy² +qz²) = 4 *(1- (qx² +qy² +qz²) / (qx² +qy² + qz² + qw²)) = 4qw² / (qx² +qy² + qz² + qw²) = 4qw² / N(q) Dieses Resultat liefert die folgende Umrechnung die Komponenten für Quaternionen: 9 qw = 0.5 √tr (Mq) qx = (m21q - m12q) / 4qw qy = (m02q - m20q) / 4qw qz = (m10q - m01q) / 4qw (**) Diese Art der Berechnung macht keinen Sinn, wenn der Skalaranteil qw = 0 wird (bei φ = 90°). Wir gehen dann nach von der Ken Shoemake vorgeschlagenen Sonderfallbehandlung vor. Wir berechnen alle Komponenten des Quaternions auf folgende Weise: qw² = 0.25 tr (Mq) = 0.25(1 + m11 + m22 + m33) TRUE qw = √ qw² qx = (m21q - m12q) / 4qw qy = (m02q - m20q) / 4qw qz = (m10q - m01q) / 4qw qw² > ε ? (the machine precision) FALSE qw = 0 qx² = - 0.5 (m22 + m33) TRUE qx² > ε ? qx = √qx² qy = m01q / 2qx qz = m02q / 2qx FALSE qx = 0 qy² = 0.5 (1 - m33) TRUE qy² > ε ? qy = √ qy² qz = m12q / 2qy FALSE y=0 z=1 Es sind also nicht mehr als eine Quadratwurzel, drei Divisionen und wenig Additionen für eine Konvertierung notwendig. 10 V. Sphärische lineare Interpolation Wir befassen uns weiter mit der Interpolation im Quaternionenraum. Es sei gegeben: Einheitsquaternionen q und r und ein Parameter t∈ [0, 1]. Die gesamte Gruppe von Rotationen einer Oberfläche kann der vierdimensionalen EinheitsHypersphäre im Quaternionenraum zugeordnet werden. Eine einfache lineare Interpolation zwischen den beiden Quaternionen führt zu einer Bewegung, die in der Mitte beschleunigt, da wir uns nicht entlang der Oberfläche, sondern quer durch die Hypersphäre bewegen. Um eine gleichmäßige Rotation zu erreichen müssen wir eine Sphärische Lineare Interpolation (SLERP) anwenden, bei der wir uns an einem Bogen entlang bewegen, der den zwei Quaternionen durchläuft. Abb.1 Eine zweidimensionale Analogie zeigt den Unterschied zwischen einer einfachen linearen Interpolation und einer SLERP. Abb. 2 Die SLERP - Funktion berechnet für t ∈ [0, 1] die kürzeste Verbindung (Großkreis) auf der vierdimensionalen Einheitssphäre zwischen q und r. Abb. 2: Eine dreidimensionale Analogie der Verwendung von SLERP zur Interpolation zwischen zwei Quaternionen q und r. 11 Eine Formel für die SLERP von q zu r mit dem Parameter t kann man auf zwei verschiedenen Arten betrachten. Die algebraische Form dieser Operation ist die äußere Komposition zweier Quaternionen q und r und einem Parameter t geschrieben als: s (q, r, t) = q (rq-1)t, welche für die vierdimensionale Geometrie dazu kommt: s (q, r, t) = SLERP (q, r, t) = q ⋅ sin(ϕ(1 –t)) / sinϕ + r ⋅ sin(ϕt) / sinϕ, wobei q ⋅ r = cosϕ ist. (Diese Formel wurde von Glenn Davis vorgeschlagen.) Die erste Formel ist für Untersuchungen und Analyse brauchbar, wobei die zweite mehr für die praktische Anwendungen geeignet ist. SLERP ist z. B. nützlich für die Animation von Objekten, aber nicht nützlich für die Interpolation von Kameraorientierungen, wenn sich der „up“ – Vektor der Kamera ändert. VI. Nachteile und Vorteile Nachteile • Mit Quaternionen kann man nur Rotationen berechnen. Aus diesem Grund verwendet man am besten Matrizen und Quaternionen, was dann wieder die Umrechnungen erfordert, die wiederum Rechnerzeit kosten. • Nicht geeignet für Interpolation von Kameraorientierungen, wenn sich der „up“ – Vektor der Kamera ändert. Vorteile • Die Rotation erfolg direkt um die gewünschte Drehachse. Bei dem Matrizenverfahren braucht man sieben Transformationen durchzuführen. • Es kann mit dem Verfahren wie SLERP zwischen zwei Orientierungen interpoliert werden. • Die Verkettung zweier Transformationen a und b mit Quaternionen ist effizienter. Beim Matrizenverfahren berechnet man das Matrixprodukt Ra ⋅ Rb. Dies ist für zwei 3 x 3 Matrizen 3x3x3 = 21 Multiplikationen und 3x3x2 = 18 Additionen notwendig. Für die Rotationen mit Quaternionen muss qa ⋅ (qb ⋅ p ⋅ qb-1 ) ⋅ qa-1 = (qa ⋅ qb )⋅ p ⋅ (qa ⋅ qb) berechnet werden. Das Quaternionenprodukt qa ⋅ qb kostet 4x4 = 16 Multiplikationen und 4x3 = 12 Additionen. Für die Berechnung qa ⋅ qb müssen nur drei Vorzeichenbits invertiert werden. 12 VII. Anhang A Körper • • • • • • Sei (K, +, *) eine Menge mit zwei Verknüpfungen. K ist ein Körper, wenn Assoziativgesetz der Multiplikation und der Addition gilt Kommutativgesetz der Multiplikation und der Addition gilt Nullelement und Einselement existieren Inverse der Addition existiert Inverse der Multiplikation existiert Schiefkörper • Die Multiplikation ist nicht kommutativ VIII. Anhang B Vektorprodukt • • • • |v×u| = |v|·|u| · sin(v, u) v×u ist orthogonal zu v und u Bilden ein Rechtsystem in der Reihenfolge: v, u, v×u. Skalarprodukt • u · v = |v|·|u| · cos(v, u) 13 IX. Literatur • Tomas Möller, Erik Haines: Real – Time Rendering. 1999 by AK Peters. • Alan Watt: 3D – Computergrafik. 2002 by Pearson Studium. • B.L. van der Waerden: Hamiltons Entdeckung der Quaternionen.(erweiterte Fassung eines Vortrags gehalten im Hamburg von der Joachim – Jungius – Gesellschaft der Wissenschaften am 26. Juni 1973) • Peter Meyer-Nieberg: Analysis I. Vorlesung SS2001 • Thomas Kirste: FB Informatik, TU Darmstadt Ergänzung zum Skript GDV – I • Ken Shoemake: Animating Rotation with Quaternion Curves. SIGGRAPH, Volume 19, Number 3, 1985 San Francisco July 22-26 14