2012-02-24 21 views
3

最初にポリゴンを定義するクラスを実装する方法と、このクラスを使用して2つのポリゴン間の衝突を検出する方法について、誰かが私に考えてもらえないかと思いました。私はC/C++でもNDKを使うことができますが、より具体的にはAndroid上のJavaで作業しています。私は多角形を定義すると思います。私はちょうど頂点の配列が必要でしょうか?ポリゴンによる衝突検出

私が衝突検出を行うとき、私はSeparation Axis TheoremとGJKアルゴリズムについて読みました。これは正しい方法ですか、これをあまりにも複雑にしていますか?正しい方向から始めようとするだけです。ありがとう!

+0

あなたは正しい軌道に乗っています。衝突が適切に機能するようにするには、実際には簡単なオプションはありません。 – Dervall

+0

私はこのサイトでSeparation Axis Theoremのかなりの説明を見つけました。http://www.codezealot.org/archives/55 –

+0

[this](http://www.metanetsoftware.com/technique/tutorialA.html)もまたとてもいいです。 Nを作った人からのチュートリアル –

答えて

5

あなたはこの種のことをかなり慣れているように聞こえますが、これはおそらくもっと大きな疑問です。

私はあなたが最初に解決しようとしている問題を定義し、その問題を解決する解決策を見つけることをお勧めします。

は、私はあなたにいくつかの予選質問をしてみましょう:

あなたは、2Dまたは3Dについて話していますか?

これは物理システム用ですか?

交差する場所や交差する場所を知る必要がありますか?

(交差点やユニオンなどを取得するなど)形状に対してブール演算を行う必要がありますか?

+0

私は2Dで作業しています。はい、これは物理ゲームのためのものです。私の目標は、世界のボールをすべての物体から跳ね返させることです。私は現在、四角形を持っていますが、それは動作しますが、あらかじめ定義された頂点を使用してポリゴンを作成できる画像をいくつか追加したかったのです。オブジェクトが衝突する場所に基づいて、私はボールをバウンスすることを望んでいました。 –

+0

物理学については、簡単に聞こえるが、実際には難しいと思われるものがいくつか必要です。 1)ポリゴンの接触方法(接触しているだけでなく)についての非常に正確な情報が必要です。これは難しいことが分かります。 2)複数の移動オブジェクト間の衝突を解決できる必要があります。これはまた難しいです。 あなたがしたいことが物理ライブラリーを作成し、あなたがゲームを書いているようなふりをするなら、 "Erin Catto"を調べます。彼はこれについてたくさんのものを書いている。ゲームを書く場合は、Box2D物理ライブラリ –

+0

の(無料の)実装を行ってください。私はBox2Dの使用を検討しましたが、Box2Dの学習に手動でこれを実装しようとするよりも時間がかかるかどうか疑問に思っています。ありがとう。 –

2

多角形の種類によって異なります。

ポリゴンが凸である場合、頂点の順序付きリストが1つを記述し、分離軸とGJKの両方が適用可能なアルゴリズムになります。

多角形が凹ではあるが単純な場合(つまり、エッジが交差しない場合)、頂点の順序付きリストではまだ十分ですが、分離軸またはGJKは適切ではありません。

ポリゴンが複雑な場合(つまり、エッジが交差する場合)、頂点リストと塗りつぶしルールが必要になります。ルールは、平面のどの部分がポリゴンの内側にあると考えられ、外側にあるかを決定しました。充填ルールの差は中央の5面の穴は、多角形の一部または単に穴であるか否かの違いはある

enter image description here

は、例えば、五角形のような多角形を想像します。

もっと複雑な種類のポリゴンは、単純な種類のポリゴンの複数のインスタンスに分解することができます。そのため、地面にフラグを立てて、凸面ポリゴンのみに興味があると宣言してくださいたとえば、GPUが行うことを正確に実行します。

2つのポリゴンが重なっているかどうかを単に衝突と定義していると仮定すると、分離軸の定理は非常に単純であり、確かに行く方法です。たくさんのポリゴンを持つシーンを作成しようとするならば、幅広い段階が必要なのかもしれません。残りの部分は依然として存在する。

明らかな例は、ビンのソートです。スクリーンを16ピクセルの縦のストリップに分割し、次に各ポリゴンに対して(i)どのビンが接触するかを判断することができます。 (ii)それらのビンに既に入っているすべてのポリゴンに対してそれをテストする。 (iii)ビンに追加する。それはおそらく、あなたがテストをかなり多くの時間適用することを決して考えないことを意味します。その特定のスキームには、シーンに応じていくつかの明らかな問題がありますが、よりスマートなアルゴリズムが存在します。

+0

これは素晴らしい説明です、ありがとうございます!私はBox2Dが私が行かなければならないルートかもしれないと思っています。私は実際にこれを実装することに興味がありますが、完全な物理ライブラリを使用するのはずっと簡単であり、より有用かもしれません。私は本当にあなたの答えに感謝します。 –

+0

それはおそらく悪い考えではありません。私は何年もこのようなことをしてきましたが、いくつかのコードを簡単に見てみると、私は約1,500行の厳しい制約を持つ剛体の凸ボディと、完全に別々の - 同じですが、あなたがBox2Dのすべてのものを投げ込みたいのであれば(それは私の1,500作品のうちの多くのものです)、それを効率的にするためにはそれ以上のことをしなければならず、それ。それは本当に面白いところです。 – Tommy