web-dev-qa-db-de.com

Grundlegendes zu glm :: lookAt ()

Ich folge einem Tutorial , um OpenGL zu lernen, in dem sie die Funktion glm::lookAt() verwendeten, um eine Ansicht zu erstellen, aber ich kann die Arbeitsweise von glm::lookAt() nicht verstehen, und anscheinend gibt es dies Keine detaillierte Dokumentation von GLM. Kann mir jemand helfen, die Parameter und die Funktionsweise von glm::lookAt() zu verstehen?

Die 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 aktuelles Verständnis ist, dass sich die Kamera auf eye befindet und auf center gerichtet ist. (Und ich weiß nicht, was der up ist)

47
Cashif Ilyas

Der up -Vektor ist im Grunde ein Vektor, der die "Aufwärtsrichtung" Ihrer Welt definiert. In fast allen normalen Fällen ist dies der Vektor (0, 1, 0) d. h. in Richtung des positiven Y. eye ist die Position des Kameraperspektivs und center ist die Position, auf die Sie schauen (eine Position). Wenn Sie einen Richtungsvektor D anstelle einer Mittelposition verwenden möchten, können Sie einfach eye + D als Mittelposition, wobei D beispielsweise ein Einheitsvektor sein kann.

Was das Innenleben oder weitere Details betrifft, so ist dies eine übliche Grundfunktion zum Erstellen einer Ansichtsmatrix. Lesen Sie die Dokumentation zu gluLookAt () , was funktional äquivalent ist.

64
Preet Kukreti

Hier definiert der Vektor Up die Aufwärtsrichtung in Ihrer 3D-Welt (für diese Kamera). Beispielsweise bedeutet der Wert von vec3(0, 0, 1), dass die Z-Achse nach oben zeigt.

Eye ist der Punkt, an dem sich Ihre virtuelle 3D-Kamera befindet.

Und Center ist der Punkt, auf den die Kamera schaut (Mitte der Szene).

Der beste Weg, etwas zu verstehen, ist es, es selbst zu machen. So kann eine Kameratransformation mit drei Vektoren erstellt werden: Eye, Center und Up.

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

    LVector3 X, Y, Z;

Erstellen Sie ein neues Koordinatensystem:

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

Berechne Y = Z cross X Neu:

    Y = Z.Cross( X );

Die Länge des Kreuzprodukts ist gleich der Fläche des Parallelogramms, die für nicht senkrechte Einheitslängenvektoren <1,0 ist. So normalisiere X, Y hier:

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

Setze 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;
}
40
Sergey K.