im Zuge eines größeren Projektes muss ich aus einer Rotationsmatrix (Klasse Transform3D) die Rotation in eine X-,Y- und Z-Komponente zerlegen, um anhand derer ein BVH-Animaionsfile zu schreiben.
Transform3D hat zwar Funktionen um diese zu setzen (rotX, rotY und rotZ), aber keine um diese Werte auszulesen.
das machst Du am einfachsten mit dem Algorithmus zur QR-Zerlegung, der mit Givensrotationen arbeitet. Die Givensrotationen sind hier gerade die Rotationen um die Koordinatenachsen.
ui, hätte ich doch blos mal in Mathe aufgepasst ^^
Ich hab sowas schon mal gesehen, aber das ist schon etwas her.
Ich habe in einer lib eine Funktion gefunden, die wahrscheinlich diese Berechnung durchführen sollte. Im Test waren die ausgegebenen Zahlen allerdings nicht korrekt.
Leider verstehe ich nicht, was diese Funktion genau rechnet, und ob das überhaupt das ist was ich brauche
Hier der Code:
/**
* Returns MyMath angles from rotation part of the transform.
* (converted from Horde3D, utMath.h library)
*
* @return MyMath angles in vector, or null if MyMath not computable.
*/
public static Vector3d getEuler(Transform3D tf) {
Vector3d euler = new Vector3d();
tf.getScale(m_scale);
if (m_scale.x == 0 || m_scale.y == 0 || m_scale.z == 0)
return null;
// Detect negative scale with determinant and flip one arbitrary axis
if (! tf.getDeterminantSign())
m_scale.x = - m_scale.x;
ich verstehe auch nicht, was diese Funktion genau ausrechnet. Evtl. funktioniert sie nur, wenn die Eingabe eine der Achsendrehungen ist. Wie da aber die Skalen mit reinspielen…
hat eine ausführlich erklärte Anleitung, die einfacher ist, als mein Code. Der Pseudo-Code darin sollte sich einfach in eine lauffähige Prozedur umsetzen lassen.
Evtl. sollten die Tests auf Null in Tests auf kleine Werte geändert werden.
des unten genannten Artikels sollte auch dieser Code funktionieren, er liefert aber immer nur die erste der zwei Lösungen, was manchmal die unerwünschte sein kann.
Ich bin da etwas durch die Variablenbezeichnungen verwirrt worden.