16

これが私の問題です。私はゲームを作成していますが、衝突を行う方法について疑問に思っています。分析して最適な解決策を見つける必要があるケースがいくつかあります。

前もって言っておきますが、私はサードパーティの物理ライブラリを使用していませんが、社内で行うつもりです。(これは教育プロジェクトなので、スケジュールがなく、学びたいです)

衝突を作成する必要がある 2 種類のメッシュがあります。

1) スタティック メッシュ (画面上を移動しますが、アニメーションはありません)

2) スキン/ボーン メッシュ (アニメーション)

実際、私はこの解決策を持っています(かなりハック:|)

まず、完全なメッシュ (私の場合はカプセル) を囲むバウンディング ボリュームに対するテストがあります。

1) 静的メッシュについては、手動で (モデラー上で) ブロックに分割し、これらのブロックごとに球体/AABB テストを使用します。(正常に動作しますが、すべてのメッシュをスライスするのは少し面倒です:P) (メッシュを平面に分割する自動システムを試しましたが、悪い結果が得られました:()

2) アニメーション化されたメッシュ ATM の場合、実行時にメッシュを x ブロック (x はボーンの数) に分割しています。各ブロックには、そのボーンが主要なインフルエンサーである頂点が含まれています。(うまくいくこともあれば、本当に悪い結果になることもあります。:|)

メッシュの分割は毎回ではなく、読み込み時に行われることに注意してください (そうしないと、スライドショーのように実行されます:D)

そして、ここに質問があります:

これら2つのケースに使用する最も正気なアイデアは何ですか? これらの方法を研究するための資料はありますか? (いくつかのソースコードと説明があればさらに良いでしょう(言語は重要ではありません。アルゴリズムを理解していれば、実装は簡単です))そのソリューションが他のソリューションよりも優れている理由を議論できますか?kd-tree、octree などについて多くの話を聞きました。それらの構造は理解していますが、衝突検出シナリオでの有用性を見逃しています。

答えてくれてありがとう!!!

編集:ネット上で説明のあるK-Dopの例を見つけようとしています。まだ何も見つかっていません。:(手がかりはありますか? K-Dopを他のタイプのバウンディングボリュームなどで効率的にテストする方法に興味があります...しかし、ネット上のドキュメントは非常に不足しているようです. :(

4

4 に答える 4

6

複雑な衝突検出を行う前に、基本的な検出を実行する必要があります。

バウンディング ボリュームとして球または長方形を使用するのが最善の策です。これで衝突が検出された場合は、より複雑なメソッドに進みます。

私が得ているのは、単純な方が多くの場合、より良く、より速いということです。バウンディング ボリュームのラップとメッシュの分割はコストがかかり、複雑なことは言うまでもありません。しかし、あなたは正しい軌道に乗っているようです。

ゲーム プログラミングと同様に、衝突検出には複数の方法があります。私のアドバイスは、シンプルに始めることです。立方体を取り、その上でルーチンを完成させれば、理論的には他のモデルを使用できるはずです。例としては、 gamedev.netにすばらしい記事があるのでチェックします。多くのまたは私の自家製の衝突検出は、多くの方法の組み合わせであるため、決定的なリソースを実際に推奨することはできません。

于 2010-01-29T20:06:36.540 に答える
5

現在の多くの AAA ゲームで使用されている最も一般的なアプローチは、"k-DOP" による静的メッシュの単純化されたコリジョンと、スケルタルメッシュの単純化された物理ボディ表現です。

「kDOP衝突」または「離散方向ポリトープ」をグーグルで検索すると、十分な参照が見つかるはずです。これは基本的に、三角形の衝突が発生するまで、外側からメッシュに向かって移動する複数の平面で定義されたバウンディング ボリュームです。kDOP の「k」は、使用されるこれらの平面の数を定義し、ジオメトリと「k」に応じて、非常に適切な近似値を得ることができます。

SkeletalMesh の場合、最も一般的な手法は、特定のボーンにアタッチされた単純なジオメトリを定義することです。このジオメトリは、ボックスまたは球である可能性があります。この衝突モデルは、アニメートされたメッシュの非常に正確な衝突検出に使用できます。

三角形ごとの衝突が必要な場合は、「分離軸定理」が選択したGoogle検索用語です。これは特定の場合に役立ちますが、衝突検出のニーズの 75% は上記の方法でカバーする必要があります。

ほとんどの場合、バウンディング ボリュームよりも高いレベルのアーリー コリジョン リジェクションが必要になることに注意してください。世界に多くのオブジェクトがあるとすぐに、「空間分割」を使用して、オブジェクトのグループをそれ以降のテストからできるだけ早く拒否する必要があります。

于 2010-01-29T22:35:42.483 に答える
3

答えの質問は、どれだけ正確に必要かということになります。

明らかに、球のバウンディング ボックスが最も単純です。スケールの反対側には、オブジェクトが移動するたびに発生する必要がある、完全な三角形のメッシュ間の衝突検出があります。

ゲーム開発の物理エンジンは、近似の技術に依存しています (私は数年前に GameDev.net の数学および物理フォーラムに潜んでいました)。

私の意見では、各オブジェクトに関連付けられた何らかの境界楕円体が必要になるでしょう。オブジェクトは、一般的なマルチメッシュ オブジェクト、メッシュ、またはサブメッシュ メッシュにすることができます。これにより、「まともな」量の近似値が得られるはずです。

于 2010-01-29T21:43:35.830 に答える
2

Christer Ericson の著書Real-Time Collision Detection を手に取ってください。彼はこれらの問題について非常に詳細に議論しています。

記事を読むときは、実際のゲーム アプリケーションではメモリと時間の厳しい制限の下で作業することになることを思い出してください。そのため、そのアルゴリズムのメモリと CPU フットプリントについて真剣に議論していない記事や論文には注意してください。

于 2010-01-29T21:45:04.233 に答える