我跟随一个教程学习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是什么)
发布于 2014-02-17 13:32:18
up矢量基本上是定义你的世界“向上”方向的向量。在几乎所有的正常情况下,这将是向量(0, 1, 0),即正的Y。eye是相机观点的位置,而center是你看到(一个位置)的位置。如果您想使用方向向量D而不是中心位置,您可以简单地使用eye + D作为中心位置,例如,D可以是一个单位向量。
至于内部工作或更多细节,这是构建视图矩阵的一个常见基本功能。尝试读取gluLookAt()的文档,这在功能上是等价的。
发布于 2014-02-17 13:39:18
在这里,Up矢量定义了你的3D世界中的“向上”方向(对于这个相机)。例如,vec3(0, 0, 1)的值意味着Z轴向上点.
Eye是你虚拟3D相机所在的位置。
而Center是摄像机所看到的点(场景的中心)。
了解某事的最好方法是自己动手。以下是如何使用三个矢量来构造相机转换: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.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;
}发布于 2019-09-16 06:23:12
在设置camera(或eye)和target(center),使camera面向target后,仍然可以旋转camera以获得不同的图像,因此出现了up矢量,使camera固定且不能旋转。

https://stackoverflow.com/questions/21830340
复制相似问题