Quaternion in neues Koordinatensystem

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
meiwen
Beiträge: 14
Registriert: 23.10.2012, 00:01
Benutzertext: Hola

Quaternion in neues Koordinatensystem

Beitrag von meiwen »

Hi,

ich bin noch ziemlich neu und verzweifle gerade an einem vermutlich recht trivialem Problem. Ich moechte mit der Kinect meinen Character in dem Spiel Crysis steuern. Ich habe inzwischen eine Anbindung von der Kinect an die CryEngine programmiert. Die Spielfigur wird durch ein Skelett beschrieben in dem einzelne Knochen bewegt werden koennen.
Beispiel:
Unterarm besteht aus einem Startpunkt ( Ellbogen) und einem Endpunkt (Hand). Jeder Knochen hat ein eigenes Koordinatensystem. In der CryEngine ist der Ursprung immer der Startpunkt eines Knochen. Die x-Achse verlauft auf dem Knochen in Richtung Endpunkt. Die Y Achse laeuft immer in Blickrichtung des Characters in das Bild hinein.
Die Kinect erkennt ebenfalls Knochenobjekte, die aehnliche gehandhabt werden. Es gibt ebenfalls einen Start und Endpunkt. Jeder Knochen hat auch hier ein lokales Koordinatensystem. Allerdings laeuft hier immer die y Achse entlang des Knochens und die Z-Achse ins Bild.

Mein Problem ist, ich bekomme von der Kinect 20 Knochen und zu jedem Knochen ein Quaternion, welches mir die Rotation des Knochens beschreibt. Ich muss dieses Quaternion nun von dem lokalen Kinectkoordinatensystem in das lokale CryEngine Koordinatensystem umwandeln. Leider komme ich nicht auf den richtigen Loesungsansatz. Eigentlich kann es ja nicht all zu schwierig sein, da ja der Ursprung beide Male der Startpunkt des Knochens ist, also nur die Achsen anderst Skaliert und gedreht sind.

Nach dem ich jetzt schon mehrere Tage probiert habe, bin ich fuer jede Loesung dankbar.

Gruss Pascal
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Quaternion in neues Koordinatensystem

Beitrag von dot »

Klingt mir irgendwie so, als müsstest du lediglich auf all deine Quaternionen eine fixe Rotation draufmultiplizieren, die eben die y-Achse und z-Achse richtig dreht (also 90° um z gefolgt von 90° um y oder so)!? Oder ist auch noch die Handedness verschieden?
meiwen
Beiträge: 14
Registriert: 23.10.2012, 00:01
Benutzertext: Hola

Re: Quaternion in neues Koordinatensystem

Beitrag von meiwen »

Moin,

Vielen Dank mal für die Antwort. Zeigt mir dass ich zumindest auf dem richtigen Weg bin :)
Sowas in der Art habe ich schon versucht. Leider tue ich mich mit dem Begriff Quaternion noch etwas schwer. Wenn ich also ein Quaternion als Vector4 ( w, x,y,z) habe und eine Rotationsmatrix darauf anwenden möchte.
Beispielsweise Rotation um die x-Achse:
Rx= { 1 0 0,
0 cos(a) -sin(a)
0 sin(a) cos(0) }
Nehme ich dann nur meinen x,y,z Teil meines Quaternions oder muss ich die Rotationsmatrix erweitern, dass ich auch den w-Wert meines Quaternions mit einbeziehe?
Meines aktuellen Verständnisses nach beschreibt das Quaterion ja die Rotation um einen Vector. Liege ich damit richtig das die x,y,z Werte meinen Vector beschreiben?

Gruss Pascal
Benutzeravatar
Jonathan
Establishment
Beiträge: 2367
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: Quaternion in neues Koordinatensystem

Beitrag von Jonathan »

Quaternionen sind keine Vektoren.
Du würdest eine Quaternion erstellen, die diese Drehung um 90 Grad beschreibt (statt der Matrix) und dann beide Quaternionen Multiplizieren (vom Prinzip ähnlich wie bei Matrizen, aber mit anderen Formeln).
Du könntest wohl auch aus deiner Quaternion eine rotationmatrix erstellen und die mit deiner 90-Grad Rotationsmatrix kombinieren und aus dem Ergebnis wieder eine Quaternion bestimmen. Aber mit Quaternionenmultiplikation sollte es einfacher gehen.
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Matthias Gubisch
Establishment
Beiträge: 470
Registriert: 01.03.2009, 19:09

