web-dev-qa-db-fra.com

Comprendre glm :: lookAt ()

Je suis un tutoriel pour apprendre OpenGL dans lequel ils ont utilisé la fonction glm::lookAt() pour construire une vue mais je ne comprends pas le fonctionnement de glm::lookAt() et apparemment, il y a pas de documentation détaillée de GLM. Quelqu'un peut-il m'aider à comprendre les paramètres et le fonctionnement de glm::lookAt() s'il vous plaît?

La documentation GLM dit:

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

Ma compréhension actuelle est que la caméra est située à eye et est dirigée vers center. (Et je ne sais pas ce que le up est)

47
Cashif Ilyas

Le vecteur up est fondamentalement un vecteur définissant la direction "ascendante" de votre monde. Dans presque tous les cas normaux, ce sera le vecteur (0, 1, 0) c'est-à-dire vers Y positif. eye est la position du point de vue de la caméra, et center est l'endroit où vous regardez (une position). Si vous souhaitez utiliser un vecteur de direction D au lieu d'une position centrale, vous pouvez simplement utiliser eye + D comme position centrale, où D peut être un vecteur unitaire, par exemple.

En ce qui concerne le fonctionnement interne ou davantage de détails, il s'agit d'une fonction de base commune pour la construction d'une matrice de vues. Essayez de lire la documentation pour gluLookAt () qui est fonctionnellement équivalent.

64
Preet Kukreti

Ici, le vecteur Up définit la direction "ascendante" de votre monde 3D (pour cette caméra). Par exemple, la valeur de vec3(0, 0, 1) signifie que l'axe des Z est dirigé vers le haut.

Eye est le point où se trouve votre caméra 3D virtuelle.

Et Center est le point que la caméra regarde (centre de la scène).

Le meilleur moyen de comprendre quelque chose est de le faire soi-même. Voici comment une transformation de caméra peut être construite en utilisant 3 vecteurs: Eye, Center et Up.

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

    LVector3 X, Y, Z;

Créez un nouveau système de coordonnées:

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

Recalculer Y = Z cross X:

    Y = Z.Cross( X );

La longueur du produit croisé est égale à l'aire du parallélogramme, <1,0 pour les vecteurs de longueur unitaire non perpendiculaires; donc normaliser X, Y ici:

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

Mettez tout dans la matrice 4x4 résultante:

    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.