我正在尝试创建一个类来控制OpenGL中的摄像头。 我有三种方法来改变相机的俯仰偏航和滚动。 这些方法使用float参数作为要添加的旋转量。
这些方法中的代码是我需要帮助的地方。旋转存储在Vector3中。 到目前为止,对于改变音高法,我有:
void changePitch(float degrees)
{
float rads = MathHelp::degreesToRadians(degrees);
m_rotation.x += cos(m_rotation.y) * rads;
}
这是我自己可以得到的。它有点工作,相机在面向上或向下z轴时向上和向下看,而不是向下看x轴。我尝试添加z旋转:
m_rotation.z += sin(m_rotation.y) * rads;
但这并没有很顺利。
答案 0 :(得分:3)
假设您有upVector
,lookAtVector
和rightVector
3D向量指向上方,查看相机的方向和右侧。然后,为了正确地增加音高,你应该按如下方式进行计算:
void changePitch(angle) {
angle = DegreeToRadian(angle);
// Rotate lookAtVector around the right vector
// This is where we actually change pitch
lookAtVector = Normalize3dVector(viewDir * cos(angle) + UpVector * sin(angle));
// Now update the upVector
upVector = CrossProduct(rightVector, lookAtVector);
}
在上面的摘录中,任意使用的函数的名称都是不言自明的。