【问题标题】:OpenGL Quaternion based FPS Camera jiggling基于 OpenGL 四元数的 FPS 相机抖动
【发布时间】:2015-09-04 15:50:01
【问题描述】:

我正在尝试在我最近的项目中实现一个正常工作的类似 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());
}

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

感谢您抽出一些时间,如果需要更多代码或尚不清楚的地方,请告诉我!

【问题讨论】:

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


    【解决方案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);
    

    【讨论】:

    • 感谢您的回答,但它看起来无法解决任何问题。相反,现在的运动真的很奇怪。我想问题是由于视图不垂直于 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 是用于缩放方向向量的值。
    猜你喜欢
    • 2012-11-30
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多