理解glm :: lookAt()

Cas*_*yas 50 c++ opengl glm-math

我正在学习OpenGL来学习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 
)
Run Code Online (Sandbox Code Playgroud)

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

Pre*_*eti 68

up载体基本上是定义你的世界的"向上"方向的矢量.在几乎所有正常情况下,这将是向量,(0, 1, 0)即朝向正Y. eye是摄像机视点的位置,并且center是您正在查看的位置(位置).如果要使用方向向量D而不是中心位置,则可以简单地将其eye + D用作中心位置,例如,D可以是单位向量.

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


Ser*_* K. 41

在这里,Up矢量定义了3D世界中的"向上"方向(对于此相机).例如,值vec3(0, 0, 1)表示Z轴向上指向.

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

并且Center是相机看到的点(场景的中心).

理解某事的最好方法就是自己做.下面是如何的相机转化可以使用3个向量来构造:Eye,Center,和Up.

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

    LVector3 X, Y, Z;
Run Code Online (Sandbox Code Playgroud)

创建一个新的坐标系:

    Z = Eye - Center;
    Z.Normalize();
    Y = Up;
    X = Y.Cross( Z );
Run Code Online (Sandbox Code Playgroud)

重新计算Y = Z cross X:

    Y = Z.Cross( X );
Run Code Online (Sandbox Code Playgroud)

交叉积的长度等于平行四边形的面积,对于非垂直单位长度矢量,其<1.0; 这样规范化X,Y这里:

    X.Normalize();
    Y.Normalize();
Run Code Online (Sandbox Code Playgroud)

将所有内容放入生成的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;
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然代码很好,如果OP不知道`lookAt`是如何工作的以及参数意味着什么,这对他来说根本不能理解任何东西.例如*"交叉乘积给出平行四边形的面积,对于非垂直单位长度向量<1.0" - 完全不相关,甚至超过它给出与两个操作数正交的向量(其长度是平行四边形的面积) )这是我们在这里需要的几何属性.但是好吧,最后一部分从贬低中拯救了它. (5认同)

Den*_*nny 10

设置了camera( 或eye) 和target( center) 后,camera面对target,我们仍然可以旋转 来camera得到不同的图片,这样就得到了固定且不能旋转的up向量。camera

在此输入图像描述