2014-02-17 16 views
38

Ich bin ein tutorial zu lernen OpenGL, in dem sie glm::lookAt() Funktion verwendet, um eine Ansicht zu bauen, aber ich kann nicht die Funktionsweise von glm::lookAt() verstehen und anscheinend gibt es keine detaillierte Dokumentation von GLM. Kann mir bitte jemand helfen, die Parameter und Funktionsweise von glm::lookAt() zu verstehen?Understanding Glm :: lookAt()

GLM-Dokumentation sagt:

detail::tmat4x4<T> glm::gtc::matrix_transform::lookAt 
( 
    detail::tvec3<T> const & eye, 
    detail::tvec3<T> const & center, 
    detail::tvec3<T> const & up 
) 

Mein gegenwärtiges Verständnis ist, dass die Kamera bei eye befindet und in Richtung center konfrontiert. (Und ich weiß nicht, was die up ist)

+5

Es könnte helfen, wenn Sie verstanden haben, was eine Ansichtsmatrix tut. Es bildet die Grundlage für Ihren Betrachtungsvektorraum, definiert also alle Achsen (X, Y, Z) Ihres Koordinatensystems. Sie benötigen dazu drei Vektoren. Der "up" Vektor definiert explizit die up (Y) Achse, die anderen zwei werden basierend auf der Richtung vom "Auge" zum "center" (manchmal als "forward" Vektor oder Z-Achse bezeichnet) und dem Produkt zwischen der Z-Achse und der Y-Achse, um die X-Achse ("linker" Vektor) zu erzeugen, die senkrecht zu beiden ist. LookAt definiert auch den Ursprung in einer Achse. –

Antwort

49

Versuchen Sie, die inneren Abläufe oder nur die Params zu verstehen?

Der Vektor up ist im Grunde genommen ein Vektor, der die Richtung Ihrer Welt nach oben definiert. In fast allen normalen Fällen ist dies der Vektor (0, 1, 0), d. H. Zu positivem Y. eye ist die Position des Blickpunkts der Kamera und center ist der Ort, an dem Sie sich gerade befinden (eine Position). Wenn Sie anstelle einer Mittelposition einen Richtungsvektor verwenden möchten, können Sie einfach eye + D als Mittelposition verwenden, wobei D z. B. ein Einheitsvektor sein kann.

Für die inneren Arbeiten, oder mehr Details, ist dies eine allgemeine Grundfunktion für den Aufbau einer Ansichtsmatrix. Versuchen Sie, die Dokumentation für gluLookAt() zu lesen, die funktional äquivalent ist.

34

Hier definiert der Vektor Up die Richtung "nach oben" in Ihrer 3D-Welt (für diese Kamera). Zum Beispiel bedeutet der Wert vec3(0, 0, 1), dass die Z-Achse nach oben zeigt.

Eye ist der Punkt, wo Sie virtuelle 3D-Kamera befindet.

Und Center ist der Punkt, den die Kamera betrachtet (Zentrum der Szene).

Der beste Weg, etwas zu verstehen, ist es, es selbst zu machen. Hier ist, wie eine Kameratransformation unter Verwendung von 3 Vektoren aufgebaut werden kann: Eye, Center und Up.

LMatrix4 LookAt(const LVector3& Eye, const LVector3& Center, const LVector3& Up) 
{ 
    LMatrix4 Matrix; 

    LVector3 X, Y, Z; 

Erstelle ein neues Koordinatensystem:

Z = Eye - Center; 
    Z.Normalize(); 
    Y = Up; 
    X = Y.Cross(Z); 

Recompute Y = Z cross X:

Y = Z.Cross(X); 

Die Länge des Kreuzprodukts, um die Fläche des Parallelogramms entspricht, welches < 1 ist.0 für nicht-senkrechte Einheitslängen-Vektoren; so normalisieren X, Y hier:

X.Normalize(); 
    Y.Normalize(); 

Setzen Sie alles in die resultierende 4x4 Matrix:

Matrix[0][0] = X.x; 
    Matrix[1][0] = X.y; 
    Matrix[2][0] = X.z; 
    Matrix[3][0] = -X.Dot(Eye); 
    Matrix[0][1] = Y.x; 
    Matrix[1][1] = Y.y; 
    Matrix[2][1] = Y.z; 
    Matrix[3][1] = -Y.Dot(Eye); 
    Matrix[0][2] = Z.x; 
    Matrix[1][2] = Z.y; 
    Matrix[2][2] = Z.z; 
    Matrix[3][2] = -Z.Dot(Eye); 
    Matrix[0][3] = 0; 
    Matrix[1][3] = 0; 
    Matrix[2][3] = 0; 
    Matrix[3][3] = 1.0f; 

    return Matrix; 
} 
+3

Während der Code ist schön, wenn das OP nicht weiß, wie 'LookAt' funktioniert und was die Parameter bedeuten, hilft es ihm nichts überhaupt zu verstehen. Z.B. * "Kreuzprodukt gibt Bereich des Parallelogramms, der für nicht-senkrechte Einheitslängenvektoren <1,0 ist" - völlig irrelevant, sogar mehr als dass es einen Vektor orthogonal zu beiden Operanden gibt (deren Länge die Fläche des Parallelogramms ist) und das ist die geometrische Eigenschaft, die wir hier brauchen. Aber ok, der letzte Teil rettet es vor der Abstimmung. –

+0

@ChristianRau: Ich habe meine Antwort mit einer einfachen englischen Erklärung der Bedeutung der Parameter aktualisiert. Das Einfügen nicht normalisierter Vektoren in die resultierende Matrix führt zu falschen Ergebnissen. –

+0

* "definiert die Richtung" nach oben "in Ihrer 3D-Welt." * - In Ihrer 3D-Welt oder nur von Ihrer Kamera? Aber vergiss es jetzt schon. –

-9
detail::tmat4x4<T> glm::gtc::matrix_transform::lookAt 
( 
    detail::tvec3<T> const & //eye position in worldspace 
    detail::tvec3<T> const & //the point where we look at 
    detail::tvec3<T> const & //the vector of upwords(your head is up) 
) 

Es ist nicht schwierig, vielleicht müssen Sie die drei Koordinaten überprüfen: Objekt (oder Modell) Koordinaten, Weltkoordinaten und Kamera (oder Ansicht) Koordinaten.

+12

Nicht ganz sicher, wie es hilft oder ermutigt den Fragesteller, indem er sagt, dass das Konzept nicht schwierig ist. –

+6

Das Urteil darüber, wie "einfach" eine Frage ist, dient oft nur dazu, die Person, die Hilfe sucht, zu vereiteln oder zu schmälern. – ophilbinbriscoe