Frage

Mit OpenGL Ich versuche, eine primitive Karte meines Campus zu ziehen.

Kann jemand mir erklären, wie Schwenken, Zoomen und Drehen wird in der Regel umgesetzt?

Zum Beispiel mit Schwenken und Zoomen, ist, dass einfaches Einstellen ich meine Ansichtsfenster? Also ich plotten und alle meine Linien zeichnen, die meine Karte zusammenstellen und dann als der Benutzer klickt und schleppt es passt meine Ansichtsfenster?

Für Panning, verschiebt er den x / y-Wert meines Ansichtsfensters und zum Zoomen ist es mein Ansichtsfenster um einen gewissen Betrag erhöhen / verringern? Was ist für eine Drehung?

Für Drehung, muss ich tun affin für jede Polylinie transformiert, die meine Campus Karte darstellt? Wird dies nicht teuer on the fly auf einer recht großen Karte zu tun?

Oder ist das Ansichtsfenster links die gleiche und Schwenken / Zoomen / Rotation wird in einigen otherway getan?


Zum Beispiel, wenn Sie gehen auf diese Link Sie werden ihn genau Schwenken und Zoomen sehen beschreiben, wie ich oben haben, durch das Ansichtsfenster zu ändern.

Ist korrigiert dies nicht?

War es hilfreich?

Lösung

Sie sind durch die Anwendung einer Reihe von glTranslate, glRotate Befehle erreicht (die Kameraposition und Orientierung darstellen), bevor die Szene zeichnen. (Technisch, Sie Drehen die ganze Szene!)

Es gibt Utility-Funktionen wie gluLookAt welche sorta abstrakt einige Details darüber.

Um die Dinge simplyify, übernehmen Sie haben zwei Vektoren darstellen, Kamera: Position und Richtung.

gluLookAt nimmt die Position, das Ziel und vektor.

Wenn Sie eine Vektor-Klasse implementieren, destinaion = position + direction sollten Sie einen Zielpunkt.

Auch die Dinge einfach zu machen, können Sie den Vektor übernehmen bis zu immer sein (0,1,0)

Dann, bevor in der Szene machen alles, um die Identität Matrix laden und rufen gluLookAt

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

Dann starten Sie Ihre Objekte zeichnen

Sie können den Benutzer Spanne lassen, indem die Position leicht nach rechts oder nach links zu ändern. Rotation ist ein wenig komplizierter, wie Sie den Richtungsvektor zu drehen haben. Unter der Annahme, dass das, was Sie dreht die Kamera, nicht irgendein Objekt in der Szene.

Ein Problem ist, wenn Sie nur einen Richtungsvektor „vorwärts“ haben, wie Sie sie bewegen? wo ist die rechte und die linke?

In diesem Fall Mein Ansatz ist es, nur das Kreuzprodukt von „Richtung“ zu nehmen und (0,1,0).

Nun können Sie die Kamera nach links und nach rechts bewegen, mit so etwas wie:

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

Sie können vorwärts bewegen, den „Richtungsvektor“ verwenden, aber IMO ist es besser, die Bewegung zu einer horizontalen Ebene zu beschränken, so dass der Vorwärtsvektor die gleiche Art und Weise erhalten wir die richtige Vektor bekamen:

forward = cross( up, right )

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

Der richtige Ansatz ist es, eine „anspruchsvolle“ Datenstruktur zu verwenden, um die „Orientierung“ der Kamera darzustellen, nicht nur die Vorwärtsrichtung. da Sie nur jedoch anfangen, es ist gut, die Dinge einen Schritt zu einer Zeit in Anspruch nehmen.

Andere Tipps

Alle diese „Maßnahmen“ erreicht werden kann, Model-View-Matrix-Transformation-Funktionen. Sie sollten über glTranslatef (Panning), glScalef (Zoom), glRotatef (Rotation) lesen. Sie sollten auch einige grundlegende Tutorial über OpenGL lesen müssen, finden Sie vielleicht Link nützlich.

Generell gibt es drei Schritte, die angewendet werden, wenn Sie einen beliebigen Punkt im 3D-Raum innerhalb opengl verweisen.

Bei einem Local Punkt

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

Jede dieser Transformationen wird Ihren 3D-Punkt nehmen, und Multiplikation mit einer Matrix.

Wenn Sie die Kamera drehen, es in der Regel der Welt verändert -> Kamera-Transformation durch die Matrix durch Ihre Rotation / Pan / Zoom-affine Transformation Transformation zu multiplizieren. Da alle Ihre Punkte werden jeden Frame neu gerendert, die neue Matrix auf Ihre Punkte angewendet wird, und es gibt das Aussehen einer Rotation.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top