2Dビットマップ地形の傾斜を見つけることに関する私の以前の質問に続いて、ミサイルが命中した2D地形上の点を見つける最良の方法を知る必要があります。明らかに、ミサイルの下のピクセルが地形と交差するかどうかはわかりますが、地形のかなり奥に移動したと言えます。
最初に衝突した場所を見つけるために後退する最良の方法は何ですか?一度にXピクセル前にミサイルの前の位置に移動できますが、Xの適切な値はどれですか。そしてもっと賢い方法はありますか?たぶん半分の距離を移動し、次にクォーターなどを移動しますか?
2Dビットマップ地形の傾斜を見つけることに関する私の以前の質問に続いて、ミサイルが命中した2D地形上の点を見つける最良の方法を知る必要があります。明らかに、ミサイルの下のピクセルが地形と交差するかどうかはわかりますが、地形のかなり奥に移動したと言えます。
最初に衝突した場所を見つけるために後退する最良の方法は何ですか?一度にXピクセル前にミサイルの前の位置に移動できますが、Xの適切な値はどれですか。そしてもっと賢い方法はありますか?たぶん半分の距離を移動し、次にクォーターなどを移動しますか?
回答:
衝突テストの場合、ティックごとの静的テストを行うべきではなく、トレース/スイープテストを行う必要があります。
さまざまな種類のプリミティブのさまざまな式の完全なリストがここにあります:http : //www.realtimerendering.com/intersections.html
つまり、もちろん、地形をテストできるプリミティブのある種類のセット(つまり、ラインセグメント)に分解できると仮定します。それにはさまざまな方法があります。
この質問も参照してください(わずかに関連しています):移動する球間の衝突を検出するための優れたアルゴリズムは何ですか?
細かい景色と高速で動く発射物がある場合、バイナリ検索は役に立ちません-見逃す可能性があります。
私はあなたの最良の選択肢は、一度にピクセルずつ、それが取るパスに沿って発射体の前面を横切る線を掃引することだと思います。最初にボリューム全体に対して境界チェックを実行して、すべてのステップを実行しないようにすることができます。
ミサイルがフレームごとに大量のピクセルを移動する可能性は低いため(画面上では滑らかではありません)、パス上のすべてのピクセルをチェックしないだけの理由はわかりません。Bressenhamラインアルゴリズムはあなたの友人であり、一般的にすべてのピクセルのビデオメモリにアクセスしたくないので、ビットマップのローカルコピーも取得することを確認します。これは、ビットマップ地形が完全にランダムであることを前提としています(破壊可能なワームの地形に従って)。あなたの世界がタイルベースの場合、最初は空であることがわかっているすべてのタイルをスキップできますが、前述のように、大量のミサイルをチェックする必要がない限り、私はそれを必要とするプラットフォームが遅すぎて考えられませんでしたピクセル単位でテストするだけで、プリミティブで世界を定義する必要はありません(ワームのクローンがそれを難しくするでしょう)
他の回答に加えて、「既知の同様の状態」のブロックにピクセルの束を「収集」することに関して少しの簿記をしたい場合、これをスピードアップするためにできることがいくつかあります。たとえば、最も高いテレインピースの高さを保存できるので、ミサイルがその上にある限り何もヒットしないことは当然のことと考えることができます。最も低い "空気"空間の高さを格納することもできます。そのため、ミサイルがその高度に達した場合、ミサイルが何かに当たったに違いないことがわかります(ただし、これはサニティチェックとして最適に使用できます)。これよりさらに進んで、すべてが地形である領域を表す長方形と、すべてが空気である他の長方形を格納できますが、それは値よりも多くの作業になる可能性があります。
結局のところ、最善の方法は、おそらく「各地形列の高さを保存して」、パスの各ステップでミサイルの高さを計算することです。現代のゲームについては話せませんが、Scorched Earthで「洞窟」を作ったとき、その洞窟の上の地形はまっすぐに落ちて、突き出ていないと思います。オーバーハングが必要な場合、作業は少し大きくなりますが、これはこの基本的な考え方の延長になります。(ヒント:基本的なアイデアを最初に機能させてください!)
あなたの地形はおそらく完全に恣意的であるため、ショートカットはありません。地形をスプラインまたは何かに強制したとしても、それを破壊し始めるとそれは動揺し、ラインスプライン交差テストは反復的で完全ではないか、網羅的ではなく、問題の種類によっては無意味に遅くなります。