我正在为OpenGL编写一个使用四元数和Angle-Axis的相机类。我设法制作了一个水平旋转功能(这很容易),但我无法编写一个工作函数来垂直旋转它。所有我的尝试最终都是通过相机旋转地狱知道了什么方向... 我需要一个公式或代码我的垂直旋转功能(我的代码中的 pitchTurn())。
Here is my current code:
void Camera::yawTurn(const float& angle){
rotate(angle, 0.0f, 1.0f, 0.0f);
}
void Camera::pitchTurn(const float& angle){
// need code here
}
void Camera::rotate(const float& angle, const float& x, const float& y, const float& z){
Quaternionf t;
t.fromAxisAngle(angle, x, y, z);
q_ *= t;
q_.normalize();
}
我也想知道是否有更好的方法可以在不使用Angle-Axis的情况下使用四元数进行旋转。
答案 0 :(得分:1)
最可能的问题是轮换顺序。
四元数乘积q * r,当被视为两个组合旋转时,以r,q的顺序应用于变换后的顶点。
现在,如果你想围绕全局Y轴转动相机(轴不依赖于相机方向),你必须乘以t * q。如果你想围绕局部Y轴转动摄像机(轴是根据摄像机方向指定的 - 如果你正向下看,你的“向上”矢量位于XZ平面,即Y坐标为0),你必须乘以q * t。
典型的相机控件围绕全局Y轴和局部X轴旋转。所以你应该创建两个函数,preRotate和postRotate(或local / global),在yawTurn和local中使用全局(pre)版本(在pitchTurn中发布。