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

时间:2019-05-21 22:03:08

标签: c# unity3d 3d quaternions

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

在幕后,它正在对变换的rotation和另一个Quaternion做一些数学运算。这种数学的确切性质会根据您选择的是本地标志还是世界标志而改变。

我如何在不将第一个Quaternion分配给Transform的Quaternion(浪费内存和/或时间)的情况下进行数学运算?

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

沿其局部轴将第二个应用到第一个,将进行旋转,使其右侧朝下旋转,而正面朝右旋转。

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

1 个答案:

答案 0 :(得分:4)

使用Quaternion operator *

在Unity中,当您将两个四元数相乘时,它将第二个四元数(以全局轴表示)沿着第一个Quaternion q2 = Quaternion.Euler(90f,0f,0f)之后产生的局部轴应用于第一个四元数。

因此,如果要执行与Quaternion等效的操作,其中Rotate(q2, Space.Self)是转换的原始q1,而rotation是转换的新{{ 1}},您需要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,则将相对于父轴旋转对象。