在哪里可以找到有关使用航位推算的对象状态预测的详细资源?

时间:2012-12-10 13:36:01

标签: quaternions

我有一台服务器和一台客户端。 我有40个opengl立方体。状态由3d矢量描述位置和3x3旋转矩阵(或四元数)。

如何在这些数据包之间发送中间数据包并预测客户端上的对象状态(外推)?

对象位置我可以使用速度的线性预测器。 如何预测四元数状态?

1 个答案:

答案 0 :(得分:0)

与线速度相关的最简单的事情是使用线速度的线性预测器。

如果你有两个四元数, q_0 q_t ,表示相隔 t 秒的全局方向,你可以计算它们之间的有限差异两个四元数并用它来找到可用于外推的角速度。

  1. 确保 q_0 q_t 之间的内积是非负的。如果它是负数,则否定其中一个四元数的所有分量。这确保了我们不会试图走很远的路。如果你的身体相对于你的采样旋转的速度非常快,这就是一个问题,你需要一个更复杂的模型来解释先前的角速度并假设最大可能的加速度。我们假设情况并非如此。
  2. 然后我们计算相对差值四元数。 dq = q_t * q_0'(其中 q_0'是四元数旋转反转/共轭)。如果您拥有固定大小的步骤,您可以在此处停下来预测未来的下一个方向 t 秒: q_2t = dq * d_t
  3. 如果我们可以通过 t 的整数倍前进,我们会计算 dq 的旋转角度。四元数和角速度都是方向变化的“轴 - 角”表示的变化。如果围绕单位长度轴 [x,y,z] 旋转Θ,则其四元数表示为 q = [cos(Θ/ 2),sin(Θ/ 2)x,sin(Θ/ 2)y,sin(Θ/ 2)z] (使用四元数约定,其中 w 组件首先出现)。如果围绕轴 [x,y,z] 旋转Θ/ t ,则角速度 v = [Θx ,θY,θZ] /吨即可。所以 v = Θ[q.x,q.y,q.z] /(t || [q.x,q.y,q.z] ||)。我们可以通过两种方式计算角度:Θ = 2acos(qw) = 2asin(|| [qx,qy,qz] ||) 。由于步骤1,这些将始终相同。数值使用 sine 更好,因为我们需要找到 m = || [qx,qy,qz ] || 无论如何都要进行下一步。
  4. 如果 m 足够大,那么我们只需找到角速度:

    v = 2asin(m)[dq.x,dq.y,dq.z] /(m * t)

    然而,如果 m 不够大,我们将面临试图除以近零的数字问题。所以程序员将使用sinc()函数的泰勒展开在零附近,这在这种情况下恰好是非常准确的。请记住 m = sin(Θ/ 2)。在 m <1e-4 的情况下,我们可以精确地计算 asin(m)/ m = 6 /(6-m * m)。然后你只需要将结果乘以 2 * [dq.x,dq.y,dq.z] / t ,你就可以得到你的角速度。

  5. 然后推断是将角速度乘以已经过去的时间的问题。然后你向后走,将角度变化转换为四元数并将其乘以 q_t

  6. 似乎必须有一种更简单的方法......