Dual Quaternion: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
(Die Seite wurde neu angelegt: „{{Unvollständig|Mathematische Hintergründe fehlen. Das ist bisher nur aus Sicht eines Programmierers geschrieben.<br>Der Vergleich mit Quaternion + Translati…“)
 
 
(6 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Unvollständig|Mathematische Hintergründe fehlen. Das ist bisher nur aus Sicht eines Programmierers geschrieben.<br>Der Vergleich mit Quaternion + Translationsvektor ist nicht fertig.}}
+
{{Unvollständig|Mathematische Hintergründe fehlen. Das ist bisher nur aus Sicht eines Programmierers geschrieben.}}
  
 
'''Dual Quaternions''' ('''Duale Quaternionen''') sind eine Erweiterung der hamiltonschen [[Quaternion]]en um die [https://de.wikipedia.org/wiki/Duale_Zahl duale] Komponente. Geometrisch betrachtet führen duale Quaternionen die Translation ein, während einfache Quaternionen nur Rotation darstellen können. In einem Dual Quaternion lassen sich also sowohl Rotation als auch Translation speichern.
 
'''Dual Quaternions''' ('''Duale Quaternionen''') sind eine Erweiterung der hamiltonschen [[Quaternion]]en um die [https://de.wikipedia.org/wiki/Duale_Zahl duale] Komponente. Geometrisch betrachtet führen duale Quaternionen die Translation ein, während einfache Quaternionen nur Rotation darstellen können. In einem Dual Quaternion lassen sich also sowohl Rotation als auch Translation speichern.
  
 
==Definition==
 
==Definition==
Ein Dual Quaternion dq ist wie folgt definiert:
+
Ein Dual Quaternion ''dq'' ist wie folgt definiert:
 
  dq = r + e*d
 
  dq = r + e*d
wobei r und d Quaternionen sind und e eine imaginäre(?) Zahl mit der Eigenschaft
+
wobei ''r'' und ''d'' Quaternionen sind und ''e'' die duale Einheit mit der Eigenschaft
 
  e² = e*e = 0
 
  e² = e*e = 0
r nennt man ''reellen Teil'' und d heißt ''dualer Teil'' von dq.
+
''r'' nennt man ''reellen Teil'' und ''d'' heißt ''dualer Teil'' von ''dq''.
  
 
==Arithmetik==
 
==Arithmetik==
Zeile 19: Zeile 19:
  
 
===Multiplikation===
 
===Multiplikation===
Die Multiplikation mit einem anderen Dual Quaternion ist etwas komplizierter. Seien dq, dq1 und dq2 definiert wie bei oben. Dann gilt:
+
Die Multiplikation mit einem anderen Dual Quaternion ist etwas komplizierter. Seien ''dq'', ''dq1'' und ''dq2'' definiert wie bei oben. Dann gilt:
 
  dq = dq1 * dq2
 
  dq = dq1 * dq2
 
  <=>
 
  <=>
 
  r = r1 * r2
 
  r = r1 * r2
 
  d = (r1 * d2) + (d1 * r2)
 
  d = (r1 * d2) + (d1 * r2)
Wobei beachtet werden sollte, dass hier jeweils drei [[Quaternion#Multiplikation|Multiplikationen von Quaternionen]] (also nicht etwa das [[Skalarprodukt]] o.ä.) stattfinden. Wie schon bei Quaternionen und [[Matrizen]] gilt das Kommutativgesetz hier nicht! Das heißt dq1*dq2 ist nicht immer gleich dq2*dq1.
+
Wobei beachtet werden sollte, dass hier jeweils drei [[Quaternion#Multiplikation|Multiplikationen von Quaternionen]] (also nicht etwa das [[Skalarprodukt]] o.ä.) stattfinden. Wie schon bei Quaternionen und [[Matrizen]] gilt das Kommutativgesetz hier '''nicht'''! Das heißt ''dq1*dq2'' ist nicht immer gleich ''dq2*dq1''.
 +
 
 +
Die Multiplikation "verkettet" zwei Dual Quaternions miteinander, genau wie bei Matrizen. Wenn ''dq1'' also z.B. eine Rotation speichert und ''dq2'' eine Translation, so wird ein Vektor bei der Transformation mit deren Produkt erst rotiert und danach transliert.
  
 
==Operationen in der 3D-Grafik==
 
==Operationen in der 3D-Grafik==
 
{{Warnung|Im Folgenden ist es wichtig festzulegen, in welcher Reihenfolge man die Komponenten der Quaternionen speichert.}}
 
{{Warnung|Im Folgenden ist es wichtig festzulegen, in welcher Reihenfolge man die Komponenten der Quaternionen speichert.}}
Zur Erinnerung: Ein Quaternion q hat folgende Form:
+
Zur Erinnerung: Ein Quaternion ''q'' hat folgende Form:
  q = a+ b*i +c*j + d*k
+
  q = a +b*i +c*j +d*k
Während im Artikel [[Quaternion]] eine andere Reihenfolge gewählt wurde, speichern wir Quaternionen nun als 4-Komponenten-Vektor (in GLSL-Schreibweise vec4), wobei
+
Während im Artikel [[Quaternion]] eine andere Reihenfolge gewählt wurde, speichern wir Quaternionen nun als 4-Komponenten-Vektor (in [[GLSL]]-Schreibweise vec4), wobei
 
  x = b
 
  x = b
 
  y = c
 
  y = c
Zeile 38: Zeile 40:
  
 
===Setzen der Translation===
 
===Setzen der Translation===
Wir möchten, dass dq Vektoren um den Translationsvektor t verschiebt.
+
Wir möchten, dass ''dq'' Vektoren um den Translationsvektor ''t'' verschiebt.
 
  r.x = r.y = r.z = 0  // Identitäts-Quaternion
 
  r.x = r.y = r.z = 0  // Identitäts-Quaternion
 
  r.w = 1              // für den reellen Teil
 
  r.w = 1              // für den reellen Teil
Zeile 48: Zeile 50:
  
 
===Setzen der Rotation===
 
===Setzen der Rotation===
Wir möchten, dass mit dq transformierte Vektoren um den Winkel phi um die Achse A gedreht wird.
+
Wir möchten, dass mit ''dq'' transformierte Vektoren um den Winkel ''phi'' um die Achse ''A'' gedreht wird.
 
  r.x = A.x * sin(phi)
 
  r.x = A.x * sin(phi)
 
  r.y = A.y * sin(phi)
 
  r.y = A.y * sin(phi)
 
  r.z = A.z * sin(phi)
 
  r.z = A.z * sin(phi)
 
  r.w = cos(phi)
 
  r.w = cos(phi)
 
+
 
  d.x = d.y = d.z = d.w = 0
 
  d.x = d.y = d.z = d.w = 0
  
 
===Transformation eines Vektors===
 
===Transformation eines Vektors===
Wir möchten den Vektor v transformieren und erhalten den resultierenden Vektor v'
+
Wir möchten den Vektor ''v'' transformieren und erhalten den resultierenden Vektor ''v'''
 
  v' = v + 2 * (cross(r.xyz,  cross(r.xyz, v) + r.w*v) + r.w*d.xyz - d.w*r.xyz + cross(r.xyz, d.xyz))
 
  v' = v + 2 * (cross(r.xyz,  cross(r.xyz, v) + r.w*v) + r.w*d.xyz - d.w*r.xyz + cross(r.xyz, d.xyz))
  
 
===Interpolation===
 
===Interpolation===
Der Hauptgrund, warum man in einigen Anwendungen Dual Quaternions gewöhnlichen Matrizen vorzieht, ist die gute Interpolierbarkeit. Wir möchten dq1 und dq2 linear interpolieren:
+
Der Hauptgrund, warum man in einigen Anwendungen Dual Quaternions gewöhnlichen Matrizen vorzieht, ist die gute Interpolierbarkeit. Wir möchten ''dq1'' und ''dq2'' linear interpolieren:
 
  dq = dq1*(1-f) + dq2*f
 
  dq = dq1*(1-f) + dq2*f
 
  <=>
 
  <=>
Zeile 72: Zeile 74:
 
  r = normalize(r1)        // normalize() wie in GLSL
 
  r = normalize(r1)        // normalize() wie in GLSL
 
  d = d1 - r * dot(r, d1)
 
  d = d1 - r * dot(r, d1)
So wird dq die normalisierte Form von dq1. Die Reihenfolge der beiden Zeilen ist wichtig.
+
So wird ''dq'' die normalisierte Form von ''dq1''. Die Reihenfolge der beiden Zeilen darf nicht vertauscht werden.
  
 
==Vergleich zu anderen Darstellungen==
 
==Vergleich zu anderen Darstellungen==
Zeile 78: Zeile 80:
 
*Ein Dual Quaternion benötigt nur halb so viel Speicherplatz wie eine 4x4-Matrix (2 statt 4 uniform-Register)
 
*Ein Dual Quaternion benötigt nur halb so viel Speicherplatz wie eine 4x4-Matrix (2 statt 4 uniform-Register)
 
*Eine Matrix lässt sich im Allgemeinen nicht sinnvoll interpolieren. Die lineare Interpolation von Dual Quaternions liefert dagegen genau das Ergebnis, was man i.A. erwartet und v.a. für [[Charakteranimation]] mit BoneWeights braucht.
 
*Eine Matrix lässt sich im Allgemeinen nicht sinnvoll interpolieren. Die lineare Interpolation von Dual Quaternions liefert dagegen genau das Ergebnis, was man i.A. erwartet und v.a. für [[Charakteranimation]] mit BoneWeights braucht.
*Die Transformation eines Vektors mit einer Matrix ist schneller (4 mal dot) als mit einem Dual Quaternion (siehe oben).
+
*Die Transformation eines Vektors mit einer Matrix ist deutlich schneller (4 mal dot) als mit einem Dual Quaternion (siehe oben).
  
 
===Quaternion + Translationsvektor===
 
===Quaternion + Translationsvektor===
 
*Ein Dual Quaternion benötigt theoretisch einen float mehr, da ein Translationsvektor nur drei Komponenten hat. Bei der Anzahl der Shader-Register sind beide Lösungen gleichwertig.
 
*Ein Dual Quaternion benötigt theoretisch einen float mehr, da ein Translationsvektor nur drei Komponenten hat. Bei der Anzahl der Shader-Register sind beide Lösungen gleichwertig.
*Interpolation: ToDo
+
*Interpolation: Die lineare Interpolation führt bei beiden Lösungen zum gleichen Ergebnis.
*Transformation eines Vektors: ToDo
+
*Die Transformation eines Vektors ''v'' mit einem Quaternion ''q'' und der anschließenden Addition des Translationsvektors ''t'' ist etwas schneller als die Anwendung eines Dual Quaternions auf den Vektor:
 +
v' = v + 2 * cross(q.xyz,  cross(q.xyz, v) + q.w*v) + t;
  
 
==Links==
 
==Links==
[http://www.mip.informatik.uni-kiel.de/~wwwadmin/Software/Doc/BIAS/html/dir_119cd33dc2aa10ca4a4dd8c4e2d60c03.html Eine umfangreiche Implementation von DualQuaternions in C++] (In den Dateien Quaternion.cpp, Quaternion.hh, QuaternionInl.hh, QuaternionOperators.hh)
+
[http://www.mip.informatik.uni-kiel.de/~wwwadmin/Software/Doc/BIAS/html/dir_119cd33dc2aa10ca4a4dd8c4e2d60c03.html Eine umfangreiche Implementation von DualQuaternions in C++] (In den Dateien DualQuaternion.cpp, DualQuaternion.hh, DualQuaternionInl.hh, DualQuaternionOperators.hh)<br>
 +
[http://wscg.zcu.cz/wscg2012/short/A29-full.pdf A Beginners Guide to Dual Quaternions]<br>
 +
[https://bitbucket.org/dbacchet/dbsdev/src/e69aa94ff4d9740649162b426539c1fcd61ca8ee/docs/papers/Kavan%20-%202006%20-%20Dual%20Quaternions%20for%20Rigid%20Transformation%20Blending.pdf Kavan 2006, Dual Quaternions for Rigid Transformation Blending]

Aktuelle Version vom 26. Januar 2014, 12:27 Uhr

Hinweis: Dieser Artikel ist noch unvollständig.
(Mehr Informationen/weitere Artikel)

Mathematische Hintergründe fehlen. Das ist bisher nur aus Sicht eines Programmierers geschrieben.

Incomplete.jpg

Dual Quaternions (Duale Quaternionen) sind eine Erweiterung der hamiltonschen Quaternionen um die duale Komponente. Geometrisch betrachtet führen duale Quaternionen die Translation ein, während einfache Quaternionen nur Rotation darstellen können. In einem Dual Quaternion lassen sich also sowohl Rotation als auch Translation speichern.

Definition

Ein Dual Quaternion dq ist wie folgt definiert:

dq = r + e*d

wobei r und d Quaternionen sind und e die duale Einheit mit der Eigenschaft

e² = e*e = 0

r nennt man reellen Teil und d heißt dualer Teil von dq.

Arithmetik

Addition

Die Addition zweier Dual Quaternions geschieht komponentenweise:

dq1 = r1 + e*d1
dq2 = r2 + e*d2
dq1 + dq2 = r1+r2 + e*(d1+d2)

Die Subtraktion funktioniert analog.

Multiplikation

Die Multiplikation mit einem anderen Dual Quaternion ist etwas komplizierter. Seien dq, dq1 und dq2 definiert wie bei oben. Dann gilt:

dq = dq1 * dq2
<=>
r = r1 * r2
d = (r1 * d2) + (d1 * r2)

Wobei beachtet werden sollte, dass hier jeweils drei Multiplikationen von Quaternionen (also nicht etwa das Skalarprodukt o.ä.) stattfinden. Wie schon bei Quaternionen und Matrizen gilt das Kommutativgesetz hier nicht! Das heißt dq1*dq2 ist nicht immer gleich dq2*dq1.

Die Multiplikation "verkettet" zwei Dual Quaternions miteinander, genau wie bei Matrizen. Wenn dq1 also z.B. eine Rotation speichert und dq2 eine Translation, so wird ein Vektor bei der Transformation mit deren Produkt erst rotiert und danach transliert.

Operationen in der 3D-Grafik

Warnung.png Im Folgenden ist es wichtig festzulegen, in welcher Reihenfolge man die Komponenten der Quaternionen speichert.

Zur Erinnerung: Ein Quaternion q hat folgende Form:

q = a +b*i +c*j +d*k

Während im Artikel Quaternion eine andere Reihenfolge gewählt wurde, speichern wir Quaternionen nun als 4-Komponenten-Vektor (in GLSL-Schreibweise vec4), wobei

x = b
y = c
z = d
w = a  // letzte Komponente!!!

Dies entspricht der offenbar am weitesten verbreiteten Reihenfolge.

Setzen der Translation

Wir möchten, dass dq Vektoren um den Translationsvektor t verschiebt.

r.x = r.y = r.z = 0  // Identitäts-Quaternion
r.w = 1              // für den reellen Teil

d.x = t.x * 0.5
d.y = t.y * 0.5
d.z = t.z * 0.5
d.w = 0

Setzen der Rotation

Wir möchten, dass mit dq transformierte Vektoren um den Winkel phi um die Achse A gedreht wird.

r.x = A.x * sin(phi)
r.y = A.y * sin(phi)
r.z = A.z * sin(phi)
r.w = cos(phi)

d.x = d.y = d.z = d.w = 0

Transformation eines Vektors

Wir möchten den Vektor v transformieren und erhalten den resultierenden Vektor v'

v' = v + 2 * (cross(r.xyz,  cross(r.xyz, v) + r.w*v) + r.w*d.xyz - d.w*r.xyz + cross(r.xyz, d.xyz))

Interpolation

Der Hauptgrund, warum man in einigen Anwendungen Dual Quaternions gewöhnlichen Matrizen vorzieht, ist die gute Interpolierbarkeit. Wir möchten dq1 und dq2 linear interpolieren:

dq = dq1*(1-f) + dq2*f
<=>
r = r1*(1-f) + r2*f
d = d1*(1-f) + d2*f

Dies entspricht der GLSL-Funktion mix().

Normalisieren

Nach der Interpolation besteht die Gefahr, dass das Dual Quaternion nicht mehr normalisiert ist. Das lässt sich beheben:

r = normalize(r1)        // normalize() wie in GLSL
d = d1 - r * dot(r, d1)

So wird dq die normalisierte Form von dq1. Die Reihenfolge der beiden Zeilen darf nicht vertauscht werden.

Vergleich zu anderen Darstellungen

4x4-Matrix

  • Ein Dual Quaternion benötigt nur halb so viel Speicherplatz wie eine 4x4-Matrix (2 statt 4 uniform-Register)
  • Eine Matrix lässt sich im Allgemeinen nicht sinnvoll interpolieren. Die lineare Interpolation von Dual Quaternions liefert dagegen genau das Ergebnis, was man i.A. erwartet und v.a. für Charakteranimation mit BoneWeights braucht.
  • Die Transformation eines Vektors mit einer Matrix ist deutlich schneller (4 mal dot) als mit einem Dual Quaternion (siehe oben).

Quaternion + Translationsvektor

  • Ein Dual Quaternion benötigt theoretisch einen float mehr, da ein Translationsvektor nur drei Komponenten hat. Bei der Anzahl der Shader-Register sind beide Lösungen gleichwertig.
  • Interpolation: Die lineare Interpolation führt bei beiden Lösungen zum gleichen Ergebnis.
  • Die Transformation eines Vektors v mit einem Quaternion q und der anschließenden Addition des Translationsvektors t ist etwas schneller als die Anwendung eines Dual Quaternions auf den Vektor:
v' = v + 2 * cross(q.xyz,  cross(q.xyz, v) + q.w*v) + t;

Links

Eine umfangreiche Implementation von DualQuaternions in C++ (In den Dateien DualQuaternion.cpp, DualQuaternion.hh, DualQuaternionInl.hh, DualQuaternionOperators.hh)
A Beginners Guide to Dual Quaternions
Kavan 2006, Dual Quaternions for Rigid Transformation Blending