基于OpenGL Quaternion的FPS相机抖动

时间:2015-09-04 15:50:01

标签: c++ opengl camera frame-rate glm-math

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

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

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

所以这是相机行为的代码:

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参数,检查它是否围绕global(= true)或local axis旋转。

感谢您抽出宝贵时间,如果需要更多代码或有什么不明确的地方,请告诉我们!

1 个答案:

答案 0 :(得分:1)

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

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

假设您按照以下方式分离了矢量,则应按原样计算视图矩阵。

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