2009-02-25 15 views
6

Mit OpenGL Ich versuche, eine primitive Karte meines Campus zu zeichnen.Wie funktioniert Zoomen, Schwenken und Drehen?

Kann mir jemand erklären, wie das Schwenken, Zoomen und Drehen normalerweise implementiert wird?

Zum Beispiel, mit Panning und Zoom, ist das nur ich Anpassung meines Ansichtsfensters? Also zeichne und zeichne ich alle meine Linien, die meine Karte bilden, und wenn der Benutzer dann klickt und zieht, passt er mein Ansichtsfenster an?

Ändert sich beim Panning die X/Y-Werte meines Ansichtsfensters und vergrößert/verkleinert es mein Ansichtsfenster um einen bestimmten Betrag? Was ist mit Rotation?

Muss ich für die Rotation affine Transformationen für jede Polylinie durchführen, die meine Campus-Karte darstellt? Ist das nicht teuer auf einer ordentlichen Karte?

Oder ist das Ansichtsfenster gleich und das Schwenken/Zoomen/Drehen erfolgt auf andere Weise?


Zum Beispiel, wenn Sie in diesem link gehst, wirst du ihn genau Schwenken und Zoomen sehen beschreiben, wie ich oben haben, durch das Ansichtsfenster zu ändern.

Ist das nicht korrekt?

Antwort

7

Sie werden durch Anwenden einer Reihe von glTranslate-, glRotate-Befehlen (die Kameraposition und -ausrichtung darstellen) vor dem Zeichnen der Szene erreicht. (technisch drehen Sie die ganze Szene!)

Es gibt Dienstprogrammfunktionen wie gluLookAt, die sorta einige Details darüber abstrahieren.

Um die Dinge zu vereinfachen, nehmen wir an, Sie haben zwei Vektoren, die Ihre Kamera darstellen: Position und Richtung.

gluLookAt übernimmt Position, Ziel und Vektor.Wenn Sie eine Vektorklasse implementieren, sollte destinaion = position + direction Ihnen einen Zielpunkt geben.

wieder, die Dinge einfach zu machen, können Sie die vektor immer

Dann annehmen kann sein (0,1,0), bevor in der Szene, laden Sie die Identitätsmatrix und rufen gluLookAt

Rendering etwas
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt(source.x, source.y, source.z, destination.x, destination.y, destination.z, 0, 1, 0); 

Beginnen Sie dann mit dem Zeichnen Ihrer Objekte

Sie können den Benutzer überspannen lassen, indem Sie die Position leicht nach rechts oder links ändern. Die Drehung ist etwas komplizierter, da Sie den Richtungsvektor drehen müssen. Angenommen, Sie drehen die Kamera, nicht ein Objekt in der Szene.

Ein Problem ist, wenn Sie nur einen Richtungsvektor "vorwärts" haben, wie bewegen Sie es? Wo ist rechts und links?

Mein Ansatz ist in diesem Fall, nur das Kreuzprodukt von "Richtung" und (0,1,0) zu nehmen.

Jetzt können Sie die Kamera nach links und rechts mit so etwas wie:

position = position + right * amount; //amount < 0 moves to the left 

Sie können uns darauf, den „Richtungsvektor“ bewegen Sie mit, aber IMO ist es besser, die Bewegung zu einer horizontalen Ebene zu beschränken , also erhalten Sie den Vorwärtsvektor die gleiche Art und Weise wir die richtige Vektor bekam:

forward = cross(up, right) 

Um ehrlich zu sein, das so etwas wie ein hackish Ansatz.

Der richtige Ansatz besteht darin, eine "ausgeklügeltere" Datenstruktur zu verwenden, um die "Ausrichtung" der Kamera darzustellen, nicht nur die Vorwärtsrichtung. Aber da Sie gerade erst angefangen haben, ist es gut, die Dinge Schritt für Schritt zu übernehmen.

+2

Lassen Sie mich hinzufügen, dass zu keinem Zeitpunkt der "Viewport" (wie durch glViewport gesetzt) ​​in diesen Prozess kommt. Das Ansichtsfenster legt fest, in welchen Bereich Ihres Fensters Sie rendern werden (das ist nicht wirklich richtig, aber denken Sie so vorerst daran) und wird sich normalerweise über das gesamte Fenster erstrecken. – Thomas

1

Im Allgemeinen gibt es drei Schritte, die immer dann angewendet werden, wenn Sie innerhalb von opengl auf einen Punkt im 3D-Raum verweisen.

sich in dieser Region gegeben

  • Lokale -> Welt
  • Welt Transform -> Kamera Trans
  • Kamera -.> Bildschirm-Transformation (in der Regel eine Projektion hängt davon ab, ob Sie Perspektive oder orthogonal verwenden
  • )

Jede dieser Transformationen wird 3D-Punkt nehmen, und durch eine Matrix multipliziert wird.

Wenn Sie die Kamera drehen, verändert sie im Allgemeinen die Welt -> Kamera-Transformation, indem Sie die Transformationsmatrix mit Ihrer affinen Transformation für Drehung/Schwenk/Zoom multiplizieren. Da alle Punkte in jedem Bild neu gerendert werden, wird die neue Matrix auf Ihre Punkte angewendet und es entsteht der Eindruck einer Drehung.

4

Alle diese "Aktionen" können mithilfe von Matrixtransformationsfunktionen für Modellansicht erreicht werden. Sie sollten über glTranslatef (Panning), glScalef (Zoom), glRotatef (Rotation) lesen. Sie sollten auch ein grundlegendes Tutorial über OpenGL lesen, das Sie möglicherweise nützlich finden.

Verwandte Themen