我(有点盲目地)在物理刚体模拟中使用四元数进行了一段时间的旋转,但最近开始对如何定义四元数旋转以及我是如何做到这一点感到困惑(基于物理学的游戏开发者一书)
在书中你有角速度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 *四元数*向量*标量在概念上 在上面是什么添加这个结果四元数到我的方向是,考虑到你通常会乘以,和不要添加,旋转。
答案 0 :(得分:1)
要正确关闭此功能,我将在此处扩展minorlogic的评论。
由于角速度v引起的旋转四元数q的时间导数给出为
dq/dt = 0.5*q*v
这里v是一个定义的角速度,其形式是矢量方向定义旋转轴,幅度定义旋转速度。 v在“局部空间”中进一步给出。如果v在“世界空间”中,则q和v的乘法顺序将相反。
然后问题表达
orientation += 0.5*orientation*angVel * dt
使用这个时间导数,随着时间的推移变成了正常的一阶积分。然而,它不是非常精确并且需要对方向四元数进行不断的重新归一化,但它简单快速,并且不像轴角度转换那样使用sin或cos。
准确度问题和归一化要求可以通过查看单位四元数来解释,单位四元数必须是正确的旋转,如4d球面上的点和衍生为垂直于该球面的矢量。很明显,如果你只是将这样的矢量添加到曲面上的这样一个点上,你会得到一个新的点,它不再是在表面上,而是略高于它。稍微取决于此向量的大小以及乘以导数向量的时间步长。然后需要进行标准化以将放回表面。
明确回答这个问题。当具有方向和已知的旋转四元数来旋转时,使用乘法方法,而加法方法试图通过衍生的一阶积分来达到相同的目标。
答案 1 :(得分:0)
请参见this answer -您给出的代码是四元数幂的一阶泰勒级数展开,该展开用于积分离散时间间隔dt
上的角速度。如果您想要使用实际四元数幂而不是泰勒级数逼近的更准确的方法将角速度转换为旋转,则可以使用该文章中的其他代码示例(第一个代码示例)。
如果您对数学感兴趣,请参见this derivation。