2Dのピクセル単位の衝突検出で影響ポイントを見つけるにはどうすればよいですか?


7

私はプラットフォーマーを作成しており、ピクセルごとの衝突検出を実装しています。しかし、これは私がまだ理解していない2つの障害を引き起こしています。この質問に関する最初の障害は、影響のポイントを効率的に見つける方法がわからないことです(他の問題はおそらくこのStackExchangeの別の質問になるでしょう)。

ピクセルで指定されたレートでキャラクターを転倒またはジャンプさせます。つまり、たとえば、フレームごとに文字が4ピクセル落ちたり、ジャンプしたりする可能性があります。キャラクターが落下してオブジェクトと交差する場合、キャラクターはそのオブジェクトに着地する必要があります(ジャンプしてオブジェクトにヒットする場合は、その逆も同様です)。ただし、たとえば、キャラクターが4ピクセル落ちて、オブジェクトに3ピクセル入ると、落ちるのは止まりますが、適切な場所に配置されません。キャラクターはインパクトの最初のピクセルで止まるように見えるはずです。

では、どうすれば効果的なポイントを効率的に見つけることができますか?私は、輪郭のピクセルを比較し、衝突をテストし、衝突があるまでそれらを1つずつ増減するという漠然とした考えしか持っていませんが、引き離すのは複雑に思えるかもしれません。

プラットフォームについて知りたい場合は、XNA for Windows Phone 7を使用して開発しています。


3
(回答の点で)関連、予想デュープ:gamedev.stackexchange.com/questions/2942/...
テトラッド

@Tetrad、ありがとう。私はミサイルと地形の衝突についての質問を検索するには考えていなかった理由を理解することを願って:Pは、それは私が開発していますかなりのゲームではありません
ボブ・

Box2Dの物理を検討しましたか?
user712092

トンネリングと呼ばれる問題が発生する可能性があります。
user712092

まだの場合は、検索クエリに「スイープ」を追加します。動的衝突検出アルゴリズムは、スイープパラメータを使用して最も早い衝突ポイントを取得することがよくあります。
sam hocevar

回答:


5

その前に、以前のSonicゲームで衝突検出がどのように実装されたかを説明した本当に良い記事を読んだことがあります。

その記事はこのスレッドの優れたリファレンスでしたが、現時点ではそれを見つけることができないようです。もしそうなら、私の投稿を更新します。その間、私はそれを記憶から取り除こうとします!

この手法は非常に興味深いものであり、物理エンジンに変更したり、ピクセルごとの衝突を完全に手放したりせずに、問題を解決できると思います。

基本的にこの記事で説明したのは、タイルベースのプラットフォーマーエンジンで、各タイルタイプには次のようなピクセルごとの衝突データが含まれています。

タイル

しかし、あなたのキャラクターは限られた接点しか持っていませんでした。たとえば、記事の中で、ジャンプ時に衝突検出に使用される、sonicの頭の近くに3ピクセル(スプライトの左側、中央に1つ、右側に1つ)しかないことを覚えています。床との衝突を検出し、壁の衝突を検出するために両側の中央付近に2つあります。

覚えていることを簡単にモックアップします。次のようなもの(ピクセル配置の精度に依存せず、作成しただけです):

ソニック

この方法では、これらの個々のポイント(ジャンプや落下などの状況に依存する)を使用して衝突を確認するだけでよく、衝突の場合は、それらのポイントに基づいてスプライトを調整するだけで済みます。たとえば、上部のポイントの1つが天井タイルのブロックされたピクセルと衝突した場合、そのスポットが衝突しなくなるまでスプライトを下げるだけで済みます。

編集する

これはまだ私が最初に読んだリンクではありませんが、衝突点(センサーと呼ばれる)についても言及しており、大量の情報を提供するはずです。ガイドの他のセクションも読んでください!

http://info.sonicretro.org/SPG:Solid_Tiles


そのため、8歳のように若い頃を思い出し、マルチメディアフュージョンでゲームを作ります。私たちは、これらの「センサー」を、キャラクターの下および上下のバーとして使用していました。そしてそれはすべてを非常にうまく管理しました!
Gustavo Maciel 2012年

2

まず第一に、明らかなパフォーマンス上の理由から、モバイル2Dプラットフォームゲームでピクセル完全な衝突検出を行うことはしません。これらの種類のチェックはCPUを集中的に使用するため、分離されたオブジェクトをフィルタリングするために広範なチェックを実行しない限り、ゲームに確実に悪影響を及ぼします。

バウンディングボックスや球体を使用します(エンティティの形状によって異なります)。検出品質は十分良いでしょう。複数の形状を使用してエンティティをモデル化することもできます。これらの形状間のテストは簡単で、影響のポイントを確認してエンティティの位置を修正できます。

ただし、すべてを自分で実装したくない場合は、Box2DXBox2Dの C#ポート)を使用して、ライブラリの衝突検出部分のみを使用することをお勧めします。


Box2Dへのリンクをありがとう、それを調べます。パフォーマンスに関しては、私のスプライトは非常に小さく、「古い学校」ですが、テストするピクセルが多すぎないように拡大されています。また、最初に境界の四角形をチェックし、境界が交差する場合のみピクセルごとに実行します。ピクセルごとに行っているのは、ピクセルが非常に大きい(拡大されている)ため、適切に相互作用しない場合に見えなくなるからです。
Bob
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.