2009-03-26 10 views
1

kann mir jemand sagen, wie man mein modell drehen an seinem eigenen zentrum go gravity anstelle der default (0,0,0) achse?opengl rotation problem

und meine Rotation scheint nur zu gehen, nach links und rechts nicht 360 Grad ..

Antwort

10

Wenn Sie ein Objekt um seinen Mittelpunkt drehen möchten, können Sie es zuerst auf den Ursprung übersetzen müssen, dann drehen und übersetzen zurück. Da Transformationsmatrizen Ihre Vektoren von rechts nach links beeinflussen, müssen Sie diese Schritte in umgekehrter Reihenfolge codieren.

Hier einige Pseudo-Code, da ich nicht OpenGL Routinen auswendig kennen:

PushMatrix(); 
LoadIdentity(); // Start with a fresh matrix 
Translate();  // Move your object to its final destination 
Rotate();  // Apply rotations 
Draw();   // Draw your object using coordinates relative to the object center 
PopMatrix(); 

Diese Matrizen angewendet erhalten:

v_t = (I * T * R) * v = (I * (T * (R * v))) 

So ist die Reihenfolge: Rotation, Translation.


EDIT: Eine Erklärung für die obige Gleichung.

Die Transformationen Rotation, Skalierung und Translation wirken sich auf die Modellansichtsmatrix aus. Jeder 3D-Punkt (Vektor) Ihres Modells wird mit dieser Matrix multipliziert, um seinen endgültigen Punkt im 3D-Raum zu erhalten. Anschließend wird er mit der Projektionsmatrix multipliziert, um einen 2D-Punkt (auf Ihrem 2D-Bildschirm) zu erhalten.

Ignorieren der Projektion Sachen, Ihr Punkt durch die Model-View-Matrix transformiert ist:

v_t = MV * v 

den Ausgangspunkt Bedeutung v, multipliziert mit der Model-View-Matrix MV.

oben in dem Code wir MV durch eine Identitätsmatrix I, Übersetzung T und eine Rotation R aufgebaut haben:

MV = I * T * R 

Putting alles zusammen, sehen Sie, dass v Ihr Punkt zuerst durch die Rotation beeinflusst wird R, dann ist die Übersetzung T, so dass Ihr Punkt, bevor gedreht wird es übersetzt wird, so wie wir es sein wollten:

v_t = MV * v = (I * T * R) * v = T * (R * v) 

Drehen Calling() vor() Übersetzen in Folge hätte:

v_t = (I * R * T) * v = R * (T * v) 

, die schlecht wäre: Übersetzt in 3D zu einem gewissen Punkt, dann gedreht, um den Ursprung, in Ihrem Modell zu einigen seltsamen Verzerrung führt.

+0

danke! aber was meinst du mit den Gleichungen? – noob88

+0

Ich fügte eine Erklärung für die Gleichung hinzu. Es ist wirklich nur eine sehr einfache Mathematik, die Sie benötigen, um 3D-Grafiken zu verstehen. –

+0

danke es funktioniert jetzt .. aber es ist immer noch ein Problem übrig, es dreht sich nicht in einem Kreis eher seine 180 Grad von links nach rechts .. kann nicht sagen, was schief gelaufen ist? – noob88