基于四元数的相机不需要的卷轴

Quaternion-Based-Camera unwanted roll

本文关键字:不需要 相机 四元数      更新时间:2023-10-16

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

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

这一定与局部/世界坐标有关,对吧?我只是不明白,因为我认为四元数总是相互基于的(因此四元数不能在"世界"或"局部"空间中?另外,我应该为相机使用多个四元数吗?

据我了解,从您提供的代码来看,它们的意思是,您不应该通过一直对旋转四重数应用旋转来增量存储和应用旋转,而是跟踪每个轴的两个四元数(世界空间中的 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);