0

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

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

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

4

1 回答 1

0

与您对线速度所做的平行的最简单的事情是使用角速度的线性预测器。

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

  1. 确保q_0q_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]/t。所以v =Θ[qx,qy,qz]/(t||[qx,qy,qz]||)。我们可以通过两种方式计算角度:Θ = 2acos(qw) = 2asin(||[qx,qy,qz]||)。由于第 1 步,这些总是相同的。由于我们需要找到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

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

于 2012-12-10T22:04:24.043 回答