Bulletを使用してクライアント/サーバーの物理システムを実装しようとしていますが、同期をとるのに問題があります。
ゲームオブジェクトから変換を読み書きするカスタムモーション状態を実装しましたが、ローカルで動作しますが、ネットワーク化されたゲームに対して2つの異なるアプローチを試しました。
- サーバー上にも存在するクライアント上の動的オブジェクト(たとえば、ランダムな破片やその他の重要ではないもの)は運動学的に作成されます。これは正しく動作しますが、オブジェクトは非常にスムーズに移動しません
- オブジェクトは両方で動的ですが、オブジェクトが移動したというサーバーからの各メッセージの後に、線形速度と角速度をサーバーからの値に設定し、サーバーのトランスフォームでbtRigidBody :: proceedToTransformを呼び出します。また、btCollisionObject :: activate(true);を呼び出します。オブジェクトを強制的に更新します。
方法2の私の意図は基本的に方法1を行うことでしたが、方法1をスムーズにするために自分で行う代わりにBulletを乗っ取って貧者の予測を行いましたが、これはうまくいかないようです(理由が100%明確ではないため)私は弾丸を踏んでさえいます)そしてオブジェクトは時々異なる場所に行き着きます。
私は正しい方向に向かっていますか?Bulletには独自の補間コードが組み込まれているようです。それは私が方法1をうまく機能させるのに役立ちますか?または、誤って踏みつけているため、方法2のコードが機能していませんか?
編集:私が気付いた方法1のもう1つの問題は、同期されていないオブジェクトに対する衝突の衝突応答が大幅にずれることです。キネティックボディは、ノックバックできないため、時々無限にシュートするものです。