将角速度积分为四元数旋转

Joe*_*oon 6 rotation rigid-bodies quaternions

我已经(有点盲目地)在物理刚体模拟中使用四元数进行旋转有一段时间了,但最近开始对四元数旋转通常是如何定义的以及我是如何定义的(基于游戏开发者的物理书)感到困惑。

在书中,您有一个角速度 angVel 和一个时间步长 dt 以及一个初始方向。

它的步骤如下

方向 += 0.5*方向*angVel * dt

其中四元数向量乘法是通过首先将向量 xyz 转换为四元数 xyz,0 来完成的

这是可行的,但在其他任何地方,程序都是创建一个四元数,它定义了时间积分 angVel,在 dt 上,然后在方向上乘以它。它本质上将 angVel*dt 转换为旋转(非常有意义),然后通过乘法将其应用于原始方向,如下所示,语法更好https://math.stackexchange.com/questions/39553/how-do- i-apply-an-angular-velocity-vector3-to-a-unit-quaternion-orientation

我的问题是上面的 0.5 * 四元数 * 矢量 * 标量在概念上什么,以及这个结果四元数添加到我的方向是什么,考虑到你通常乘法而不是加法来旋转。

Joe*_*oon 7

为了正确地关闭它,我将在这里扩展小逻辑的评论。

由于角速度 v 引起的旋转四元数 q 的时间导数为

dq/dt = 0.5*q*v
Run Code Online (Sandbox Code Playgroud)

这里 v 是一个定义角速度,其形式为矢量方向定义旋转轴,大小定义旋转速度。v 在“局部空间”中进一步给出。如果 v 在“世界空间”中,q 和 v 的乘法顺序将被颠倒。

然后是问题表达

orientation += 0.5*orientation*angVel * dt
Run Code Online (Sandbox Code Playgroud)

使用这个时间导数,结果只是一个正常的一阶积分随着时间的推移。然而,它不是很准确,需要对方向四元数进行不断的重新归一化,但它简单快速,并且既不使用 sin 也不使用 cos 作为轴角转换。

精度问题和归一化要求可以通过将单位四元数(正确的旋转必须是)视为位于 4d 球面上的点和作为垂直于该球面的向量的导数来解释。很明显,如果您简单地将这样的向量添加到表面上的这样一个点,您会得到一个不再表面上但略高于表面的新点。多少取决于这个向量的大小和你乘以你的导数向量的时间步长。这就要求标准化将它放回表面。

明确回答问题。当你一个方向和一个已知的旋转四元数来旋转它时,使用乘法方法,而加法方法试图通过导数的一阶积分来达到相同的目标。