使用lookAt进行相机旋转

Camera Rotation using lookAt

本文关键字:相机 旋转 lookAt 使用      更新时间:2023-10-16

嘿,伙计们,我试图做一个相机类,使用从glm库lookAt。我有4个点,第一个是eye,这是相机在空间中的位置,第二个是look,这是相机所看到的点,第三个是upp,它设置了相机的方向,第四个是side,这是look -eye和upp -eye的叉积。

所以最后我得到了3个向量的基底它们的原点都在眼点。我得到了相机的坐标系统。

在我的camera类中,我希望能够围绕摄像机的坐标系旋转,而不是世界的坐标系。我要做的是绕摄像机坐标系的一个轴旋转

我用这样的初始值构造类:

void Observer::initialize(glm::vec3 eye, glm::vec3 look, glm::vec3 upp, glm::vec3 side) 
{
    this->eye = eye;        // (0.0, 0.0,  0.0)
    this->look = look;      // (0.0, 0.0, -1.0)
    this->upp = upp;        // (0.0, 1.0,  0.0)
    this->side = side;      // (1.0, 0.0,  0.0)
}

例如,当我想围绕x轴旋转坐标系时,我从glm中调用函数,如下所示:

void Observer::pitch(GLfloat pitch) 
{
    glm::mat4 rotate(1.0f);
    rotate = glm::rotate(rotate, pitch, side - eye);
    look = glm::vec3(rotate * glm::vec4(look, 1.0f));
    upp = glm::vec3(rotate * glm::vec4(upp, 1.0f));
}

到目前为止,我所理解的是,我所有的点仍然构成了相机的一个坐标系统,所有的向量彼此垂直。

然后我用lookAt函数得到的这些点来定位相机在世界中的位置。

 glm::mat4 view = glm::lookAt(eye, look, upp);

将这个矩阵与OpenGL中的modelview矩阵相乘

如果我开始大量旋转,几次旋转后相机会"反映"旋转,就像我以另一种方式旋转一样(我不知道如何更好地描述真正发生的事情=s)。

我真的不明白发生了什么事。我应该在旋转之后归一化这些向量吗?我有一个问题与万向锁(我不知道很多关于万向锁)?

当您对向量进行增量旋转时,数值误差会增加。当误差导致向上和向下矢量几乎指向相同方向或彼此相反时,相机变换计算不稳定,可能会发生奇怪的事情。万向节锁。长度变化会引起不同的问题。

一个对我有效的解决方案是在每次旋转后重新正交化向上和向下的向量。要做到这一点,计算它们的外积L,然后通过将L与lookAt交叉来调整(实际上是替换)向上向量。所有这一切之后,重新标准化两个向上看单位长度。

虽然正交化归一化是一个快速的操作,但你并不需要对每个相机运动都这样做。

注意,当你像这样修正向量时,你实际上是在做lookAt矩阵计算的一部分,所以考虑实现你自己的,以避免不必要的叉乘。