(Objekt)-Achse sperren

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Audience
Beiträge: 6
Registriert: 20.09.2009, 13:33

(Objekt)-Achse sperren

Beitrag von Audience »

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:

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]);
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?
Antworten