opengl 使用glm::lookAt()

ufj5ltwl  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(203)

我跟随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是什么)

qvtsj1bj

qvtsj1bj1#

up矢量基本上是一个定义你的世界“向上”方向的矢量。在几乎所有正常情况下,这将是矢量(0, 1, 0),即朝向正Y。eye是相机的视点位置,center是你正在看的地方。如果你想使用方向向量D而不是中心位置,你可以简单地使用eye + D作为中心位置,其中D可以是一个单位向量。
至于内部工作,或者更多细节,这是构建视图矩阵的常见基本函数。尝试阅读gluLookAt()的文档,它在功能上是等效的。

3lxsmp7m

3lxsmp7m2#

在这里,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.0;因此在这里归一化XY

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


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

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

c2e8gylq

c2e8gylq3#

在设置camera(或eye)和targetcenter)之后,使camera面对target,我们仍然可以旋转camera以获得不同的图片,所以这里是up矢量,它使camera固定,不能旋转。


的数据

nkoocmlb

nkoocmlb4#

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

字符串
也许你需要检查三个坐标:对象(或模型)坐标世界坐标相机(或视图)坐标

相关问题