Transform.Rotate
有一个非常有用的界面,用于选择是否相对于世界轴或局部轴进行旋转。
在幕后,它对变换的
rotation
、一个 Quaternion
和另一个 Quaternion
进行一些数学计算。这个数学的确切性质会根据您选择当地国旗还是世界国旗而变化。
如何在不将第一个
Quaternion
分配给 Transform 的 rotation
(浪费内存和/或时间)的情况下进行此类数学运算?
假设我的第一个
Quaternion
是Quaternion q1 = Quaternion.Euler(0f,0f,90f);
,第二个是Quaternion q2 = Quaternion.Euler(90f,0f,0f)
。
将第二个沿其局部轴应用到第一个将产生一个旋转,将其右侧旋转为面朝下,将其正面旋转为朝右。
沿原始轴将第二个应用到第一个将产生旋转,将其背面旋转为面朝下,将其顶部旋转为面朝右。
Quaternion operator *
。在 Unity 中,当您将两个四元数相乘时,它会将第二个四元数(以全局轴表示)应用于第一个四元数(沿着第一个
Quaternion
之后生成的局部轴)。
因此,如果您想做
Rotate(q2, Space.Self)
的等效操作,其中 q1
是变换的原始 rotation
,q3
是变换的新 rotation
,您需要 Quaternion q3 = q1 * q2
。
如果您想在应用
q2
之前(即沿着全局轴)将 q1
沿轴应用到 q1
,该怎么办?好吧,事实证明这相当于沿着 q1
的局部轴应用 q2
。
作为示例,沿
q2
的全局轴应用 q1
会将其背面旋转为面朝下,将其顶部旋转为面朝右。考虑沿 q1
的局部轴应用 p2
也会将其背面旋转为面朝下,将其顶部旋转为朝右。它们导致相同的方向!
那么这是什么意思呢? 如果您想在应用
q2
之前将 q1
沿轴应用到 q1
,请执行 Quaternion q3 = q2 * q1
。
这相当于执行
Rotate(q2, Space.World)
,其中 q1
是变换的原始 rotation
,q3
是新的 rotation
。
与
Rotate
不同,您可以使用此运算符相对于其父对象的轴旋转对象!如果您这样做 transform.localRotation = q2 * transform.localRotation
,您将相对于父对象的轴旋转对象。