Richtungs Vektor in Quaternionen oder 4x4 Matrix konvertieren
-
Hi,
ich möchte aus einer Richtung, also einem Vektor mit (x | y | z) einen Quaternionen oder eine 4x4 Matrix generieren.
Es gibt zwar eine Funktion für MatrixLookAt (wer das OpenGL UtilityToolkit kennt) und diese Funktion habe ich auch in meiner Matrix Klasse, aber ich die scheint nicht so richtig zu funktionieren.
Ich möchte eine Matrix einfach nur in eine x-beliebige Richtung ausrichten, die Drehung dieser Richtung ist egal.
Damit ihr auch wisst wozu ich das brauche:
Ich will das Skelet der Animation meines 3D Objekts wie in Milkshape3D angezeigt haben. Dass die Bones immer in die Richtung zeigen, sodass sie mit eineander verbunden sind.So wie hier:
http://www.planetfortress.com/tf2models/tuto/ms3d_sc/geoff_skeleton.gifWie gesagt, ob Quaternion oder 4x4 Matrix ist mir egal, da ich einen Quaternion ganz leicht in eine 4x4 Matrix umwandeln kann.
Das hier ist meine bisherige Funktion:
void matrixLookAt(vector3d<T> Position, vector3d<T> LookAt, vector3d<T> upVector) { dim::vector3d<T> ZAxis = Position - LookAt; ZAxis.normalize(); dim::vector3d<T> XAxis = upVector.getCrossProduct(ZAxis); XAxis.normalize(); dim::vector3d<T> YAxis = ZAxis.getCrossProduct(XAxis); M[0] = XAxis.X; M[4] = XAxis.Y; M[ 8] = XAxis.Z; M[12] = -XAxis.getScalarProduct(Position); M[1] = YAxis.X; M[5] = YAxis.Y; M[ 9] = YAxis.Z; M[13] = -YAxis.getScalarProduct(Position); M[2] = ZAxis.X; M[6] = ZAxis.Y; M[10] = ZAxis.Z; M[14] = -ZAxis.getScalarProduct(Position); M[3] = 0; M[7] = 0; M[11] = 0; M[15] = 1; }
Kann mir jemand sagen wie ich das machen muss?
-
Ich bin mir ziemlich sicher, dass ich (oder jemand anderes) dir helfen könnte, wenn du nur das Problem nochmal langsam und verständlich beschreiben würdest. Ich will mal spekulieren, was du wohl meinst:
Ich möchte eine Matrix einfach nur in eine x-beliebige Richtung ausrichten, die Drehung dieser Richtung ist egal.
Meine Interpretation: Du hast eine Ausgangsrichtung und eine Endrichtung. Nun möchtest du eine Drehmatrix die die Ausgangsrichtung in die Endrichtung transformiert. Diese Drehmatrix kannst du dann natürlich auch auf andere Matrizen anwenden, für welchen Zweck auch immer.
Bevor ich jetzt eine Antwort ausarbeite: Habe ich deine Frage richtig interpretiert?
P.S.: Wahrscheinlich ist meine Interpretation falsch, denn ich sehe überhaupt nicht, wie meine Interpretation irgendetwas mit Quaternionen oder 4x4 Matrizen zu tun hat.
-
Also ich erkläre es noch mal moeglist einfach:
Ich habe einen Richtungs Vektor 'v'.
Ich will eine Matrix (oder einen Quaternion) haben, die in die Richtung 'v' gedreht ist.Bei Matrizen spricht man eben nur von Drehungen. Ich habe aber keien Drehung vorgegebe (also keine Winkel Angaben: pitch, yaw, roll) ich habe nur die Richtung des Vektors 'v' (x, y, z).
Wie muss ich diese Matrix generieren?
Wenn man für diese Richtung unbegint die Vektoren 'from' und 'to' braucht, dann waehre 'from' eben (0 | 0 | 0) und 'to' (v.x | v.y | v.z)
-
Ok, dann hab ich's wohl richtig verstanden. Ich habe das vor längerer Zeit mal ausgerechnet, kann dir die Rechnung daher nicht vorlegen, aber das Ergebnis habe ich mir aufgeschrieben. Es ist eine 3x3 Rotationsmatrix - den Zusammenhang mit Quaternionen kann man der Wikipediaseite zu Quaternionen entnehmen.
Um von einem Vektor $\vec{d}_{from}$ zu einem Vektor $\vec{d}_{to}$ zu drehen, sofern einem die "Verdrehung" egal ist, ist die Rotationsmatrix $M$:\\ $ M(\vec{d}_{from},\vec{d}_{to})=\begin{pmatrix} c_x^2 (1-a)+a & c\_x c\_y(1-a)+c\_z b & c\_x c_z (1-a)-c\_y b\\c\_x c\_y (1-a)-c\_z b & c\_y^2(1-a)+a &c\_y c\_z (1-a)+c\_x b\\c\_x c\_z (1-a)+c\_y b & c\_y c\_z (1-a)-c\_x b & c_z^2 (1-a)+a\end{pmatrix} $ \\mit\\ \begin{align*} \begin{pmatrix} c\_x \\ c\_y \\ c\_z\end{pmatrix}=\vec{d}\_{from} \times \vec{d}_{to} \\ a=\cos(\measuredangle(\vec{d}_{from},\vec{d}_{to})) \\ b=\sin(\measuredangle(\vec{d}_{from},\vec{d}_{to})) \end{align*}P.S.: Ich vermute mal, die d-Vektoren sollten auch normiert sein, sonst bekommt man noch irgendwelche komischen Verzerrungen. (0,0,0) wäre somit als Ausgangsrichtung ungeeignet.
-
Super, danke
das probiere ich gleich mal. Wie ich das in eine Quaternion umwandeln kann weiß ich, bzw. hab ich als Funktion parat. Allerdings ist mir eine 3x3 Matrix sowieso lieber
-
mein primitiver tipp:
falls XAxis der ausgansvektor ist, rotiere den um zwei achsen je 90 grad. (egal welche).
so erhaelst du vector TAxis.
kreuzprodukt aus XAxis und YAxis und du hast ZAxis.das sind die 3 vektoren die du in deiner lookat funktion erstellst.