(Objekt)-Achse sperren
Verfasst: 06.12.2009, 15:17
Hallo,
folgendes Problem habe ich (was ich eigentlich mit meinem Ansatz aus dem letzten Thread beheben wollte).
Ich bekomme von einem Tracking-Stick, der in 3D bewegt werden kann, eine 3x3 Rotationsmatrix Rm, die aus der Multiplikation Rm = Rx*Ry*Rz enstanden sind, wobei Rx, Ry, Rz die Rotationsmatrizen für die jeweilige Achse bezeichnen.
Das Problem ist jetzt: Da ich die Rotationen für meine Kamera verwenden will, möchte ich die z-Rotation um die Objektachse sperren, also die Kamera soll immer geraden Horizont haben.
Wenn ich jetzt nur Rx*Ry verwende, kommt natürlich nicht das gewünschte Ergebnis heraus, da ja die Weltachsen immer als Rotationsachsen herangezogen werden und die z-Rotation auch die x und y Achsen des Objektes verändern. Also müsste ich schon die volle Rotation Rm durchführen, und mir dann berechnen, um wie viel die z-Achse des Objektes gedreht wurde und nacher wieder um diesen Winkel zurückdrehen.
Soweit mein Ansatz:
Es tut aber irgendwie nicht so, wie ich will und morgen ist Abgabe :-(. Habe ich irgendwo nen Denkfehler oder habt ihr n besseren Lösungsansatz?
folgendes Problem habe ich (was ich eigentlich mit meinem Ansatz aus dem letzten Thread beheben wollte).
Ich bekomme von einem Tracking-Stick, der in 3D bewegt werden kann, eine 3x3 Rotationsmatrix Rm, die aus der Multiplikation Rm = Rx*Ry*Rz enstanden sind, wobei Rx, Ry, Rz die Rotationsmatrizen für die jeweilige Achse bezeichnen.
Das Problem ist jetzt: Da ich die Rotationen für meine Kamera verwenden will, möchte ich die z-Rotation um die Objektachse sperren, also die Kamera soll immer geraden Horizont haben.
Wenn ich jetzt nur Rx*Ry verwende, kommt natürlich nicht das gewünschte Ergebnis heraus, da ja die Weltachsen immer als Rotationsachsen herangezogen werden und die z-Rotation auch die x und y Achsen des Objektes verändern. Also müsste ich schon die volle Rotation Rm durchführen, und mir dann berechnen, um wie viel die z-Achse des Objektes gedreht wurde und nacher wieder um diesen Winkel zurückdrehen.
Soweit mein Ansatz:
Code: Alles auswählen
/*Die Rotationsmatrix wurde bereits auf die
Modelview Matrix multipliziert, alternativ kann man zum
Testen auch ein Testobjekt beliebig rotieren... */
float modelview[16];
glGetFloatv(GL_MODELVIEW_MATRIX , modelview);
//Winkel bei Rotation um Z-Achse extrahieren
float xachse[3];
xachse[0] = modelview[0];
xachse[1] = modelview[1];
xachse[2] = modelview[2];
float yachse[3];
yachse[0] = modelview[4];
yachse[1] = modelview[5];
yachse[2] = modelview[6];
float winkelz = CMath::rad2deg(asin(xachse[1]));
if ((yachse[1] < 0.0f)) (winkelz = 180.0f-winkelz);
//Jetzt das Objekt um seine z-Achse zurückdrehen
glRotatef(winkelz, modelview[8], modelview[9], modelview[10]);