私は次のアプローチを使用します(Tonge http://www.richardtonge.com/の質量分割アルゴリズムに似ています):
- シーン/コンテキスト内のすべての衝突ペアを検出します。(A、B)をそのようなペアとします。ゴースト/質量分割のアイデアを適用します。AがM個のボディと接触し、BがN個の他のボディと接触している場合、Aの質量をBの質量に一時的に設定
m_A/M
します。m_B/N
- 各ペア(A、B)の反力/反発力の寄与を計算し、これらの寄与をAおよびBのアキュムレーターに保存します
- インパルスから復元速度を計算し(あなたが述べたように)、それらを同じ方法で(各(A、B)ペアの独自のアキュムレータにdeltaV速度残差として)保存します。
- ペナルティ変位を計算します(再度、変位を蓄積し、それらを即座に適用しないでください!)
- 衝突ペアのパーティとして以前に指定されたすべてのボディの質量をリセットします(
m_A = m_A * M
およびm_B = m_B * N
)
このアプローチは、Jacobi反復アルゴリズムが線形連立方程式でどのように機能するかに似ています。そして収束することは保証されていませんが、私のシミュレーターでは、3Dで非常にスムーズに仕事をします(はい、余分な次元は難易度を2倍追加します!)。
警告:衝突の検出/処理段階が終了した後にのみ、位置と速度を修正してください!そうすれば、衝突するアクタを同時に更新できます。また、次に位置と速度を統合するときに、反発力を考慮する必要があります。
編集:まあ、あなたはすでに悪用されているVerlet統合方法を使用していると思います(これはgamedev愛好家の中で一般的な名前になります)。この衝突処理と統合のスペクターでは、こちらをご覧ください。
更新:衝突(および実際には自己衝突)に対処する方法に関する情報の一部は、これらのペーパーで見つけることができます。
私が提案したアプローチは、最初からの貢献ではなく、多くのゲームがそれをもっともらしい結果で使用しており、JakobsenのHitmanゲームエンジンで最もよく採用されていました。
やや実用的な経験から、ペナルティ力(貫通距離から入力を取得する線形または指数バネに類似)は、衝突する物体からの他の力がそれらよりも大きい場合、貫通を適切に解決しません。だからこそ、3つの(ほぼ冗長な)アプローチを組み合わせることを選択しました。ニュートン反力(壁を押す、壁を押し戻す)、インパルス由来の速度(スヌーカーボールの衝突)、および非自然な「身体を互いに幾何学的に離す」 " 解決。一緒に彼らはすべてを提供するようだ:ほとんどを取り除くinterい相互侵入アーティファクト、衝突する物体は、長期的には相互作用する傾向があります(反発速度と力により-少なくとも、衝突シナリオで物体を引きずる力は相殺され、物体は互いに跳ね返ります) 。最後に、これらの単純だが一般的な概念をさらに理解するために、これらのスライドを分析することをお勧めします。
Verletの統合手順を説明する私の「虐待された方法」の言い回しは、これが統合方法の聖杯であるという一般的な文化の信念を対象としています。シンプレクティックオイラー(半陰的オイラーとも呼ばれます)のいとこよりもわずかに優れています。より複雑な統合方法が存在します(そして、それらすべてに暗黙の名前が付けられています)。強力なゲームエンジンはそれらを利用しますが、特定のシナリオに合わせてVerletが調整されたとき、インディー開発者はそれらを試してみる時間がありません。また、少しの不正行為を伴わずに硬い制約に対処できる統合方法はまったくありません(リンクは見つかりませんが、言及している論文は「X.Provot-"Deformation Constraints in a Mass」と呼ばれるべきです。リジッドクロスの動作を記述するスプリングモデル」