结合旋转轴矢量

我正在尝试在我的爱好游戏引擎中使用旋转的轴角向量。 这是一个沿旋转轴的三分量矢量,其旋转长度为弧度。 我喜欢他们是因为:

  • 与quats或旋转矩阵不同,我实际上可以看到数字并在脑海中形象化旋转
  • 它们的内存少于四元数或矩阵。
  • 我可以表示-Pi到Pi范围之外的值(如果我存储角速度,这很重要)
  • 但是,我有一个紧密的循环,根据它们的角速度更新我的所有对象(数万个)的旋转。 目前,我知道组合两个旋转轴矢量的唯一方法是将它们转换为四元数,然后将它们相乘,然后将结果转换回轴/角度。 通过分析,我认为这是一个瓶颈。 有谁知道更直接的方法?


    如果你的旋转向量是单位长度,你的表示就相当于四元数旋转。 如果你不想使用一些四元数的罐头数据结构,你应该简单地确保你的旋转向量是单位长度,然后计算出等价的四元数乘法/倒数计算来确定总旋转。 您可能可以减少乘法或增加的次数。

    如果您的角度是唯一正在改变的角度(即旋转轴线是恒定的),那么您可以简单地使用角度的线性缩放,并且如果您愿意,可以将其修改为范围[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

    上一篇: Combine Rotation Axis Vectors

    下一篇: Quaternions and Transform Matrices