我正在尝试在我的爱好游戏引擎中使用轴角矢量进行旋转。这是沿旋转轴的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
用于简单集成。如果您愿意,可以选择其他集成商。