9

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

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

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

4

4 回答 4

2

您的表示等效于四元数旋转,前提是您的旋转向量是单位长度。如果您不想使用一些固定的四元数数据结构,您应该简单地确保您的旋转向量具有单位长度,然后计算出等效的四元数乘法/倒数计算以确定聚合旋转。您也许可以减少乘法或加法的次数。

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

θ(t) = θ 0 +α(tt 0 ) mod 2π

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

如果这些都不能提高您的性能,您应该考虑使用罐装四元数库,因为这些东西已经针对您正在讨论的应用程序类型进行了优化。

于 2010-11-30T21:54:04.267 回答
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

最终可能是一个更昂贵的计算......

于 2013-10-21T19:32:17.957 回答
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

用于简单的集成。如果您愿意,您可以选择不同的积分器。

于 2010-12-01T04:39:17.273 回答
1

老问题,但另一个堆栈溢出的例子回答了 OP 没有问的问题。OP 已经列出了他不使用四元数来表示速度的理由。我在同一条船上。

也就是说,您组合两个角速度的方式,每个角速度由一个向量表示,该向量表示旋转轴,其大小表示旋转量。

只需将它们加在一起。逐个组件。希望能帮助其他一些灵魂。

于 2021-12-20T22:47:06.920 回答