0

サーバーとクライアントがあります。私は40個のOpenGLキューブを持っています。状態は、位置の 3 次元ベクトルと 3x3 回転行列 (またはクォータニオン) によって記述されます。

中間パケットを送信し、それらのパケット間のクライアントのオブジェクトの状態を予測するにはどうすればよいですか (外挿)?

オブジェクトの位置については、速度の線形予測子を使用できます。四元数の状態を予測する方法は?

4

1 に答える 1

0

線形速度で行っていることと並行して最も簡単なことは、角速度で線形予測子を使用することです。

t秒離れたグローバル方向を表す2 つの四元数q_0q_tがある場合、2 つの四元数間の有限差を計算し、それを使用して外挿に使用できる角速度を見つけることができます。

  1. q_0とq_tの間の内積が負でないことを確認してください。負の場合、四元数の 1 つのすべてのコンポーネントを無効にします。これにより、長い道のりを歩もうとしていないことを確認できます。サンプリングに比べて体が非常に速く回転している場合、これは問題であり、以前の角速度を説明し、可能な最大加速度について仮定する、より複雑なモデルが必要になります。そうではないと仮定します。
  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]||) . 角度は次の 2 つの方法で計算できます: Θ = 2acos(qw) = 2asin(||[qx,qy,qz]||)。ステップ 1 のため、これらは常に同じなりますとにかく次のステップへ。
  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 に答える