基于OpenGL四元数的FPS相机抖动

OpenGL Quaternion based FPS Camera jiggling

本文关键字:相机 抖动 FPS OpenGL 四元数 基于      更新时间:2023-10-16

我试图在我最近的项目中实现一个正确工作的fps类相机,并决定使用Quaternions,因为这是我的核心引擎处理旋转的方式。

所以一切都很好。我处理我的输入和相机相应移动,但特别是当围绕全局y轴(上轴)旋转时,当我在屏幕x轴上移动鼠标时,我试图将相机转向同一方向(向左/向右扫射),我正在看的对象(一个简单的立方体)开始来回跳跃。

我真的不知道这是关于我的SDL配置的问题还是我的相机代码混乱。

下面是camera-behaviour的代码:
glm::vec2 dm;
if (firstTimeFPS) 
{
    dm = glm::vec2();
    firstTimeFPS = false;
}
else
    dm = pEngine::input->getDeltaMouse();
glm::vec3 translation;

float rotY = dm.x*pEngine::time->deltaTime*0.5;
float rotX = dm.y*pEngine::time->deltaTime*0.5;

m_camera.m_transform.rotate(rotY, glm::vec3(0, 1, 0), true);
m_camera.m_transform.rotate(-rotX, glm::vec3(1, 0, 0), false);
if (pEngine::input->isKeyDown(SDLK_w))
    translation += m_camera.m_transform.getForward();
if (pEngine::input->isKeyDown(SDLK_s))
    translation -= m_camera.m_transform.getForward();
if (pEngine::input->isKeyDown(SDLK_a))
    translation += m_camera.m_transform.getLeft();
if (pEngine::input->isKeyDown(SDLK_d))
    translation -= m_camera.m_transform.getLeft();
glm::normalize(translation);
translation *= pEngine::time->deltaTime * 20;
m_camera.m_transform.translate(translation);

这是计算viewMatrix的函数:

void Camera::recalculateViewMatrix()
{ 
m_viewMatrix = glm::lookAt(m_transform.position, m_transform.position +   m_transform.getForward(), m_transform.getUp());
}

我的变换类由glm::vec3(表示位置和比例)和一个四元数(表示旋转)组成。第一个代码块中的rotation方法有一个bool参数,用于检查它是绕全局轴(=true)还是局部轴旋转。

感谢您花了一些时间,如果需要更多的代码或某些东西是不清楚的,请让我知道!

听起来你的转换代码搞砸了。

但是看看你的视图矩阵,让我觉得你没有正确地应用它。

假设你像下面这样分离你的向量,你的视图矩阵应该是这样计算的。

pos = glm::vec3(1.0f, 1.0f, 1.0f);
dir = glm::vec3(0.0f, 0.0f, -1.0f);
up = glm::vec3(0.0f, 1.0f, 0.0f);
rot = glm::angleAxis(0.0f, dir);
viewMatrix = glm::mat4_cast(rot) * glm::lookAt(pos, pos + dir, up);