首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解glm::lookAt()

理解glm::lookAt()
EN

Stack Overflow用户
提问于 2014-02-17 13:27:14
回答 4查看 130.4K关注 0票数 71

我跟随一个教程学习OpenGL,其中他们使用glm::lookAt()函数构建视图,但我无法理解glm::lookAt()的工作原理,而且显然没有详细的GLM文档。有人能帮我理解glm::lookAt()的参数和工作吗?

GLM文件说:

代码语言:javascript
复制
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是什么)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-02-17 13:32:18

up矢量基本上是定义你的世界“向上”方向的向量。在几乎所有的正常情况下,这将是向量(0, 1, 0),即正的Y。eye是相机观点的位置,而center是你看到(一个位置)的位置。如果您想使用方向向量D而不是中心位置,您可以简单地使用eye + D作为中心位置,例如,D可以是一个单位向量。

至于内部工作或更多细节,这是构建视图矩阵的一个常见基本功能。尝试读取gluLookAt()的文档,这在功能上是等价的。

票数 91
EN

Stack Overflow用户

发布于 2014-02-17 13:39:18

在这里,Up矢量定义了你的3D世界中的“向上”方向(对于这个相机)。例如,vec3(0, 0, 1)的值意味着Z轴向上点.

Eye是你虚拟3D相机所在的位置。

Center是摄像机所看到的点(场景的中心)。

了解某事的最好方法是自己动手。以下是如何使用三个矢量来构造相机转换:EyeCenterUp

代码语言:javascript
复制
LMatrix4 LookAt( const LVector3& Eye, const LVector3& Center, const LVector3& Up )
{
    LMatrix4 Matrix;

    LVector3 X, Y, Z;

创建一个新的坐标系:

代码语言:javascript
复制
    Z = Eye - Center;
    Z.Normalize();
    Y = Up;
    X = Y.Cross( Z );

重新计算Y = Z cross X

代码语言:javascript
复制
    Y = Z.Cross( X );

交叉积的长度等于平行四边形的面积,对于不垂直的单位长度向量,它小于1.0;因此,将XY归一化如下:

代码语言:javascript
复制
    X.Normalize();
    Y.Normalize();

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

代码语言:javascript
复制
    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;
}
票数 57
EN

Stack Overflow用户

发布于 2019-09-16 06:23:12

在设置camera(或eye)和target(center),使camera面向target后,仍然可以旋转camera以获得不同的图像,因此出现了up矢量,使camera固定且不能旋转。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21830340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档