结合旋转轴矢量

时间:2010-11-30 17:42:58

标签: math vector 3d matrix quaternions

我正在尝试在我的爱好游戏引擎中使用轴角矢量进行旋转。这是沿旋转轴的3分量矢量,旋转长度以弧度表示。我喜欢他们,因为:

  • 与quats或旋转矩阵不同,我实际上可以看到数字并在脑海中看到旋转
  • 它们比四元数或矩阵的内存少一点。
  • 我可以表示-Pi到Pi范围之外的值(如果我存储角速度,这很重要)

然而,我有一个紧密的循环,根据角速度更新我的所有物体(数万)的旋转。目前,我知道组合两个旋转轴向量的唯一方法是将它们转换为四元数,将它们相乘,然后将结果转换回轴/角度。通过剖析,我发现这是一个瓶颈。有谁知道更简单的方法吗?

3 个答案:

答案 0 :(得分:2)

如果旋转矢量是单位长度,则表示等效于quaternion rotation。如果您不想使用某些固定的四元数数据结构,则应该确保旋转向量具有单位长度,然后计算等效的quaternion multiplications / reciprocal computation以确定聚合旋转。您可以减少乘法或加法的数量。

如果您的角度是唯一正在改变的角度(即旋转轴是恒定的),那么您可以简单地使用角度的线性缩放,并且,如果您愿意,将其修改为在范围内[0,2π)。因此,如果你的旋转速度为每秒αraidans,从时间t 0 的初始角度θ 0 开始,则时间t的最终旋转角度为由下式给出:

θ(t)=θ 0 +α(t-t 0 )mod2π

然后,您只需将该旋转应用于您的向量集合。

如果这些都没有改善您的性能,您应该考虑使用固定的四元数库,因为这些已经针对您正在进行的应用程序类型进行了优化。

答案 1 :(得分:2)

您可以将它们保留为角度轴值。

使用角度轴值(anti-symmetric)构建跨产品(x,y,z)矩阵,并通过将它们乘以角度值来加权此矩阵的元素。现在总结所有这些交叉积矩阵(one for each angle axis value)并使用矩阵指数找到最终的旋转矩阵。

如果矩阵A表示此交叉积矩阵(根据角轴值构建),则

exp(A)相当于旋转矩阵R (i.e., equivalent to your quaternion in matrix form)

因此,

exp (A1 + A2) = R1 * R2

最终可能是一个更昂贵的教育......

答案 2 :(得分:1)

您应该使用单位四元数而不是缩放向量来表示旋转。可以显示(不是由我)使用三个参数的任何旋转表示将在某一点遇到问题(即,是单数)。在你的情况下,它发生在你的向量长度为​​0(即身份)和长度为2pi,4pi等的情况下。在这些情况下,表示变为单数。单位四元数和旋转矩阵没有这个问题。

根据您的描述,听起来您正在通过数值积分更新旋转状态。在这种情况下,您可以通过将旋转速率(\ omega)转换为四元数速率(q_dot)来更新旋转状态。如果我们将你的四元数表示为q = [q0 q1 q2 q3],其中q0是标量部分,那么:

q_dot = E*\omega

,其中

    [ -q1 -q2 -q3 ]
E = [  q0 -q3  q2 ]
    [  q3  q0 -q1 ]
    [ -q2  q1  q0 ]

然后您的更新将变为

q(k​​ + 1)= q(k)+ q_dot * dt

用于简单集成。如果您愿意,可以选择其他集成商。