垂直转动相机(使用角度轴旋转)

时间:2010-12-25 19:20:00

标签: c++ view camera rotation

我正在为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的情况下使用四元数进行旋转。

1 个答案:

答案 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中发布。