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 q1is the transform's originalrotation和q3is the new rotation。
与 不同Rotate,您可以使用此运算符相对于其父轴旋转对象!如果这样做transform.localRotation = q2 * transform.localRotation,您将相对于父对象的轴旋转对象。