Ruz*_*ihm 4 c# 3d quaternions unity-game-engine
Transform.Rotate
有一个非常有用的界面,用于选择是否应该相对于世界轴或局部轴进行旋转。
在幕后,它正在对变换的rotation
、 aQuaternion
和另一个进行一些数学运算Quaternion
。这个数学的确切性质取决于你选择当地国旗还是世界国旗。
我怎样才能在不将第Quaternion
一个分配给转换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)
where q1
is the transform's originalrotation
和q3
is the new rotation
。
与 不同Rotate
,您可以使用此运算符相对于其父轴旋转对象!如果这样做transform.localRotation = q2 * transform.localRotation
,您将相对于父对象的轴旋转对象。