嘿伙计们,我正在尝试做一个使用 glm 库中的 lookAt 的 Camera 类。我有4个点,第一个是eye,即相机在空间中的位置,第二个是look,即相机正在看的点,第三个是upp,设置相机的方向,第四个是边,它是look-eye和upp-eye的叉积。
所以最后我得到了一个由 3 个向量组成的基础,所有这些向量都以眼点为原点。我得到了相机的坐标系。
在我的相机类中,我希望能够围绕相机的坐标系而不是世界的坐标系旋转。所以我正在做的是围绕相机坐标系的轴之一旋转。
我用这样的初始值构造类:
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 的模型视图矩阵相乘
如果我开始旋转很多,旋转几次后的相机会“反映”旋转,就像我以另一种方式旋转一样(我不知道如何以更好的方式描述真正发生的事情=s)。
我真的不明白发生了什么。应用旋转后我应该对向量进行归一化吗?我的云台锁有问题吗(我对云台锁不太了解)?