CAD のようなプログラムを作成し、modelvisual3D オブジェクトを作成しています。MeshGeometry3D を使用してオブジェクト (modelvisual3d) 間の衝突検出を行うにはどうすればよいですか。動いているオブジェクトのすべての三角形を、静止しているオブジェクトと比較する必要がありますか?
衝突検出を行う最良の方法は何ですか?
CAD のようなプログラムを作成し、modelvisual3D オブジェクトを作成しています。MeshGeometry3D を使用してオブジェクト (modelvisual3d) 間の衝突検出を行うにはどうすればよいですか。動いているオブジェクトのすべての三角形を、静止しているオブジェクトと比較する必要がありますか?
衝突検出を行う最良の方法は何ですか?
リードの答えに追加するには(ここでの私の答えに基づく):
バウンディングボックス/球からバウンディングボックス/球へのテストでほとんどのオブジェクトを削除した後、三角形/三角形の衝突をチェックする前に、まずテストオブジェクトの三角形を他のオブジェクトのバウンディングボックス/球に対してテストする必要があります。これにより、より多くのケースが排除されます。
衝突を除外するには、テストオブジェクト内のすべての三角形をチェックする必要がありますが、三角形/三角形のケースに移動する必要があるケースを見つけるには、相互作用する最初の三角形を見つけるだけで済みます。他のオブジェクトのバウンディングボックス/球。
SAT の定理 (Separating Axes Theorem) を見てください。最も速くて簡単な定理です。
これについての理論は、三角形を分離する線を引くことができれば、それらは衝突していないということです。
前述のように、最初に AABB の早期検出を行い、2 つのオブジェクトが衝突したときに、オブジェクト A の各ポリゴンをオブジェクト B の各ポリゴンに対してテストします。
2D で開始して、2 つのポリゴンが衝突するかどうかをテストするには、可能な軸 (この場合は X と Y) でそれらの範囲を取得します。これらの範囲が交差する場合、ポリゴンは衝突しています。
このページでは、それがどのように機能し、どのように適用するかについての非常に良い説明を見つけることができます: http://www.metanetsoftware.com/technique/tutorialA.html
これを 3D に適用するには、各ポリゴンのエッジを分離軸として使用するだけです。これらの軸の範囲が交差する場合、ポリゴンは衝突しています。
また、このメソッドは移動オブジェクトの衝突を解決し、衝突の運動量も与えます (相対角速度を解決し、速度 A から速度 B を減算します。このようにして、問題は移動オブジェクトと静的オブジェクトに縮小され、ポリゴン A の範囲までテストしている軸。それらが交差する場合は、ポリゴンの元の範囲を休ませると、衝突の勢いが得られます)。
もう 1 つのオプションは、よく知られているBullet Physics Engineの C# ラッパーであるBulletSharpを使用することです。この場合、関数を記述して、MeshGeometry3D から (凹型の) 衝突形状を作成する必要があります。
私の経験では、凹面形状間の動的衝突はサポートされていませんが、かなりうまく機能します。回避策として、凸分解を使用する必要があります。
それは、衝突検出がどの程度正確である必要があるかによって異なります。
WPF の 3D ライブラリには組み込みの衝突検出はありません。高い精度が必要な場合は、すべての三角形を比較する必要があります。
そうは言っても、境界ボックスや境界球を比較することから始めることができます。ほとんどのケースを迅速に排除できるため、これは常に適切な最初のステップです。正確な衝突検出が必要ない場合は、これだけで十分かもしれません。