我想要将一个欧拉角添加到现有的四元数中。这是我得到的代码:
我希望只有偏航和俯仰旋转。旧的变换已具备此属性。我添加的欧拉角也仅包含俯仰和偏航旋转。当我进行乘法运算时,旧变换所描述的旋转会引入横滚旋转。
然后我尝试了:
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;
我希望只有偏航和俯仰旋转。旧的变换已具备此属性。我添加的欧拉角也仅包含俯仰和偏航旋转。当我进行乘法运算时,旧变换所描述的旋转会引入横滚旋转。
然后我尝试了:
Quaternion result = YawRotationQuaternion * oldTransform * PitchRotationQuaternion;
这不会引入滚动旋转。这个选项甚至更糟,因为当旧变换(oldTransform)将偏航轴旋转到俯仰轴时,它会出现万向节锁定(gimbal lock)。
现在我可以想象的是,从oldTransform获取旧的偏航和俯仰旋转,并修改偏航和俯仰轴,使它们不再是(0,1,0)和(1,0,0)。这里的问题是,当我从四元数中提取欧拉角时,也会出现万向节锁定。
那么如何将特定轴的欧拉角添加到四元数中呢?