如何在不使用 transform.Rotate 的情况下在其局部或世界轴上旋转具有第二个四元数的四元数?

How do I rotate a Quaternion with 2nd Quaternion on its local or world axes without using transform.Rotate?

Transform.Rotate 有一个非常有用的界面,用于选择是否应相对于世界轴或局部轴进行旋转。

在幕后,它正在对变换的 rotation、一个 Quaternion 和另一个 Quaternion 进行一些数学运算。而这个数学的确切性质取决于您选择的是本地标志还是世界标志。

如何在不将第一个 Quaternion 分配给转换的 rotation(浪费内存 and/or 时间)的情况下进行此类数学运算,只是为了用它做一些数学运算?

假设我的第一个 QuaternionQuaternion q1 = Quaternion.Euler(0f,0f,90f);,第二个是 Quaternion q2 = Quaternion.Euler(90f,0f,0f)

沿其局部轴将第二个应用到第一个会产生一个旋转,将其右侧旋转为面朝下,将其正面旋转为面朝右。

沿原始轴将第二个应用到第一个会产生一个旋转,使其背面朝下旋转,顶部朝右旋转。

使用 Quaternion operator *.

在 Unity 中,当您将两个四元数相乘时,它会将第二个四元数(以全局轴表示)沿第一个 Quaternion 之后生成的局部轴应用到第一个四元数。

因此,如果您想执行 Rotate(q2, Space.Self) 的等效操作,其中 q1 是转换的原始 rotation,而 q3 是transform的新rotation,你要Quaternion q3 = q1 * q2.


如果您想在应用 q1 之前沿轴将 q2 应用到 q1(即沿全局轴),您会怎么做?好吧,事实证明这等同于沿 q2.

的局部轴应用 q1

例如,沿 q1 的全局轴应用 q2 会将其背面旋转为面朝下,将其顶部旋转为面朝右。考虑沿 p2 的局部轴应用 q1 也会将其背面旋转为面朝下,将其顶部旋转为面朝右。它们的方向相同!

那是什么意思呢? 如果您想在 q1 应用之前沿轴将 q2 应用到 q1,则执行 Quaternion q3 = q2 * q1.

这相当于做 Rotate(q2, Space.World),其中 q1 是转换的原始 rotationq3 是新的 rotation.


Rotate不同,您可以使用此运算符来相对于其父对象的轴旋转对象!如果您这样做 transform.localRotation = q2 * transform.localRotation,您将相对于父对象的轴旋转对象。