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

C++ 基于OpenGL四元数的FPS相机抖动,c++,opengl,camera,frame-rate,glm-math,C++,Opengl,Camera,Frame Rate,Glm Math,我试图在我最近的项目中实现一个正确工作的FPS相机,并决定使用四元数,因为这是我的核心引擎处理旋转的方式 所以一切都很顺利。我处理我的输入,相机也相应地移动,但特别是当围绕全局y轴(上轴)旋转时,当移动鼠标时,然后在屏幕x轴上移动鼠标时,当我尝试朝同一方向转动相机时(左/右扫射),我看到的对象(一个简单的立方体)开始来回跳跃 我真的不知道是我的SDL配置有问题还是我的相机代码有问题 下面是摄像机行为的代码: glm::vec2 dm; if (firstTimeFPS) { dm =

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

所以一切都很顺利。我处理我的输入,相机也相应地移动,但特别是当围绕全局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());
}
我的transform类由glm::vec3(表示位置和比例)和一个四元数(表示旋转)组成。第一个代码块中的旋转方法有一个布尔参数,用于检查其是否围绕全局轴(=真)或局部轴旋转


谢谢你花了一些时间,如果需要更多的代码或者有些东西还不清楚,请让我知道

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

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

假设按如下方式分离向量,则应按此方式计算视图矩阵

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

谢谢你的回答,但它看起来并不能解决任何问题。相反,现在的运动真的很奇怪。我想问题在于视图与getLeft()向量不垂直。。就像我说的,这个动作没有任何问题,但物体令人讨厌的抖动感觉不对劲。你是如何计算getLeft的?应该是
glm::cross(dir,up)
。否则可能会有一些干扰。目前我正在从旋转四元数中提取getLeft,如下所示:
glm::vec3 Transform::getLeft(float f){return(glm::normalize(Rotation)*glm::vec3(1,0,0))*f;}
其中float f是缩放方向向量的值。