结合旋转轴矢量
我正在尝试在我的爱好游戏引擎中使用旋转的轴角向量。 这是一个沿旋转轴的三分量矢量,其旋转长度为弧度。 我喜欢他们是因为:
但是,我有一个紧密的循环,根据它们的角速度更新我的所有对象(数万个)的旋转。 目前,我知道组合两个旋转轴矢量的唯一方法是将它们转换为四元数,然后将它们相乘,然后将结果转换回轴/角度。 通过分析,我认为这是一个瓶颈。 有谁知道更直接的方法?
如果你的旋转向量是单位长度,你的表示就相当于四元数旋转。 如果你不想使用一些四元数的罐头数据结构,你应该简单地确保你的旋转向量是单位长度,然后计算出等价的四元数乘法/倒数计算来确定总旋转。 您可能可以减少乘法或增加的次数。
如果您的角度是唯一正在改变的角度(即旋转轴线是恒定的),那么您可以简单地使用角度的线性缩放,并且如果您愿意,可以将其修改为范围[0, 2π)。 所以,如果你的旋转速度为每秒αraidans,从时间t0的初始角度θ0开始,那么时间t的最终旋转角度由下式给出:
θ(t)=θ0+α(t-t0)mod2π
然后,您只需将该旋转应用于您的矢量集。
如果这些都不能提高你的性能,你应该考虑使用一个罐头四元数的库,因为这样的东西已经针对你所讨论的应用进行了优化。
您可以将它们保留为角度轴值。
使用角度轴值(x,y,z)
构建一个叉积(anti-symmetric)
矩阵(x,y,z)
并通过将它们乘以角度值来对矩阵元素进行加权。 现在总结所有这些叉乘矩阵(one for each angle axis value)
并使用矩阵指数找到最终旋转矩阵。
如果矩阵A表示这个叉积矩阵(由角轴值构建),那么,
exp(A)
等价于旋转矩阵R
(ie, equivalent to your quaternion in matrix form)
。
因此,
exp (A1 + A2) = R1 * R2
最后可能是一个更昂贵的解决方案......
你应该使用单位四元数而不是缩放矢量来表示你的旋转。 可以显示(而不是我)使用三个参数的任何旋转表示都会在某个点出现问题(即单数)。 在你的情况下,它发生在你的向量长度为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
为了简单的整合。 如果您愿意,您可以选择其他集成商。
链接地址: http://www.djcxy.com/p/81789.html