Euler aus Matrix
-
Hallo,
ich hab mal wieder ein Problem, das mich schon seit Tagen beschäftigt und ich hoffe ihr könnt mir da weiterhelfen. Und zwar möchte ich aus einer Rotationsmatrix die entsprechenden Winkel wieder auslesen. Leider habe ich keine Ahnung wie das genau funktionieren soll. Ich arbeite mit OpenGL und habe dementsprechend ein right handed Koordinatensystem.
Die wichtigsten Felder aus der Matrix:
M11 = cosY * cosZ
M12 = cosY * sinZ
M13 = -sinY
M23 = sinX * cosY
M33 = cosX * cosYNach bisherigen Stand sehen meine Formel (vereinfacht) wie folgt aus:
float radX = atan2(M23, M33)
float radZ = atan2(M12, M11)
float radY = M23 / sin(radX)Mein Problem ist jetzt, das dies nur solange funktioniert, wenn cosY > 0. Ich habe leider keine Ahnung, wie ich nun das Vorzeichen vom cosY ermitteln kann. Ich hoffe ihr könnt mir da helfen.
Gruß
-
Wieso genau möchtest du das machen?
-
dot schrieb:
Wieso genau möchtest du das machen?
Ist das für die Lösung wichtig?
Ich wollte nach glLookat die entsprechenden Winkel auslesen. Mittlerweile habe ich aber ein gutes Paper gefunden, das besagt, das dies nicht eindeutig möglich ist. Was im Nachhinein betrachtet auch logisch ist.
http://gregslabaugh.name/publications/euler.pdf
-
DB85 schrieb:
dot schrieb:
Wieso genau möchtest du das machen?
Ist das für die Lösung wichtig?
Ja. Denn wenn die Erfahrung mich eines lehrt, dann dass irgendwelche Winkel ausrechnen praktisch immer der falsche Weg ist.
DB85 schrieb:
Ich wollte nach glLookat die entsprechenden Winkel auslesen. Mittlerweile habe ich aber ein gutes Paper gefunden, das besagt, das dies nicht eindeutig möglich ist. Was im Nachhinein betrachtet auch logisch ist.
http://gregslabaugh.name/publications/euler.pdfExakt. Darum die Frage was genau du erreichen willst. Wieso willst du die Winkel ausrechnen? Was genau willst du mit dieser Information dann anstellen? Ich bin mir ziemlich sicher, dass man das was du damit erreichen willst auf sehr viel bessere Art und Weise lösen kann, ganz ohne irgendwelche Winkel auszurechnen
-
Mittlerweile glaube ich auch, das mein Vorgehen nicht ganz richtig ist
Ich versuche mal zu erklären, was ich machen möchte. Und zwar habe ich eine Kamera, die ich auf ein bestimmtes Objekt richten möchten. Dazu verwende ich glLookat. Nachdem ausrichten, möchte ich aber die Kamera noch um beliebige Achsen drehen können. Bisher verwende ich zur Rotation die Formel
worldmatrix = translationMatrix * rotXMatrix * rotYMatrix * rotZMatrix; glMultMatrix(worldmatrix);
bzw. für lookat
worldmatrix = lookat(cameraPos, objPos, up); glMultMatrix(worldmatrix);
Ich müsste also die Matrix von lookat noch einmal rotieren. Ich weiß aber nicht, wie ich das machen muss. Deshalb war meine erste Idee, aus der lookatMatrix die Rotationsinformationen auszulesen und dann die worldmatrix nach er ersten Methode zu erstellen.
-
DB85 schrieb:
Ich müsste also die Matrix von lookat noch einmal rotieren.
Wie genau möchtest du sie rotieren? Ich würde mal meinen du kannst einfach eine entsprechende Rotationsmatrix bauen und diese mit deiner lookat Matrix multiplizieren?
-
Ok, somit drehe ich die Kamera um den lokalen Ursprung.
Ich möchte aber, dass sich die Kamera um das Objekt dreht, auf das es mit lookat ausgerichtet wurde. Mein bisheriger Versuch:void rotate(Matrix rotMatrix) { worldmatrix = worldmatrix * rotMatrix; } void translate(Vector pos) { Matrix translMatrix = createTranslationMatrix(pos); worldmatrix = worldmatrix * translMatrix; } void Update() { worldmatrix = lookat(cameraPos, objPos, up); deltaVector = cameraPos + objPos; translate(-deltaVector); rotate(xy); translate(deltaVector); glMultMatrix(worldmatrix); }
Aber das funktionert so nicht
-
http://www.opengl.org/sdk/docs/man/xhtml/glRotate.xml
Dort wird auch die Funktionsweise von glRotate beschrieben bzw. wie du diese Matrix-Operation selber durchführen kannst.
-
Ich glaube, ich hab das jetzt hinbekommen. Zumindest klappt die Rotation auf der Y-Achse. Ich werde das aber in den nächsten Tag noch genauer testen.
Der Fehler lag zum einen in der rotate Methode. Ich musste einfach die beiden Variablen vertauschen.
Zum anderen habe ich einen falschen Wert für translate genommen. deltaVector = objPos und schon klappt es.Vielen Dank an alle