2Dゲームのコリジョンレスポンス:特定の軸に沿ったSATと最小変位?


13

作成中の2Dゲームに衝突システムを実装しようとしています。分離軸定理(metanetのコリジョンチュートリアルで説明されている)は、衝突検出を処理する効率的で堅牢な方法のように見えますが、私は彼らが使用するコリジョンレスポンスメソッドがあまり好きではありません。オーバーラップが最小の軸に沿って盲目的に移動することにより、アルゴリズムは移動するオブジェクトの前の位置を単純に無視します。つまり、静止オブジェクトに進入して跳ね返るまで静止オブジェクトと衝突しません。

これが重要な状況の例を次に示します。

例

上記のSATメソッドによれば、長方形は斜辺に垂直な三角形から単純に飛び出します。

SATスタイルの応答

ただし、現実的には、長方形は三角形の右下隅で停止する必要があります。これは、変位ベクトルに沿って連続して移動している場合の最初の衝突点になるためです。

現実的な反応

さて、これは実際にゲームプレイ中は重要ではないかもしれませんが、この方法で正確かつ一般的に正確な変位を達成する方法があるかどうかを知りたいです。私は過去数日間、頭を悩ませてきましたが、まだあきらめたくありません!

(StackOverflowからクロスポストされ、ルールに反しないことを願っています!)


それはルールに反しています。クロスポストしないでください。
攻撃

はい、StackOverflowから削除して、ここに保管してください:P
TravisG

gamedev.stackexchange.com/questions/9144/…ここで特定の質問に答えました。
アルティフィニタス

SOから削除されました。
アルカゴン

報奨金を開始します、アルカゴン:Pそうでなければ、私はしなければならないかもしれません。この質問は非常に興味深いものであり、単にいくつかの参照をリストする以上のことを行う答えを見るのは素晴らしいでしょう。
TravisG

回答:


11

これが私が見つけた方法です。欠陥があるかもしれませんが、私の大まかな分析ではまだ問題を発見していません。また、いくつかの小さな変更を加えた任意のポリゴンでも機能します。

以下の図では、青いオブジェクトは動いており、赤いオブジェクトは静止しています。 1 ステップ1:各ポリゴンについて、モーションベクトルに垂直なラインへのそのポリゴンの投影に沿った2つの最も遠いポイントを見つけます。 2 ステップ2:これらのポイントを結ぶ線に沿って各ポリゴンを分割します。モーションベクトルに沿って他のポリゴンに面するポリゴンの半分が「前方船体」です。これは、衝突する可能性があるポリゴンの唯一の部分です。 3 ステップ3:各ポリゴンの「前方船体」の各ポイントから反対側のポリゴンに向かってベクトルを投影し、反対側のポリゴンの「前方船体」の各エッジとの交差をチェックします。(?おそらく遅いが、コンピュータは、最近かなり速いです-右)(。。申し訳ありませんが、傾斜矢印についてのすべての矢印は、平行でなければなりません) 4 。ステップ4:最短ベクトルを取ります。これは正確な衝突距離です。 5 ステップ5:出来上がり! 6


2
それはかなり印象的です。アルゴリズムの速度を単純な(4xまたは8x)マルチサンプリングと比較したことがありますか?
TravisG

残念だけど違う。
アルカゴン

印象的で、数学もそれほど複雑でも集中的でもないはずです。+1
you786

7

同様の質問をご覧ください。 ご覧衝突解決

また、から http://www.metanetsoftware.com/technique/tutorialA.html#section5(:)へのリンクを投稿しました)

セクション5:高速移動オブジェクト

前述のように、静的な衝突テストを使用する場合、小さいオブジェクトや高速で移動するオブジェクトは問題を引き起こす可能性があります。そのようなオブジェクトを処理する方法はいくつかあります。最も単純なのは、そのようなオブジェクトが不要になるようにゲームデザインを制約することです。

絶対に必要な場合は、小さいオブジェクトや高速で移動するオブジェクトを処理するための2つの一般的な方法があります。スイープコリジョンテストとマルチサンプリングです。

-=スイープテスト=-

2つの静的な形状の交差をテストする代わりに、元の形状を軌跡に沿ってスイープし、これらのスイープした形状間の重なりをテストすることで、新しい形状を作成できます。

基本的な考え方は、サークルサークルおよびAABB-AABBスイープテストの[Gomez]で説明されています。

-=マルチサンプリング=-

スイープテストのはるかに簡単な代替方法は、マルチサンプルです。オブジェクトの新しい位置で単一の静的テストを実行する代わりに、オブジェクトの前の位置と新しい位置の間にあるいくつかの位置でいくつかのテストを実行します。この手法は、Nのラグドールと衝突するために使用されました。

サンプルの間隔が常にオブジェクトの半径よりも短いことを確認すると、優れた結果が得られます。実装では、サンプルの最大数を制限しているため、非常に高速になると問題が発生する場合があります。これは、特定のアプリケーションに基づいて調整できるものです。

編集

要約すると、いくつかの解決策があります

  1. これを引き起こす可能性のある小さくて速いオブジェクトがゲームにないようにゲームを制限してください
  2. 私が投稿した最初のリンクで説明されているように、衝突が実際に発生するのを防ぐシステムを実装する
  3. 高速および/または小さな移動オブジェクトのサンプリングレートを上げる
  4. ...おそらくそれ以上ですが、私は専門家ではありません。

1

直線運動だけが必要な場合、または角運動にも対応する必要があるかどうかによって異なります。

SATを使用する代わりに:

線形のみの場合、オブジェクトのデルタ線形速度の方向で、原点からの2つのポリゴンのミンコフスキー差に対してレイキャストできます。

光線がMDに衝突すると、2つのオブジェクトが衝突し、衝突点が衝突した時刻tを知らせます。

これで、オブジェクトが移動および回転している場合、オブジェクトはより難しくなりますが、同様の手法を使用できます。保守的な進歩により、このケースに対処することができます。この手法は反復的です。反復ごとに新しいMDが生成され、交差点に近づくことができます。

保守的進歩に関する元の草案は次のとおりです。

http://www.continuousphysics.com/BulletContinuousCollisionDetection.pdf

ここで、この手法について詳しく説明した記事を書きました。

http://www.wildbunny.co.uk/blog/2011/04/20/collision-detection-for-dummies/

これらの助けを願っています!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.