2D衝突検出


11

このキャラクターを使っているとしましょう。

鳥
(ソース:iconbug.com

どのように衝突検出を実装しますか?鳥の形が正方形の近くにないため、境界ボックスの使用は適切な近似ではないようです。

画像の一部を表すオブジェクト内に、一種の四分木データ構造があると考えていました。各葉はfalse(鳥の外側の白/透明な空間を覆う場合)またはtrue(鳥の領域、つまりくちばし、目などを表す場合)のいずれかになります。次に、鳥との衝突について、シーン内の唯一の障害物をテストます。

しかし、私のアプローチにおける私の問題は次のとおりです。

  1. クワッドツリーを初期化する方法がわかりません。
  2. クワッドツリーが初期化された後、障害物が画像の座標内にあると、クワッドツリーをトラバースして使用する方法がわかりません。

角張っていないキャラクターとの衝突検出をどのように行いますか?

LE:私が見たもう1つのアプローチは、複数の境界ボックスを使用することでした。たとえば、くちばし用に1つまたはいくつかのバウンディングボックスを用意し、次に髪や尾用にいくつかのバウンディングボックスを用意します。しかし、それは退屈になる可能性があります。これが私の場合有効なアプローチである場合、それらの境界ボックスをどのように生成しますか?私のプログラムでそれらをハードコードする必要があるとは思いません。

LE2:かなり正確な衝突を気にします。単一のバウンディングボックスまたは円が少なくともその形状を適切に近似する方法を想像できないため、このアプローチは機能しません。


2
一般的な注意:バウンディングボックスとより詳細なチェックの両方を使用します。詳細チェックではパフォーマンスが低下するため、できるだけ実行しないようにします。したがって、最初に境界ボックスをチェックし、それがヒットした場合にのみ、レベルをさらに深くして、より細かいアプローチをテストします(それが何であろうと)。
フィリップアルガイエ2014年

おかげで、とにかくそうするつもりでしたが、「詳細なチェック」がどうあるべきか完全にはわかりません。:)
非同期

1
欠けている重要な詳細だけがあります。それをどのように処理しますか?正確な衝突を気にしますか?キャラクターを円に近づけて満足ですか?ほこりの粒子を他の部分とは別にキャラクターの目と衝突させますか?
Anko

@Ankoどうやってその形状を円で近似できるでしょう?私はかなり正確な衝突を気にします-実際にはピクセル精度ではありませんが、見た目がよく/自然に見えるものです。
非同期2014年

1
同様に、この。「良い」と「自然」はどういう意味ですか?これは哲学的な質問ですか?
Anko

回答:


12

サークルコライダー。物理的に影響を受けている特定の部分や衝突が不自然に見えるなど、特別なことをしているのでなければ、それで十分だと思います。それをいくつかの部分に分割する必要がある場合でも、1つだけ言います。

過度に複雑にしないでください。

これには完全な四角ツリー構造は必要ありません。いくつかのボックスまたは円を直線状に並べ、それらすべてと交差させます。これは、パフォーマンスが十分に重要であるとは限りません。クワッドツリーを使用してもそれほど多くは得られません。


3
うん、1つの図形でカバーできない場合は、いくつかの図形の小さな配列を作成します。例:i.imgur.com/Dd4yyGN.png
MichaelHouse

Jonkelと@ Byte56に感謝します。いくつかの形状を使用することが私の状況では適切な解決策のようです。実装が簡単で、正確かつ高速です。これを考慮せずに四分木にまっすぐジャンプしたなんて信じられない!ええと。
非同期

精度を高めるために、ボディにはサークルコライダー、くちばしには長方形のコライダー。
クロルタン2014年

14

2ステップのチェックプロセス

最初のステップでは、境界ボックスをチェックします。衝突がない場合、テストは終了です。衝突がある場合は、2番目のパスに移動します

2回目のパスであなたはより多くの精度をしたい、とあなたは真のピクセルの完璧なソリューションをしたい場合、あなたは行うことができますだけで、そのピクセルの完璧なチェックパス

画像はPNG(またはアルファチャネルを含むその他のファイル形式)であるため、これはかなり簡単です。

  1. シーン内のその1つのオブジェクトと鳥の間の交差領域を計算し、両方の画像に単純な交差の長方形を生成します
  2. その交点内で、両方の画像で各ピクセルのアルファ値が0より大きいことを確認します
  3. このようなピクセルが存在する場合は、衝突が発生しています。そうでなければ、いいえ

画像のアルファチャネルを見ると、ピクセルの完全な衝突に必要なすべての情報がすでに含まれていることがわかります。

画像からのアルファチャネル

ピクセル完全な衝突は通常コストがかかるため、最初に境界ボックスまたはより詳細な衝突図(Ankoが提案したものと同様)で大まかな見積もりを行うと、貴重な時間を節約できる場合があります

「より細かい」詳細な衝突境界ボックスAnkoは次のように提案しました。

より詳細な境界ボックス

PS:画像の周囲に、衝突したくないハロー、エフェクト、またはその他の0以外のアルファチャネルがある場合、アルゴリズムのしきい値は、それに合わせて簡単に調整できます


1
ありがとうございました!しかし、結局のところ、ピクセルの完全な精度は必要ありません。すばらしい答えですが、後で役立つでしょう。
非同期

もちろん、そうです、そうです、ピクセルパーフェクトコリジョンは、2Dファイターのように本当にそれを必要とするゲームを除いて、ほとんど常にやり過ぎです
codemonkey

3

私は胴体に円を使用し、くちばしに1つの長方形を使用しますが、それは私の意見です。衝突ジオメトリを複雑にすると、アプリの速度が低下する可能性がありますが、実際には、画面上の文字数が2倍(またはそれ以上)になります。


0

多分あなたはある種の奇妙なポリゴン/エッジコライダーを使うことができるでしょう。

これがどのように機能するか正確にはわかりませんが、

2つのオブジェクト:オブジェクト1:鳥(o1)、オブジェクト2:鳥に当たる可能性のあるもの(o2)

1)問題の最初のオブジェクト(o1)にぴったり合うポリゴンである境界形状を定義します。

2)O1、可能性が考えられる衝突O2介さずなし考え衝突可能性O2のエッジ取得貫通 O1もしくはその逆。

形状(o2)の位置とサイズを使用すると、おそらくo2に近い(o1の)別のエッジの「背後」にあるため、ヒットできないと思われる(o1の)エッジを分離できます。斜辺が上向きで右向きの直角三角形とそれに直角に近づく長方形(長辺がx軸に沿っている)がある場合、開始と終了のy値が両方であるため、除外するエッジを指定できます。長方形の上または下。

3)o2のエッジ上のポイントの1つが、ステップ2で選択したo1のエッジ上のポイントと同じかどうかを確認します。

この概念は、衝突するポリゴン(つまり、エッジがはっきりしているもの)に最適ですが、円を1つの長いエッジとして扱うことができます(たとえば、o2が円の場合)。


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