给四元数增加一个欧拉角

我想为现有的四元数增加一个欧拉角。 这是我得到的:

Quaternion oldTransform = transform.Rotation;

float YawRotation = mouseDiff.x *  RotationSpeed;
Quaternion YawRotationQuaternion = new Quaternion();
YawRotationQuaternion.CreateFromAxisAngle (0, 1, 0, YawRotation);

float PitchRotation = mouseDiff.y * RotationSpeed;
Quaternion PitchRotationQuaternion = new Quaternion();
PitchRotationQuaternion.CreateFromAxisAngle ( 1, 0, 0, PitchRotation);

Quaternion result = oldTransform * YawRotationQuaternion * PitchRotationQuaternion;
transform.Rotation = result;

我只想要偏航和俯仰旋转。 旧的转换有这个属性。 我添加到它的欧拉角度也只是俯仰和偏航旋转。 当我乘以它时会发生什么,oldTransform描述的旋转引入了滚动旋转。

然后我试着:

Quaternion result = YawRotationQuaternion * oldTransform * PitchRotationQuaternion;

这不会引起辊子旋转。 当oldTransform将偏航轴旋转到俯仰轴上时,此选项更糟,因为它具有万向节锁。

现在我可以想象的是,我们可以从oldTransform获得旧的偏航和俯仰旋转,并修改偏航和俯仰轴,使它们不再是(0,1,0)和(1,0,0)。 这里的问题是,当我从四元数中提取欧拉角时,我也得到了万向节锁。

那么如何给四元数增加一个特定轴的欧拉角?


解:

更改您的转换顺序。

Quaternion result = PitchRotationQuaternion * oldTransform * YawRotationQuaternion;

说明:

您有一个带有本地参考框架的对象。 我会说+ x_o是朝向对象的右侧, -z_o是“前进”, + y_o是关于对象的“向上”。 该对象存在于世界的参考框架中。 世界有自己的轴: (x_w,y_w,z_w) + y_w是世界上的。 当对象改变方向时,您希望它改变方向(围绕x_o旋转)和偏航(围绕y_w旋转)。

在你的代码中,你创建了两个四元数。 你应用它们的方式代表围绕x_wy_w的旋转。 如果已经对转换应用了偏航,则x_o不再与x_w对齐; 因此,你会得到一些滚动。 幸运的是,对于您所应用的转换,万向节锁不是问题。 万向节锁将通过以下事实表现出来:如果您以90度俯仰,则偏摆和滚动成为相同的事情。 但是你不使用roll; 所以没关系。

您的变换总是可以表示为围绕x_w的旋转,然后围绕y_w旋转。 将新的“音调四元数”放在旧变换的左侧将其添加到其他累积音高。 保持右侧的“偏航四元”将其加到累计的偏航上。 因此,如果要将最终的四元数表示为一个或多个乘法运算,则应该是围绕x_w的一系列纯循环,然后是围绕y_w的一系列循环 。 只要对象以x_o平行于x_w开头 ,这就是你想要的。

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

上一篇: Adding an euler angle to a Quaternion

下一篇: > Euler