gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:39:22 24 4
gpt4 key购买 nike

我正在尝试在我最近的项目中实现一个正常工作的类似 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)还是局部轴旋转。

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

最佳答案

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

但是看看您的 View 矩阵,我认为您没有正确应用它。

假设您按如下方式分离 vector ,您的 View 矩阵应该这样计算。

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

关于c++ - 基于 OpenGL 四元数的 FPS 相机抖动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32402024/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com