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

Ruz*_*ihm 4 c# 3d quaternions unity-game-engine

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

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

我怎样才能在不将第Quaternion一个分配给转换rotation(浪费内存和/或时间)的情况下进行这种数学运算,只是为了用它做一些数学运算?

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

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

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

Ruz*_*ihm 6

使用Quaternion operator *.

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

所以,如果你想做等价的Rotate(q2, Space.Self),哪里q1是变换的原始rotationq3是变换的新rotation,你想要Quaternion q3 = q1 * q2.


你会怎么做,如果你想申请q2q1沿轴之前q1应用(即沿轴线全球)?好吧,事实证明这等效于q1沿 的局部轴应用q2

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

那是什么意思呢?如果你想申请q2q1沿轴之前q1适用,然后做Quaternion q3 = q2 * q1

这相当于做Rotate(q2, Space.World)where q1is the transform's originalrotationq3is the new rotation


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

  • 感谢 Owen-Reynolds 在 Unity 问答网站上写下的 [this answer](http://answers.unity.com/answers/810719/view.html),这确实帮助我理解了这个运算符。 (2认同)