Re: Quaternion in neues Koordinatensystem

Beitrag von Matthias Gubisch »

Du solltest dich glaub ich erst mal mit den Grundlagen von Rotationen auseinander setzen.

Es gibt mehrere Arten Rotationen im 3D-Raum darzustellen, die 3 wichtigsten mal hier:

- Rotationsmatrizen
- Euler-Winkel
- Quaternionen

Ein Quaternion ist also nichts anderes als eine spezielle Darstellung einer Rotation.
Eine Multiplikation eines Quaternions mit einer Rotationsmatrix gibt meines Wissens (die Mathematiker mögen mich korregieren) kein sinnvolles Ergeebnis.

Du kannst also entweder das Quaternion in eine Matrix konvertieren, und dann mit der Rotationsmatrix multiplizieren, das macht Sinn wenn du anschließend mit Matrizen weiterarbeiten willst, oder die rotierst das Quaternion direkt.

Hier mal noch ein paar Links zu den Grundlagen von Quaternionen und Rotationsmatrizen, für mehr Infos hilft google oder erneutes Nachfragen :)
http://de.wikipedia.org/wiki/Quaternion
http://en.wikipedia.org/wiki/Rotation_matrix
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
meiwen
Beiträge: 14
Registriert: 23.10.2012, 00:01
Benutzertext: Hola

Re: Quaternion in neues Koordinatensystem

Beitrag von meiwen »

Super, das hilft mir schon mal um einiges weiter.

Ich habe jetzt genau 2 Drehoperationen die ich durchführen muss um von meinem Kinect-Koordinatensystem zum Cry-Engine Koordinatensystem zu kommen.
1. Drehung an der z-Achse um 270 Grad.
Wenn ich alles richtig verstehe, würde mein Quaterion dann wie folgt aussehen:
q1= [ cos(270/2) (0,0,1)]

2. Drehung an der x-Achse um 90 Grad:
q2=[ (cos(90/2), (1,0,0)]

Wenn das alles so passt dann habe ich noch eine Frage zur Reihenfolge, da diese ja bei der Multiplikation von Quaternions ausschlaggebend ist.
Ich hätte gesagt, dass ich zuerst mein Quaternion, welches mir die Kinect liefert nehme.
Dann multipliziere ich mein q1 da drauf und anschließend q2 und erhalte dann ein Quaternion welche mir eine Rotation im neuen Koordinatensystem beschreibt.
q (cry-engine) = q(kinect) * q1 * q2

Bitte sagt mir dass ich damit richtig liege ;)
meiwen
Beiträge: 14
Registriert: 23.10.2012, 00:01
Benutzertext: Hola

Re: Quaternion in neues Koordinatensystem

Beitrag von meiwen »

push
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Quaternion in neues Koordinatensystem

Beitrag von eXile »

Erst einmal: Wir haben keine Ahnung von Kinect- und Crytek-Konventionen. Die musst du dir schon selbst erarbeiten. Aber zum letzten Punkt kann ich sagen: Wenn man die Standard-Quaternionenmultiplikation \($\mathbf q' = \mathbf q_2 \mathbf q_1$\) ausführt, und dann das Standard-Hamiltonprodukt für einen Punkt und das Quaternion \($\mathbf q'$\) durchführt, so stellt dies eine Rotation dar, die zuerst durch die von \($\mathbf q_1$\) beschriebene Rotation und dann die von \($\mathbf q_2$\) beschriebene Rotation durchführt.

Wohlgemerkt: Bei Standard-Definitionen (welche man beispielsweise auf Wikipedia antrifft). Wenn du anders definierte Operationen durchführst, kann auch die Reihenfolge anders herum sein.

Im Endeffekt sind Quaternionen nur eine Ansicht auf eine Rotation; andere Ansichten sind komplexwertige 2×2-Matrizen, reellwertige 3×3-Matrizen, reellwertige dreidimensionale Zeilen- oder Spaltenvektoren (Eulerwinkel und äquivalente Winkelparametrisierungen). Alles sind unterschiedliche Ansichten auf dieselbe zugrunde liegende Sache. Genauso wie Zeilen- und Spaltenvektoren unterschiedliche Ansichten auf dieselbe zugrunde liegende Sache sind.
Antworten