複数のポリゴンで軸定理を分離していますか?


9

C#で分離軸の定理を実装しようとしています。2つのポリゴン間の最小並進ベクトルを計算できる関数があります。ただし、1つのポリゴンと他の複数のポリゴンの間の最小並進ベクトルを計算する関数を作成できないようです。正直なところ、私は何ヶ月もこれに取り組んできましたが、解決策に近づいておらず、オンラインで解決策を見つけることができませんでした。常に正しい結果を返さないエッジケースがいくつかあり、私のゲームで優先度の高いバグが発生します。

以下は、正常に機能しない一般的なエッジケースです。

エッジケース

この問題のよく知られた解決策はありますか?私が見つけることができるのは、「各ポリゴンでSATを実行するだけ」と言っている人たちだけですが、これが最小の並進ベクトルを生成することはめったにありません。

任意の助けをいただければ幸いです。


私が実際にテストに回ったことがないという1つのアイデアは、いくつかの分離軸(隣接するポリゴンに横に移動する軸)にフラグが付けられ、最小値と見なされないようにすることです。次に、ある種の繰り返しテストで良い結果が得られます(おそらく、ある種のFIFOやループがスタックするのを防ぐための反復制限がある場合)。
Andrew Russell、

これを解決するのがさらに難しいのは、形状のエッジが他の部分で部分的にしか覆われていない場合です。たとえば、右上の画像で、真ん中の正方形が右側に伸びている場合、より大きな長方形になります。これは、私が使用するいくつかのコードの出力に似ています。これは、数万の占有/非占有セルを取り、それを100より大きい衝突形状の下に削減します
Richard Tingle

回答:


2

理想的には、ポリゴンから環境を構築しないでください。あなたはそれをエッジから構築します(おそらくあなたはポリゴンのセットから計算します)。たとえば、最初の例では、1つの対角エッジがあります。最後の例では、ボックスは単一の水平エッジ上に置かれています。

エディターまたはツールがレベルを構築するためにより小さい個々の形状を使用するという事実は、ランタイムに影響を与えるべきではありません。

少し単純なアプローチでは、基本形状の「内側」のエッジを単に削除します。最後の例では、「floor」ボックスの間に2つのエッジがあります。衝突検出中は無視してください。

Box2Dのドキュメントのセクション4.5(エッジとエッジチェーン)を読むと、より良い写真と実装のアイデアを見つけることができます。


2
エッジ(特にエッジ、エッジチェーンを使用するとわずかに改善されます)を使用すると、物理オブジェクトがレベルジオメトリ内でグリッチが非常に発生しやすくなるという大きな欠点があります。
Andrew Russell

1
@AndrewRussell:通常のトンネリング修正により、これらの問題は回避されます。移動するオブジェクトのボリューム/エリアがかなりまともであることを確認し、フレームあたりの最大速度を十分に低くして、最短寸法の半分以上移動できないようにします(または、より速く移動する必要がある場合は、複数回ステップします)。あなたのレベルのジオメトリで本当に鋭い岩の割れ目など、反復解像度を複数回使用すると、「安全な」最後の位置などに収束するまで
ショーンMiddleditch
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.