連続物理エンジンの衝突検出技術


10

私は純粋に連続的な物理エンジン取り組んでおり、幅広い位相衝突検出のためのアルゴリズムを選択する必要があります。「完全な連続」とは、交差テストを決して行わず、代わりにすべての衝突が発生する前にそれをキャッチし、TOIによって順序付けられた「計画された衝突」スタックに入れる方法を見つけたいという意味です。

ブロードフェーズ 私が考えることができる唯一の連続的なブロードフェーズの方法は、各ボディを円に入れ、各円が別の円と重なるかどうかをテストすることです。ただし、これは恐ろしく非効率的で、カリングが欠如しています。

四分木など、今日の離散衝突カリング手法にどのような連続アナログが存在するのかもわかりません。ディスクリートエンジンなどの不適切で無意味な広範なテストを防ぐにはどうすればよいですか?また、1フレーム以上先の衝突を確認できるようにしたいと考えています。

ナローフェーズ
私はナローSATを離散ではなく継続的なチェックに適応させることができましたが、皆さんが出くわした可能性のある論文やサイトには、他にも優れたアルゴリズムがあるはずです。
どのようなさまざまな高速または正確なアルゴリズムを使用することをお勧めしますか、それぞれの長所/短所は何ですか?

最後の注記:凹面、凸面、円形、または穴があってもよいさまざまなポリゴンをどのように保存するかまだ決まっていないため、アルゴリズムではなくテクニック
を言います。アルゴリズムに必要なものに基づいてこれを決定する予定です(たとえば、ポリゴンを三角形または凸型の形状に分解するアルゴリズムを選択した場合、このフォームにポリゴンデータを格納するだけです)。


私はあなたがこれらの本をご確認をお勧めします amazon.com/Real-Time-Collision-Detection-Interactive-Technology/... amazon.com/...
concept3d

追加して申し訳ありませんが、Box2Dを使用しないのはなぜですか?ほぼすべての言語に移植されています。使用する予定がない場合は、ソースを参照して、それがどのように圧縮されているかを確認できるようにしてください。
デレク

回答:


2

私は本当にこの辺りにアイデアを投げかけています。あなたが(少なくとも)currentポジションとnextポジションを持っていると仮定します。各フレーム。

2つの個別の広いフェーズが必要で、その後に狭いフェーズが続きます。

  • 衝突が発生することを理解するもの。
  • 衝突が実際にどこで発生するかを大まかに把握するもの(たとえば、広いフェーズ/不正確なSAT)
  • 最後に、狭いフェーズは2番目の広いフェーズの結果を改善します。

最初の広範なフェーズ

最初の広範なフェーズについて、空間ハッシュ(を使用するのnextではなく、位置を使用current)を調べることができます。これにより、問題のスペースが衝突候補のグループにうまく分割されます。

第2ブロードフェーズ

説明した円交差法を使用して、バイナリマルチサンプルを実行します。言い換えると:

left = current
right = next
midpoint = (left + right) / 2
loop a desired amount of times tweaked to the accuracy you want:
  is a collision occuring at midpoint?
    right = midpoint
  else?
    left = midpoint
  midpoint = (left + right) / 2
pointOfCollision = midpoint

その精度の微調整は、距離を考慮に入れることもできます。「長さの2乗」を使用next - currentすると、ピクセルパーフェクトな結果が得られると思います

狭い相

PMaskのようなものを使用してバイナリマルチサンプルを実行します。ロジックは上記とまったく同じです。別の衝突ルーチンを使用するだけです。

最終的に

から交差時間を計算しpointOfCollisioncurrent現在のspeedand acceleration(適切なインテグレーターがいると仮定)を計算できます。


二次的な広域位相検出の場合、円の移動経路の中点を取得し、それがテスト対象の円の内側にあるかどうかをテストすることを提案していますか?私は単純に二つの円を時間をかけてお互いからの距離を与える式を作成することができます考えて、いつでも距離が0に等しいかどう見ていた
グリフィン

また、Pmaskは正確に何をしますか?サイトは実際には説明していません= /。
グリフィン

@グリフィンあなたの最初のコメントはうまくいくかもしれません-あなたが理解できるかどうか見てください。私は基本的に衝突空間の二分探索を行っています... PMaskはかなり賢いです。符号なし64整数を8x8ピクセルのグリッドとして表示(オン/オフ)-単純なAND(バイナリ)により、衝突が発生しているかどうか(ゼロ以外)が判断されます。最初に巧妙なビットシフトを行う必要がありますが、それがアイデアです。詳細についてはソースを読んでください。ここで説明するのは難しいです(または、私の説明ではうんざりします)。ソースを参照する必要があります。
ジョナサンディキンソン、2011

1

より具体的になるように質問を更新しました。もう少しお手伝いします。

最初の大まかなフェーズチェックでは、空間ハッシュを強くお勧めします。

基本的に、画面を同じサイズのグリッドに分割します。次に、オブジェクトがグリッド内にある場合は、1Dハッシュテーブルの「バケット」に追加します。

これが最初のチェックです。オブジェクトが同じバケットにない場合、それらが交差することは不可能です。

それを続けると、オブジェクトが(場合によっては)含まれるバケットのリストが作成されます。次のいずれかによって、ここで別の大まかなフェーズのチェックを行うことができます。

A.)このバケットを他の4つのバケットに分割し、結果の1Dハッシュテーブルを確認します。それらが同じバケットにない場合、衝突はありません。

または:

B.)正確さを確保するために、簡単な距離チェックを行い、オブジェクトの幅または高さ、あるいはその両方を念頭に置いてください。

しかし、衝突が発生する可能性がある場合はどうでしょうか?

次に、これに沿って何かをお勧めします。これは基本的に、多角形の衝突(複雑な形状の場合)、またはそれほど複雑でない形状の場合は長方形/円の間の一種の混合です。

また、「衝突が発生する前に衝突をキャッチして保存」したい場合は、いつでも次のようなことができます。

2つのオブジェクトが同じバケット内にある場合、それらは衝突する可能性があります。

さらに、オブジェクトは近くにあり、すぐに衝突する可能性がありますか?(速度、オブジェクトのサイズ、距離を考慮に入れる)

両方の答えが「はい」の場合は、先に進んで保存し、後で交差テストを行います。


古い答え

残念ながら、「すべての衝突タイプとそれらの用途」ハンドブックがわかりません。:)

ただし、これは非常に幅広い質問ですが、始めましょう。

このようなものに関連する良い(答えられた)質問があります

ここで NとN +を作った人々による記事と同様に。

言うまでもなく、古き良きフォールバックのピクセル単位の衝突があります。

私は誰もがあらゆる種類の衝突の便利なリストを持っていることを心から疑いますが、これはあなたが始めるのに役立つはずです。

ただし、必要な(そして最終的には使用する)衝突のタイプは、作成するゲームのタイプに大きく依存することにも触れておきます。そのため、チュートリアルを見つけます。たいていの人は、あなたがあなたが何を望んでいるのかを知っていると思っているので、彼らはその特定の領域であなたを助けます。私のリンクのほとんどは特定のテーマのチュートリアルであることを理解していますが、チュートリアルは正直にあなたをさらに助けると思います。リストは1つですが、各箇条書きについて自分で読んだ場合は、より具体的にニーズに合った、より知識豊富な決定を下すことができます。


(ハルデザインを使用したピクセルごとの)衝突を元にした方法を追加するのを忘れました。アーカイブを許可すると、元のサイトはWebサイト天国に行きました。web.archive.org/web/20090126230334/http://www.ziggyware.com/...
electroflame
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.