如何在不使用 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 有一个非常有用的界面,用于选择是否应相对于世界轴或局部轴进行旋转。

在幕后,它正在对变换的rotationQuaternion 和另一个 Quaternion 进行一些数学运算。这个数学的确切性质会根据您选择当地国旗还是世界国旗而改变。

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

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

将第二个沿其局部轴应用于第一个将产生一个旋转,将其右侧旋转为面朝下,将其正面旋转为面右。

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

【问题讨论】:

【参考方案1】:

使用Quaternion operator *

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

所以,如果你想做Rotate(q2, Space.Self)的等价物,其中q1是转换的原始rotationq3是转换的新rotation,你想要Quaternion q3 = q1 * q2


如果您想在应用q1 之前沿轴(即沿全局轴)将q2 应用到q1,该怎么办?好吧,事实证明这相当于沿q2 的局部轴应用q1

例如,沿q1 的全局轴应用q2 会将其背面朝下旋转,并将其顶部朝右旋转。考虑沿p2 的局部轴应用q1 也会将其背面朝下旋转,并将其顶部朝右旋转。它们导致相同的方向!

那是什么意思? 如果您想在q1 应用之前沿轴应用q2q1,则执行Quaternion q3 = q2 * q1

这相当于执行Rotate(q2, Space.World),其中q1 是转换的原始rotationq3 是新的rotation


Rotate 不同,您可以使用此运算符相对于其父轴旋转对象!如果您执行transform.localRotation = q2 * transform.localRotation,您将相对于父级的轴旋转对象。

【讨论】:

感谢 Owen-Reynolds 在 Unity 问答网站上写了 this answer,这真的帮助我理解了这个运算符。

以上是关于如何在不使用 transform.Rotate 的情况下在其本地或世界轴上旋转带有第二个四元数的四元数?的主要内容,如果未能解决你的问题,请参考以下文章

如何设置 pygame.transform.rotate() 的轴心点(旋转中心)?

javascript如何实现图片任意角度的旋转?

如何通过js获取到CSS3里面transform rotate旋转角度的度数,matrix

转换(旋转)transform

CSS可以让图片转一个360度的圈?

transform:rotate