ミサイルとビットマップ地形の交点を見つける最も効率的な方法は何ですか?


10

2Dビットマップ地形の傾斜を見つけることに関する私の以前の質問に続いて、ミサイルが命中した2D地形上の点を見つける最良の方法を知る必要があります。明らかに、ミサイルの下のピクセルが地形と交差するかどうかはわかりますが、地形のかなり奥に移動したと言えます。

最初に衝突した場所を見つけるために後退する最良の方法は何ですか?一度にXピクセル前にミサイルの前の位置に移動できますが、Xの適切な値はどれですか。そしてもっと賢い方法はありますか?たぶん半分の距離を移動し、次にクォーターなどを移動しますか?


あなたが説明している現象は一般に「トンネリング」と呼ばれ、それに対処する最良の方法はスイープテストを導入することです。
jpaver 2010

「スイープテスト」と言っても、実際には役に立たない。ビットマップ地形を使用してどうすればよいですか?
Iain

ジェイソンの提案は私にとって最良のようです:一度に1ピクセル。
jpaver 2010

回答:


3

衝突テストの場合、ティックごとの静的テストを行うべきではなく、トレース/スイープテストを行う必要があります。

さまざまな種類のプリミティブのさまざまな式の完全なリストがここにあります:http : //www.realtimerendering.com/intersections.html

つまり、もちろん、地形をテストできるプリミティブのある種類のセット(つまり、ラインセグメント)に分解できると仮定します。それにはさまざまな方法があります。

この質問も参照してください(わずかに関連しています):移動する球間の衝突を検出するための優れたアルゴリズムは何ですか?


ワームのような破壊可能なビットマップ地形について考えていました。ビットマップからプリミティブを動的に生成できますか?
Iain、2010

1
きっと可能ですが、任意のビットマップをピクセルごとにテストする方が簡単/高速かもしれません。
Tetrad 2010

QUADTREEで!! (それは永遠にかかりません)
bobobobo

3

細かい景色と高速で動く発射物がある場合、バイナリ検索は役に立ちません-見逃す可能性があります。

私はあなたの最良の選択肢は、一度にピクセルずつ、それが取るパスに沿って発射体の前面を横切る線を掃引することだと思います。最初にボリューム全体に対して境界チェックを実行して、すべてのステップを実行しないようにすることができます。


バイナリ検索とは何ですか?
Iain

1
申し訳ありません-バイナリ検索は多かれ少なかれ、あなたが質問で話していたものです。真ん中から始めて、回答に収束するまで検索スペースを2で割ります。これは多くの場合最適ですが、あなたの場合は機能しません(正解を完全にスキップする場合があります)。
JasonD 2010

3

ミサイルがフレームごとに大量のピクセルを移動する可能性は低いため(画面上では滑らかではありません)、パス上のすべてのピクセルをチェックしないだけの理由はわかりません。Bressenhamラインアルゴリズムはあなたの友人であり、一般的にすべてのピクセルのビデオメモリにアクセスしたくないので、ビットマップのローカルコピーも取得することを確認します。これは、ビットマップ地形が完全にランダムであることを前提としています(破壊可能なワームの地形に従って)。あなたの世界がタイルベースの場合、最初は空であることがわかっているすべてのタイルをスキップできますが、前述のように、大量のミサイルをチェックする必要がない限り、私はそれを必要とするプラットフォームが遅すぎて考えられませんでしたピクセル単位でテストするだけで、プリミティブで世界を定義する必要はありません(ワームのクローンがそれを難し​​くするでしょう)


ええ、私はワームのような地形を考えていました。タイルに動的に分割して、チェックされないように空のタイルをマークするだけですか?一度にたくさんのミサイルがあったら、多分それは少しスピードアップするでしょうか?
Iain

それで、私は後方にステップするのではなく、ピクセルごとに前方に移動して交差をチェックすると思いますか?
Iain 2010

3つすべての回答が前方検索を示唆していると思います。順方向のステップで一部のシーナリーをスキップする場合、逆方向のチェックは機能しません。
JasonD 2010

はい、間違いなく転送します。
Kaj 2010

1

他の回答に加えて、「既知の同様の状態」のブロックにピクセルの束を「収集」することに関して少しの簿記をしたい場合、これをスピードアップするためにできることがいくつかあります。たとえば、最も高いテレインピースの高さを保存できるので、ミサイルがその上にある限り何もヒットしないことは当然のことと考えることができます。最も低い "空気"空間の高さを格納することもできます。そのため、ミサイルがその高度に達した場合、ミサイルが何かに当たったに違いないことがわかります(ただし、これはサニティチェックとして最適に使用できます)。これよりさらに進んで、すべてが地形である領域を表す長方形と、すべてが空気である他の長方形を格納できますが、それは値よりも多くの作業になる可能性があります。

結局のところ、最善の方法は、おそらく「各地形列の高さを保存して」、パスの各ステップでミサイルの高さを計算することです。現代のゲームについては話せませんが、Scorched Earthで「洞窟」を作ったとき、その洞窟の上の地形はまっすぐに落ちて、突き出ていないと思います。オーバーハングが必要な場合、作業は少し大きくなりますが、これはこの基本的な考え方の延長になります。(ヒント:基本的なアイデアを最初に機能させてください!)

あなたの地形はおそらく完全に恣意的であるため、ショートカットはありません。地形をスプラインまたは何かに強制したとしても、それを破壊し始めるとそれは動揺し、ラインスプライン交差テストは反復的で完全ではないか、網羅的ではなく、問題の種類によっては無意味に遅くなります。

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