四元数和围绕世界轴的旋转


11

免责声明:我是专业的游戏程序员,大多数时候都使用四元数,但对我而言它们接近于魔咒。我在数学方面相对在家,但是虚构的数字总是让我感到困惑。我倾向于将quats视为有用,并且最终会多次反转乘法。我试着像在有限成功的矩阵中那样对它们进行推理。

无论如何....

以下是困扰我的事情。当我想围绕对象的局部轴旋转对象时,我将其旋转与代表要应用的旋转的四元数相乘。因此,它是局部空间中的旋转。

现在,如果要围绕世界空间中的轴旋转,我的推理将是:将世界空间中的旋转作为四元数。用四元数乘以对象旋转的逆数。这将使我的世界在局部空间中旋转。将我的旋转倍数与此新的四元数相乘。即:newRot = oldRot *(反oldRot * worldRot)

但是,我需要做的是newRot = oldRot *(逆向oldRot * worldRot)* oldRot。

为什么在与反quat相乘之后为什么还需要在应用它之前与自己的quat相乘?我知道一定有一个完美的正当理由,但我无法说出自己的出路,这让我感到沮丧。我尝试了各种常见问题解答,但大多数问题都涉及数学,因此我不太清楚。

有人可以像我5岁一样向我解释这一点吗?


是不是有点像矩阵平移和旋转(即,您需要将对象移至中心,然后旋转,然后再向后旋转,当您想要围绕其自身旋转项目时:Minv_transl * Mrot * Mtransl)
Valmond

I try to reason about them like I would with matrices-那么您就走对了。如果您了解如何使用矩阵绕对象轴和世界轴旋转,则可以使用四元数来做同样的事情。矩阵和四元数的乘法顺序相同。
Maik Semder 2011年

Answers:


11

四元数是关联的:

您提到您的解决方案是:

newRot = oldRot * (inverse oldRot * worldRot) * oldRot

与以下内容相同:

newRot = oldRot * inverse oldRot * worldRot * oldRot

与以下内容相同:

newRot = identity * worldRot * oldRot
newRot = worldRot * oldRot

这实际上使您回到实际发生的情况:

localTransformed = oldRot * rot
worldTransformed = rot * oldRot

应用顺序正在改变,仅此而已。回到矩阵,当您将对象矩阵应用于变换矩阵并将其存储为新的对象矩阵时,这就是您的局部空间变换。将变换矩阵应用于对象矩阵并将其存储时,就意味着世界变换。一切都与应用程序顺序有关,仅此而已。


1
第一部分为+1,第二部分有点误导。如果仅在上一个代码示例中使用“ rot”,而不是“ localRot”和“ worldRot”,则该示例将变得更加清晰。否则,这意味着腐烂本身是不同的。但是,区别仅在于您所显示的乘法顺序,而不是不同的四元数(“ localRot”和“ worldRot”)。'localTransformed'和'worldTransformed'最好是:'rotatedAroundLocalAxis'和'rotatedAroundWorldAxis'。这本身将解释方程式,并使最后一段过时,这有一些缺陷。
Maik Semder 2011年

最后一段中的缺陷:矩阵和变换之间的区别(两者在这里是相同的并且可以互换,因此最好只使用矩阵来防止混淆)以及术语“局部空间变换”和“世界变换”:正确地说,第一个方程式绕对象的局部轴旋转后为您提供“局部到世界矩阵”,第二个方程式绕着世界轴旋转后为您提供“局部到世界矩阵”。在这两种情况下,您得到的仅仅是“本地到世界的矩阵”。但是,无论如何,第一部分还是有我的+1。
Maik Semder 2011年

+1 @Maik也许您可以写一个单独的答案,以使轮换和乘法顺序问题之间的差异更加清楚?无论哪种方式,谢谢您的评论!
Max Dohme

嗯,这很有意义。我不知道四元数乘法是关联的,所以旋转和它的反方向相互抵消了,这给了我所需的见识,一个在右边进行了局部旋转,在一个进行了旋转。左边基本上说“在父空间中应用旋转”或“在局部空间中应用旋转” ..与矩阵没有什么不同。一旦您看到它,就相当基础了!谢谢!
Kaj
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.