问题与自由飞行相机和四元数旋转的组合

我目前正在编写一个基本的3D引擎来开始使用OpenGL,并且我正在开发鼠标输入。 我正在构建一个Free Fly Camera,它可以让用户使用Oculus Rift头戴式耳机和鼠标在各个方向上进行观看(只有在启用了Oculus的情况下才能进行偏航)。 使用键盘,他可以向前或向后走向他面对的方向。 为此,我必须将鼠标引起的旋转与Oculus耳机旋转结合起来,我使用的是四元数。 我“乘以”两个四元数,一个是从OVR方向构建而成(其自身完美工作),另一个来自鼠标输入:

quat OVRquat = quat(vec3(OVRPitch, OVRYaw, OVRRoll));
quat Mquat = quat(vec3(mPitch, mYaw, 0.0f));

// Multiplying the "init" front vector with the Oculus Rotation and the Mouse induced rotation
front = vec3(0.0f, 0.0f, 1.0f) * mat3_cast(Mquat * OVRquat);
right = cross(front, up);

mPitchmYaw是从相对鼠标坐标框架时间构建的。

如果OVR Quat像魅力一样工作,那么Quat鼠标更奇怪。 事实上,只要我绕Y轴(Pi / 2偏航)翻转Pi / 2弧度,垂直轴就会翻转,这意味着如果我向上推动鼠标,摄像机就会下降,而在正常情况下,向上。 另外,如果我在Pi / 2旋转后面朝上(请注意,我无法在俯仰旋转上向上和向下翻转PI / 2),然后向左或向右看,相机沿着奇怪的路径前进围绕着南北极的球体,在与Z轴垂直的平面上(如子午线)。 它通常应该绘制一个“视界”般的路径

我一定是错过了关于四元数理论的东西,因为我最近一直在阅读关于四元论的东西。 我怎样才能使这两个四元数相乘并获得流体相机? 或者我可以使用什么解决方案? 随意问任何更多的代码或信息。

精度:

请注意,现在我甚至没有使用Oculus: OVRPitch/Yaw/Roll固定为0.0f

以下是我如何创建我的四元数:


你的问题与四元数无关; 这正是欧拉角度应该如何工作的:围绕一个轴旋转会改变其他方向。 因此旋转的顺序很重要。 我怀疑,GLM首先进行投球,然后是偏航旋转。

在这种情况下,如果你的偏航角度大于Pi / 2(我认为你的偏航实际上是Pi周围的某个地方,这是一个半旋转),它会将摄像机例如在俯仰之后面朝上旋转到相机将面朝下,从而将面部从“上”倒转为“下”。

链接地址: http://www.djcxy.com/p/81765.html

上一篇: Issue with a Free Fly Camera And Combination of Quaternion Rotations

下一篇: Maintaining rotation during Quaternion normalization