Transform.Rotate
有一个非常有用的界面,用于选择是否应相对于世界坐标轴或局部坐标轴进行旋转。
在幕后,它正在对变换的rotation
和另一个Quaternion
做一些数学运算。这种数学的确切性质会根据您选择的是本地标志还是世界标志而改变。
我如何在不将第一个Quaternion
分配给Transform的Quaternion
(浪费内存和/或时间)的情况下进行数学运算?
假设我的第一个rotation
是Quaternion
,第二个是Quaternion q1 = Quaternion.Euler(0f,0f,90f);
。
沿其局部轴将第二个应用到第一个,将进行旋转,使其右侧朝下旋转,而正面朝右旋转。
沿着原始轴将第二个应用到第一个,将产生旋转,使它的背面朝下旋转,其顶部朝右旋转。
答案 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
,则将相对于父轴旋转对象。