如何在不使用 transform.Rotate 的情况下在其本地或世界轴上旋转带有第二个四元数的四元数?
Posted
技术标签:
【中文标题】如何在不使用 transform.Rotate 的情况下在其本地或世界轴上旋转带有第二个四元数的四元数?【英文标题】:How do I rotate a Quaternion with 2nd Quaternion on its local or world axes without using transform.Rotate? 【发布时间】:2019-05-21 22:03:07 【问题描述】:Transform.Rotate
有一个非常有用的界面,用于选择是否应相对于世界轴或局部轴进行旋转。
在幕后,它正在对变换的rotation
、Quaternion
和另一个 Quaternion
进行一些数学运算。这个数学的确切性质会根据您选择当地国旗还是世界国旗而改变。
如何在不将第一个 Quaternion
分配给 Transform 的 rotation
(浪费内存和/或时间)的情况下进行此类数学运算?
假设我的第一个Quaternion
是Quaternion q1 = Quaternion.Euler(0f,0f,90f);
,第二个是Quaternion q2 = Quaternion.Euler(90f,0f,0f)
。
将第二个沿其局部轴应用于第一个将产生一个旋转,将其右侧旋转为面朝下,将其正面旋转为面右。
将第二个沿原始轴应用于第一个将产生一个旋转,使其背面朝下,顶部朝右。
【问题讨论】:
【参考方案1】:使用Quaternion operator *
。
在 Unity 中,当您将两个四元数相乘时,它会将第二个四元数(以全局轴表示)沿第一个 Quaternion
之后产生的局部轴应用于第一个四元数。
所以,如果你想做Rotate(q2, Space.Self)
的等价物,其中q1
是转换的原始rotation
,q3
是转换的新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
,您将相对于父级的轴旋转对象。
【讨论】:
感谢 Owen-Reynolds 在 Unity 问答网站上写了 this answer,这真的帮助我理解了这个运算符。以上是关于如何在不使用 transform.Rotate 的情况下在其本地或世界轴上旋转带有第二个四元数的四元数?的主要内容,如果未能解决你的问题,请参考以下文章
如何设置 pygame.transform.rotate() 的轴心点(旋转中心)?