2008-11-13 13 views
27

In OpenGL versuche ich eine Kamera um einen Punkt zu drehen, wobei die Kamera Abstand r vom Punkt hat und zum Punkt zeigt, wenn sie sich dreht. Mit anderen Worten, ich möchte, dass sich die Kamera entlang des Umfangs eines Kreises mit einem Radius r von der Mitte bewegt, wobei die Kamera an jedem Punkt entlang des Umfangs der Mitte zugewandt ist.OpenGL dreht eine Kamera um einen Punkt

Lets sagen, dass in 3d Raum das Zentrum des Kreises ist (3, 0, 3);

Ich habe versucht:

// move to center of circle  
glTranslatef(-3, 0, -3) 
// move a distance away from the circle 
glTranslatef(0, 0, r); 
// rotate along the y "up" axis 
glRotatef(CameraAngle, 0, 1, 0); 

wo CameraAngle ist der Grad um den Kreis bewegt werden.

Mein Endergebnis ist die Kamera dreht immer noch entlang der Herkunft, nicht die Mitte des Kreises. Kann mir jemand helfen, dieses Problem zu beheben? Vielen Dank!

Antwort

24

müssen Sie entweder:

  • die Kamera um den Ursprung drehen und dann übersetzen sie (*)

oder:

  • Verwendung gluLookAt die Kamera auf Hinweis zu halten das Zentrum des Kreises

(*) Rotationsfunktionen drehen sich normalerweise um den Ursprung. um einen anderen Punkt zu drehen P müssen Sie:

  • übersetzen (-P)
  • drehen
  • übersetzen (P)
+0

Ich habe das mit "quaternions prototype" getan (einfache Methode innerhalb meiner Vector-Klasse, die sich um einen anderen Vektor dreht). sieht flexibler aus =) – shybovycha

2

ich Probleme wie diese viel leichter zu lösen finden mit gluLookAt (). Sie definieren einen Pfad für die Kamera (ein Kreis ist einfach!) Und halten den "Mittelpunkt" -Punkt fest (d. H. Das, was Sie sehen).

Der einzig mögliche Trick besteht darin, einen guten Vektor zu definieren - aber normalerweise nicht zu viel Arbeit. Wenn der Pfad und der Zielpunkt in derselben Ebene liegen, können Sie jedes Mal den gleichen Vektor verwenden.

3

Warum sollten Sie sich die Mühe machen, die Kamera zu drehen und die Szene nicht selbst zu drehen?
Es ist viel einfacher. Drehen Sie einfach die Modellansichtsmatrix um den Ursprung. Sie erhalten genau das gleiche Ergebnis.

+8

Die Kamera wird in diesem Fall durch Drehen der Modellansichtsmatrix implementiert, sodass das Drehen der Modellansichtsmatrix genauso erfolgt wie das Drehen der Kamera. Das Drehen der Szene beinhaltet die Verwendung verschiedener Vertex-Positionen usw. Ich dachte, Ihr Beitrag wäre ein wenig verwirrend. – jheriko

10

es ist ein wenig verwirrend, aber ich denke, Sie sollten:

// move camera a distance r away from the center 
glTranslatef(0, 0, -r); 

// rotate 
glRotatef(angley, 0, 1, 0); 
glRotatef(anglex, 1, 0, 0); 

// move to center of circle  
glTranslatef(-cx, -cy, -cz) 

Notiz der Auftrag nicht geändert werden muss.