9

誰かがそれの賛否両論とそれに関連する数学を説明できますか?

4

7 に答える 7

11

2D の場合: この問題には数学は必要ありません。必要なのはカスタム ビットブリット ルーチンだけです。衝突候補の衝突マスクをこのサーフェスにペイントし、描画したいピクセルが (pixel != 0) であるかどうかを確認することにより、衝突候補を非表示のサーフェスにブリットします。すると衝突してしまいます。もちろん、衝突が発生する可能性がある場合は、四角形を囲んで事前にチェックする必要があります。

3D の場合: 数学 (たくさん) が必要です!

基本的に、敵の各サーフェスに対してアクターの各サーフェスをチェックします。これは、平面と光線の交差を計算することによって行われます。ここでは多くの最適化が可能ですが、それは 3D 表現に依存します。これも Per-Pixel-Collision ではなく、Per-Vertex-Collision です。

于 2008-10-06T05:06:18.847 に答える
10

まず、ピクセルごとの衝突検出の長所と短所に答えてから、数学的側面を後で検討します。

ピクセル単位の衝突検出 (ピクセル単位の衝突検出とも呼ばれます)、より正確には画像ベースの衝突検出は、画像として表される衝突オブジェクト間の衝突を検出します。この空間的方法は、ポリゴンやその他の幾何学的形状を使用して衝突オブジェクトを表現する、より幾何学的な方法とは対照的です。

2D の場合、一般に 3 つの異なるオプションがあります。

  • 画像ベース
  • 単純な幾何学的形状 (軸に沿ったバウンディング ボックス、円)
  • 複雑な幾何学的形状 (凸多角形、凹多角形、楕円など)

画像ベースの衝突検出は、正確で使いやすく、理解しやすいものです。描画に画像を使用するゲームに関しては、画像ベースの衝突検出を使用することは、画面上のスプライトが重なるたびに、それらが衝突検出システムでも重なることを意味します。また、Worms 2D などの破壊可能な地形を見るゲームなど、変形可能な衝突オブジェクトが必要なゲームにも役立ちます。それらの主な欠点は、特に衝突オブジェクトを回転およびスケーリングするときに、他の方法と比較して非常に非効率的であることです。

単純な幾何学的形状は、操作が簡単で非常に効率的です。高精度が必要ない場合、または衝突オブジェクトが単純な幾何学的形状にうまく適合する場合 (たとえば、衝突オブジェクトがボールの場合、円が完全に適合し、場合によっては画像よりも優れています)。それらの主な欠点は精度です。基本的な形状が適合しない高精度を実現するには、単純な形状を組み合わせてより複雑な形状にするか、より一般的で複雑な形状を使用する必要があります。どちらの場合も、最終的には 3 番目の方法になります。

複雑な幾何学的形状は、衝突オブジェクトを表現するために使用される形状の複雑さに応じて、ある程度正確であり、比較的効率的または非効率的である可能性があります。重要な欠点は、使いやすさです。衝突オブジェクトが利用可能な幾何学的形状に適合しない場合、精度が低下するか、複数の、場合によっては異なる形状を使用して表現する必要があり、これには時間がかかります。さらに、一部の形状は複雑で、画像から自動的に生成できない限り作成が容易ではありません。重要な利点の 1 つは、特に画像ベースの衝突検出と比較して、回転とスケーリングが一般的に効率的で簡単であることです。

画像ベースの衝突検出は、特に回転とスケーリングを使用する場合に効率が悪いことが多いため、一般的に悪い解決策と見なされています。しかし、非常に柔軟で正確で使いやすいため、効率の問題を解決しようとするライブラリを実装することにしました。その結果がPoxelCollで、自動的に事前計算された凸包を使用して画像ベースの衝突検出を高速化します。これにより、使いやすさ、柔軟性、精度、効率が向上し、回転とスケーリングがサポートされます。主な欠点は、純粋な幾何学的ソリューションと比較してすべての場合に効率的であるとは限らず、事前計算を使用する必要があることです。つまり、変形可能な衝突オブジェクトではそれほど効率的ではありません。

3D の場合、オプションと利点は多少似ています。

  • ボリュームベース
  • 単純な幾何学的形状 (軸に沿ったバウンディング ボックス、円)
  • 複雑な幾何学的形状 (凸多角形、凹多角形、楕円など)

