我正在关注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
是什么)
答案 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个向量构建相机变换的方法:Eye
,Center
和Up
。
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表示非垂直单位长度向量;这样规范化X
,Y
:
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
)和target
(center
)之后,我们仍然可以旋转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)
)
这并不困难,也许您需要查看三个坐标: 对象(或模型)坐标,世界坐标和相机(或视图)坐标。