【发布时间】:2023-04-01 20:07:01
【问题描述】:
我想编写一个第一人称相机,并将其旋转存储在一个四元数中。不幸的是,轮换出了点问题。
以下函数负责旋转相机。参数Mouse 和Speed 传递鼠标移动和旋转速度。然后该函数获取旋转四元数,旋转它并存储结果。顺便说一句,我使用的是Bullet Physics,这是类型和函数的来源。
void Rotate(vec2 Mouse, float Speed)
{
btTransform transform = camera->getWorldTransform();
btQuaternion rotation = transform.getRotation();
Mouse = Mouse * Speed; // apply mouse sensitivity
btQuaternion change(Mouse.y, Mouse.x, 0); // create quaternion from angles
rotation = change * rotation; // rotate camera by that
transform.setRotation(rotation);
camera->setWorldTransform(transform);
}
为了说明鼠标移动时产生的相机旋转,我向您展示了一幅手绘图。左侧显示了相机实际执行的错误旋转。右侧显示了所需的正确大小写。箭头表示向上(橙色)和向下(蓝色)移动鼠标时相机的旋转方式。
如您所见,只要偏航角为零,则旋转是正确的。但是偏航越多,相机旋转的圆圈就越小。相比之下,圆圈应始终像经度一样沿着整个球体延伸。
我对四元数不是很熟悉,所以在这里问一下如何正确旋转它们。
【问题讨论】:
-
鼠标坐标很可能在屏幕空间中,这意味着像这样使用它们几乎不是一个好主意。相反,使用逆投影矩阵将它们转换为世界坐标。
-
我的想法是使用鼠标坐标
x和y作为角度来围绕up和right向量旋转相机四元数。我认为在大多数游戏中都是这样。我不确定你的方法是否有效。你能再解释一下吗?
标签: c++ 3d camera rotation quaternions