Peter Parker の答えは 3D では間違っていることに注意してください。2D のピクセル (画像要素) は、3D のボクセル (ボリューム要素) に対応します。

いくつかの重要な違いは、2D の場合よりも 3D の場合の方が空間メソッドがはるかにまれであることです。考えられる理由の 1 つは、3D が余分な次元を追加するため、単純な幾何学的ソリューションは依然として効率的ですが、空間ソリューションの効率がさらに低下することです。また、ゲームでは、衝突検出は一般にオンライン操作であり、ある程度の効率が必要であり、効率が重要になります。したがって、ボリュームは、衝突をオンラインで決定する必要がないゲーム以外のアプリケーションでより頻繁に使用されます。

ボリュームベースの衝突検出による衝突検出の例については、たとえば変形可能なオブジェクトの体積衝突検出 を参照してください。幾何学的形状の代わりにボリュームを使用すると、任意の形状の閉じたサーフェスを持つ変形可能な衝突オブジェクトを処理できます。

2 番目の質問については、画像ベースの衝突に関連する数学は、単純なものから複雑なものまでさまざまです。単純なケースでは、基本的に、軸に沿った境界ボックスを画像に使用し、それらの交点を見つけて、交点内の画像のみをチェックします。より複雑なソリューションには、凸多角形の交差が必要な前述のライブラリが含まれます。3D の場合、ソリューションは単純なものから非常に複雑なものまでさまざまです。

于 2012-05-14T19:20:14.337 に答える
2

頂点(またはヒットボックスなど)よりも正確です。ここで2Dについて話していると仮定します(3Dはボックスモデルと頂点になります)。ピクセルごとに、小さなもの(ミサイルなど)がより現実的に衝突する詳細なスプライトを作成できます。

これは、ボックス(または円のような他の簡単な数学の形)を描画して「これは俳優です、ここにあるものはすべて彼です」と言う従来の方法よりも数学的で遅いです。ただし、より正確です。

于 2008-10-06T04:35:57.630 に答える
2

長所と短所について話すときは、衝突応答も考慮する必要があります。衝突が検出されたときに何をしたいですか? オブジェクトが別のオブジェクトに衝突し、結果として一方または両方のオブジェクトが破壊されていることを検出している場合は、ピクセルごとの衝突検出が適切で正確です。オブジェクトを別の方法で反応させたい場合、つまり、壁に対してスライドさせたり、バウンスさせたりする場合は、衝突反応をよりスムーズに見せるために、何らかのタイプの境界長方形/円/楕円を使用することをお勧めします。一貫性があり、行き詰まる可能性が低くなります。

于 2008-10-06T05:45:40.280 に答える
1

長所はすでに述べたとおりです。ピクセル パーフェクトで公正であり、偽陽性も偽陰性もありません。主な欠点は、計算にコストがかかることですが、最初に単純な境界ボックス チェックを行う場合、これは大きな問題にはなりません。OpenGL と DirectX の時代には、もう 1 つの問題があります。スプライト データは通常テクスチャです。つまり、それらは VRAM にあり、ピクセル値を自分で簡単に確認することはできません。OpenGL では、glReadPixels関数を使用して 2 つのスプライトの交差部分を RAM に戻し、衝突をチェックできます。または、オクルージョン クエリを使用できます。. GPU からデータを戻していないため、オクルージョン クエリ アプローチのパフォーマンスが向上するはずですが、オクルージョン クエリはどこでもサポートされているわけではありません (つまり、OpenGL ES ではサポートされていません。間違っている場合は誰かが修正してください)。

于 2008-10-06T05:38:50.280 に答える
0

ピクセルごとの衝突検出は過去の遺物です。グラフィックスが単純で、2D ハードウェアにスプライトと背景の間の無料の衝突チェックが含まれていたとき、基本的な距離計算でさえ計算コストが高かったためです。今日の 2D グラフィックスはより複雑になっていますが、特にオブジェクトの可視形状と衝突形状は通常異なるため、ピクセルごとの衝突チェックはほとんど使用されません。ほとんどの場合、円またはボックスで十分です。また、opengl ベースのグラフィック ハードウェアは衝突チェックを行うことができなくなったため、グラフィック メモリに直接アクセスできないため、システム メモリに追加のビットマップ データを保持しながら、衝突チェックのみを目的として CPU を使用して追加のレンダリング コードを記述する必要があります。 .

于 2010-07-26T00:13:51.553 に答える