基于四元数的相机不需要的滚动

时间:2013-12-31 10:25:28

标签: c++ opengl math 3d directx

我正在尝试实现基于四元数的相机,但是当绕X轴和Y轴移动时,相机会在Z轴上产生不需要的滚动。我希望能够在所有轴上自由地环顾四周。 我已经阅读了关于这个问题的其他主题(例如:http://www.flipcode.com/forums/thread/6525),但我没有得到“通过围绕WORLD轴旋转连续重建旋转矩阵来修复此问题,即< 1,0,0>,< 0,1,0>,< 0,0,1&gt ;,不是您的本地坐标,无论它们是什么。“

//Camera.hpp
glm::quat rotation;

//Camera.cpp
void Camera::rotate(glm::vec3 vec)
{
    glm::quat paramQuat = glm::quat(vec);
    rotation = paramQuat * rotation;
}

我像这样调用旋转函数:

cam->rotate(glm::vec3(0, 0.5, 0));

这必须与当地/世界坐标有关,对吧?我只是没有得到它,因为我认为四元数总是基于彼此(因此四元数不能在“世界”或“本地”空间?)。 另外,我应该为相机使用多个四元数吗?

1 个答案:

答案 0 :(得分:1)

据我了解,并且通过查看您提供的代码,它们的意思是您不应该通过在旋转quat上始终应用旋转来逐步存储和应用旋转,而是跟踪每个轴的两个四元数(世界空间中的X和Y)并计算旋转矢量作为它们的乘积。

[编辑:一些添加(伪)代码]

// Camera.cpp
void Camera::SetRotation(glm::quat value)
{
    rotation = value;
}

// controller.cpp --> probably a place where you'd want to translate user input and store your rotational state
xAngle += deltaX;
yAngle += deltaY;
glm::quat rotationX = QuatAxisAngle(X_AXIS, xAngle);
glm::quat rotationY = QuatAxisAngle(Y_AXIS, yAngle);
camera.SetRotation(rotationX * rotationY);