PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Quaternionen verrechnen?


Kennung Eins
2007-08-15, 10:32:02
Ich hantiere grad mit ein paar Objekten, die ich zueinander vermessen habe und alle in ein gemeinsames Koordinatensystem schmeißen will. Leider war es teilweise nicht möglich, jeweils alle Objekte auf einen gemeinsamen Referenzpunkt zu beziehen, sondern ich konnte beispielsweise Koordinaten eines Objektes (P2) relativ zu einem anderen (P1) ermitteln, woraufhin ich dann wiederum ein drittes Objekt (P3) relativ zum zweiten (P2) vermessen habe.

Meine Vermessungssoftware liefert mir Quaternionen der Form qx,qy,qz,qw.

Ich weiß, wie man Quaternionen multipliziert (Wiki (http://de.wikipedia.org/wiki/Quaternion#Rechenregeln)), aber ich bin relativ schwach auf dem Gebiet der 3D-Berechnungen :redface: darum die Frage:

In welcher Reihenfolge muss ich das miteinander multiplizieren? q(1-2)*q(2-3) oder andersrum? Und entspricht bei der Beschreibung im Wiki (http://de.wikipedia.org/wiki/Quaternion#Rechenregeln) das x0 meinem qw?

http://img227.imageshack.us/img227/9083/unbenanntwp3.jpg (http://imageshack.us)

MikeB
2007-08-15, 21:39:36
Das Quaternion mit qx=0,qy=0,qz=0,qw=0 kommt mir absolut falsch vor, eine "Identity" Quaternion wäre qx=0,qy=0,qz=0,qw=1.

Ein Quaternion mit komplett null, verkettet mit einem weiteren ergibt wieder komplett null, kann also nicht funktionieren. Da spielt die Reihenfolge dann auch keine Rolle mehr... Das nuller-Quaternion lässt sich nicht mal normieren...

Du könntest mit folgendem Code ein Quaternion in eine 3x3 Matrix wandeln, dann normale Matrix-Verkettung benutzen:


m00 = 1.0f - 2.0f * ( y*y + z*z );
m01 = 2.0f * ( x*y - z*w );
m02 = 2.0f * ( x*z + y*w );

m10 = 2.0f * ( x*y + z*w );
m11 = 1.0f - 2.0f * ( x*x + z*z );
m12 = 2.0f * ( y*z - x*w );

m20 = 2.0f * ( x*z - y*w );
m21 = 2.0f * ( y*z + x*w );
m22 = 1.0f - 2.0f * ( x*x + y*y );


Dieser Code erzeugt auch aus einem nuller-Quaternion eine identity-Matrix.

Michael

Neomi
2007-08-15, 22:32:53
ich bin relativ schwach auf dem Gebiet der 3D-Berechnungen

Weißt du denn, in welcher Reihenfolge du Matrizen miteinander multiplizieren mußt? Falls ja, es gilt (abgesehen von Rechenungenauigkeiten) genau das hier:

Matrix3x3(q1 * q2) == Matrix3x3(q1) * Matrix3x3(q2)

Allerdings nur bei normierten Quaternions (x*x + y*y + z*z + w*w == 1).

In einem linkshändigen Koordinatensystem (z.B. Direct3D) gilt o1*(q1*q2) == (o1*q1)*q2 == o3, wenn o1*q1 == o2 und o2*q2 == o3 gilt, also lokale Rotation links und globale Rotation rechts. In einem rechtshändigen Koordinatensystem (z.B. OpenGL) dagegen steht die lokale Rotation rechts und die globale links, deshalb gilt q1*o1 == o2, q2*o2 == o3 und (q2*q1)*o1 == q2*(q1*o1) == o3.

Um was für ein Koordinatensystem geht es überhaupt?