2009-08-14 8 views
4

Ich habe eine Szene, die Objekte irgendwo im Raum enthält und ich mache eine Trackball-ähnliche Schnittstelle.Rotierende OpenGL-Szene in 2 Achsen

Ich mag es so machen, dass I 2 separate Schieber bewegen kann es in x zu drehen und y-Achse jeweils:

glRotatef(drawRotateY,0.0,1.0f,0); 
glRotatef(drawRotateX,1.0f,0.0,0.0); 
//draw stuff in space 

jedoch der obige Code wird nicht funktionieren, weil X Drehung dann abhängig von der Y-Rotation sein.

Wie kann ich dies erreichen, ohne gluLookAt() zu verwenden?

Edit: Ich möchte sagen, dass meine Implementierung ist noch einfacher als ein Trackball-Schnittstelle. Wenn der Schieberegler "x" den Wert 80 und der Schieberegler "y" den Wert 60 hat, rotieren Sie vertikal um 80 Grad und horizontal um 60 Grad. Ich muss sie nur voneinander unabhängig machen!

+1

Aug 14 ... Brauchen Sie noch eine Erklärung? –

Antwort

0

Sie wahrscheinlich so etwas wie diese verwenden:

Vector v = new Vector(drawRotateX, drawRotateY, 0); 
float length = v.length(); 
v.normalize(); 
glRotatef(length, v.x, v.y, v.z); 
+0

Gefunden eine Vec3f Umsetzung hier: http://wwwx.cs.unc.edu/~lastra/Courses/COMP238_F2000/Code/vec3f.hpp Wie dem auch sei, dies nicht funktioniert hat. – KeniF

0

Wenn Sie vertikal sagen drehen und horizontal, meinst du wie ein anti-aircraft gun - drehen sich um die vertikale Z-Achse, in einem bestimmten Kompass Gesicht Kursieren (Gieren) und dann auf eine bestimmte Höhe (Tonhöhe) drehen?

Wenn dies der Fall ist, dann müssen Sie nur Ihre zwei Rotationen in der richtigen Reihenfolge tun, und alles wird gut. In diesem Beispiel müssen Sie zuerst die "Nick" -Drehung und dann die "Gier" -Drehung durchführen. Alles wird gut funktionieren.

Wenn Sie etwas komplizierter (z. B. wie die ‚Cobra‘ Raumschiff in der Elite) bedeuten dann werden Sie eine weitere knifflige Lösung benötigen.

+0

Sie haben Recht, aber meine Objekte sind nicht im Ursprung. Eine zweimalige Drehung bedeutet also, dass die zweite Drehung von der ersten beeinflusst wird. – KeniF

+0

Hey da. Ich glaube nicht, dass das wichtig sein sollte, solange Sie alle Ihre Drehungen machen, bevor Sie Ihre Übersetzung machen. Vielleicht bin ich Missverständnis, was Sie brauchen. Ist mein Flugabwehr-Beispiel ein guter Vergleich? Oder nicht so sehr? Danke! –

+0

Nun, da ich Monate später zu mir komme, fällt mir ein viel verspäteter, aber möglicherweise konstruktiver Kommentar ein: Um die Drehungen richtig zu machen, ist es üblich, dass alle Objekte am Ursprung beginnen. Mache die Drehungen so, wie ich es beschreibe, dann übersetze das Objekt zu seiner Position in der Welt. All dies wird durch die einzige Modelview-Matrix erreicht, so dass es nicht teurer ist, als nur die Rotationen durchzuführen. –