理解glm :: lookAt()

时间:2014-02-17 13:27:14

标签: c++ opengl glm-math

我正在关注tutorial学习OpenGL,他们使用glm::lookAt()函数来构建视图,但我无法理解glm::lookAt()的工作情况,显然,没有详细的文档说明GLM。任何人都可以帮助我理解glm::lookAt()的参数和工作吗?

GLM文档说:

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

我目前的理解是相机位于eye,面向center。 (我不知道up是什么)

4 个答案:

答案 0 :(得分:63)

up向量基本上是一个定义世界“向上”方向的向量。在几乎所有正常情况下,这将是向量(0, 1, 0),即朝向正Y. eye是摄像机视点的位置,center是您正在查看的位置(位置) 。如果您想使用方向向量D而不是中心位置,则只需使用eye + D作为中心位置,例如D可以是单位向量。

对于内部工作或更多细节,这是构建视图矩阵的常见基本功能。尝试阅读功能相同的gluLookAt()文档。

答案 1 :(得分:40)

此处,Up向量定义了3D世界中的“向上”方向(对于此相机)。例如,vec3(0, 0, 1)的值表示Z轴向上指向。

Eye是虚拟3D摄像头所在的位置。

Center是相机看到的点(场景的中心)。

理解某事的最好方法就是自己做。以下是使用3个向量构建相机变换的方法:EyeCenterUp

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

    LVector3 X, Y, Z;

创建一个新的坐标系:

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

重新计算Y = Z cross X

    Y = Z.Cross( X );

叉积的长度等于平行四边形的面积,其小于1。 1.0表示非垂直单位长度向量;这样规范化XY

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

将所有内容放入生成的4x4矩阵中:

    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;
}

答案 2 :(得分:0)

camera(或eye)和targetcenter)之后,我们仍然可以旋转camera以获取不同的图片,所以这里是使up固定且无法旋转的camera向量。

答案 3 :(得分:-11)

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)
)

这并不困难,也许您需要查看三个坐标: 对象(或模型)坐标世界坐标相机(或视图)坐标