c++ - library - glm github
Comprender glm:: lookAt() (3)
Aquí, el vector Up
define la dirección "hacia arriba" en su mundo 3D (para esta cámara). Por ejemplo, el valor de vec3(0, 0, 1)
significa que el eje Z apunta hacia arriba.
Eye
es el punto donde se encuentra la cámara 3D virtual.
Y el Center
es el punto que mira la cámara (centro de la escena).
La mejor manera de entender algo es hacerlo tú mismo. Así es como se puede construir una transformación de cámara utilizando 3 vectores: Eye
, Center
y Up
.
LMatrix4 LookAt( const LVector3& Eye, const LVector3& Center, const LVector3& Up )
{
LMatrix4 Matrix;
LVector3 X, Y, Z;
Crea un nuevo sistema de coordenadas:
Z = Eye - Center;
Z.Normalize();
Y = Up;
X = Y.Cross( Z );
Recompute Y = Z cross X
:
Y = Z.Cross( X );
La longitud del producto transversal es igual al área del paralelogramo, que es <1.0 para vectores de longitud de unidad no perpendiculares; así que normaliza X
, Y
aquí:
X.Normalize();
Y.Normalize();
Pon todo en la matriz 4x4 resultante:
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;
}
Estoy siguiendo un tutorial para aprender OpenGL en el que usaron la función glm::lookAt()
para construir una vista, pero no puedo entender el funcionamiento de glm::lookAt()
y, aparentemente, no hay documentación detallada de GLM. ¿Alguien puede ayudarme a entender los parámetros y el funcionamiento de glm::lookAt()
por favor?
La documentación de GLM dice:
detail::tmat4x4<T> glm::gtc::matrix_transform::lookAt
(
detail::tvec3< T > const & eye,
detail::tvec3< T > const & center,
detail::tvec3< T > const & up
)
Mi comprensión actual es que la cámara está ubicada a eye
y está orientada hacia el center
. (Y no sé qué up
)
El vector up
es básicamente un vector que define la dirección "hacia arriba" de tu mundo. En casi todos los casos normales, este será el vector (0, 1, 0)
es decir, hacia Y positivo. El eye
es la posición del punto de vista de la cámara, y el center
es donde está mirando (una posición). Si desea utilizar un vector de dirección D
lugar de una posición central, simplemente puede usar eye + D
como posición central, donde D
puede ser un vector unitario, por ejemplo.
En cuanto al funcionamiento interno, o más detalles, esta es una función básica común para construir una matriz de vista. Intente leer los documentos para gluLookAt() que es funcionalmente equivalente.
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)
)
No es difícil, tal vez necesites revisar las tres coordenadas: coordenadas del objeto (o modelo) , coordenadas del mundo y coordenadas de la cámara (o de la vista) .