如何在不使用 transform.Rotate 的情况下在其局部或世界轴上旋转具有第二个四元数的四元数?
How do I rotate a Quaternion with 2nd Quaternion on its local or world axes without using transform.Rotate?
Transform.Rotate
有一个非常有用的界面,用于选择是否应相对于世界轴或局部轴进行旋转。
在幕后,它正在对变换的 rotation
、一个 Quaternion
和另一个 Quaternion
进行一些数学运算。而这个数学的确切性质取决于您选择的是本地标志还是世界标志。
如何在不将第一个 Quaternion
分配给转换的 rotation
(浪费内存 and/or 时间)的情况下进行此类数学运算,只是为了用它做一些数学运算?
假设我的第一个 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
是transform的新rotation
,你要Quaternion q3 = q1 * q2
.
如果您想在应用 q1
之前沿轴将 q2
应用到 q1
(即沿全局轴),您会怎么做?好吧,事实证明这等同于沿 q2
.
的局部轴应用 q1
例如,沿 q1
的全局轴应用 q2
会将其背面旋转为面朝下,将其顶部旋转为面朝右。考虑沿 p2
的局部轴应用 q1
也会将其背面旋转为面朝下,将其顶部旋转为面朝右。它们的方向相同!
那是什么意思呢? 如果您想在 q1
应用之前沿轴将 q2
应用到 q1
,则执行 Quaternion q3 = q2 * q1
.
这相当于做 Rotate(q2, Space.World)
,其中 q1
是转换的原始 rotation
,q3
是新的 rotation
.
与Rotate
不同,您可以使用此运算符来相对于其父对象的轴旋转对象!如果您这样做 transform.localRotation = q2 * transform.localRotation
,您将相对于父对象的轴旋转对象。
Transform.Rotate
有一个非常有用的界面,用于选择是否应相对于世界轴或局部轴进行旋转。
在幕后,它正在对变换的 rotation
、一个 Quaternion
和另一个 Quaternion
进行一些数学运算。而这个数学的确切性质取决于您选择的是本地标志还是世界标志。
如何在不将第一个 Quaternion
分配给转换的 rotation
(浪费内存 and/or 时间)的情况下进行此类数学运算,只是为了用它做一些数学运算?
假设我的第一个 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
是transform的新rotation
,你要Quaternion q3 = q1 * q2
.
如果您想在应用 q1
之前沿轴将 q2
应用到 q1
(即沿全局轴),您会怎么做?好吧,事实证明这等同于沿 q2
.
q1
例如,沿 q1
的全局轴应用 q2
会将其背面旋转为面朝下,将其顶部旋转为面朝右。考虑沿 p2
的局部轴应用 q1
也会将其背面旋转为面朝下,将其顶部旋转为面朝右。它们的方向相同!
那是什么意思呢? 如果您想在 q1
应用之前沿轴将 q2
应用到 q1
,则执行 Quaternion q3 = q2 * q1
.
这相当于做 Rotate(q2, Space.World)
,其中 q1
是转换的原始 rotation
,q3
是新的 rotation
.
与Rotate
不同,您可以使用此运算符来相对于其父对象的轴旋转对象!如果您这样做 transform.localRotation = q2 * transform.localRotation
,您将相对于父对象的轴旋转对象。