2012-02-16 14 views
2

こんにちは私はiOS上でいくつかの作業をしており、作業にはOpenGLの使用が必要です。だから、私は画面上に四角形、立方体、三角形の束を持っています。これらのジオメトリの一部は重複する可能性があります。タッチ検出のためのアイデアやアプローチは?Open GL - ES 2.0:タッチ検出

よろしくお願いいたします。

+1

あなたは本当にあなたの受け入れ率を改善すべきです(現在は0%を示しています)。 – Till

答えて

1

すでに与えられた答えをフォローアップするには、四角形、三角形は凸形状であるため、完璧なオブジェクトの数学的記述ではなく、ジオメトリから直接でも簡単にレイオブジェクトの交差を実行できます。

平面からの距離と平面との光線の交差点を計算できる必要があります。簡単なテストとして、非常に素早く自分自身を実装することができます。凸型の各ポリゴンは、光線と平面の交差点を処理するためです。次に、そのポイントが、テストしたばかりのエッジとエッジを共有するポリゴンで定義されたすべてのプレーンの背後にあるかどうかを確認します。そうであれば、ヒットはオブジェクトの表面上にあります - コプレーナに隣接するポリゴンと丸め誤差には注意が必要です。

衝突が見つかったら、光線の長さを衝突のポイントまで簡単に取得できます。最短距離の物体は正面の物体です。

それが十分に速いなら、おそらく世界を分割したり、オブジェクトをシルエットに分解したりしたいと思うでしょう。凸オブジェクトは本当に単純です - 1つのポリゴンと次のポリゴンの間で実行されるすべてのエッジを考慮してください。それらのポリゴンのうちの1つのみが前面に向いている場合、エッジはシルエットの一部です。すべてのシルエットエッジは、ビュー平面上の凸2d形状に投影することができます。そこから2次元のポイントインポリゴンを実行することでタッチをテストできます。

さらに多くの計算を削除する一般的な方法は、ピッキングです。シーンを不可視バッファにレンダリングし、各オブジェクトは適切な一意の色でソリッドなブロブとして表示されます。タッチをテストするには、glReadPixelsを実行して色を検査します。

iPhoneのgluの目的で、SGI's implementation(MESAが使用)を取得できます。私は以前、船積み、生産プロジェクトでテッセラーを使用しました。

+0

こんにちは、トミーは私の質問に答えてくれてありがとう。昨日私は、光線交差法を使って自分のシーンでタッチ検出を実装しました。しかし、私のシーンのオブジェクトが回転を開始する場合、私は数学に追いつくことができません。私はピッキングのアプローチを見ています。私の最初の質問は、私のシーンを隠しバッファにレンダリングする方法です。 – Abhi

+0

最も簡単なアプローチ - 少なくともダブルバッファリングされていると仮定して、普通のフレームバッファを通常のフレームバッファにしてから、 'glReadPixels'次に素早く 'glClear'を呼び出し、通常の方法でシーンを描画します。実際にユーザーに見せたいバージョンが描画され、特別に色付きのバージョンが見えなくなるまで、バッファーを反転しないでください。または、デバッグ中に、通常の描画を無効にして、それぞれが単一の色で、ユニークな色のオブジェクトを素早く視覚的に確実に取得できるようにします。 – Tommy

+0

私は、シーンのレンダリングとレンダリングの基本的なアプローチに従っていましたが、これは非常に明確なフラッシュを生成しました...私はシーンを描画するときにpresentRenderBufferの呼び出しを発行しないことでフラッシュの問題を解決しましたタッチ検出。タッチ検出が正しく機能するようになりました。次の課題は、頂点配列を使用することです – Abhi

1

私は過去にこの問題を抱えていました。私が使用しているのは、googleで見つけることができるglu unprojectの実装です(モデルビュー投影行列の逆数とビューポートのサイズを使用します)。これにより、2Dスクリーン座標を3Dベクトルにマップしてワールドにすることができます。そして、このベクトルを使ってあなたのオブジェクトと交差し、どのベクトルが交差するかを知ることができます。

私はこれを行うより良い方法があることを願っていますので、私は他の答えも楽しみにしています!

+0

私はあなたの答えを正しく理解していないと思います。私が知っている限り、glu関数はopen glで利用できません – Abhi

+0

glu関数は利用できませんが、独自のMVP行列を維持している限り、unprojectの実装を見つけることができます。ここに例があります:http://www.codng.com/2011/02/gluunproject-for-iphoneios.html他にもあると確信しています。 – vmpstr

+0

実際に私はGoogleに取りかかり、unprojectを使う方法を思いつきました....私は2つのベクトルを得るためにunproject関数を使いました。私はそこからレイを作成しました..しかし、今私が持っている質問はどうですか私はこの光線が私の行列のいずれかに興味があるかどうかテストします。 – Abhi

0

逆モデルビューを取得してレイ(ベクトル)をキャストしたら、レイがジオメトリと交差するかどうかを知る必要があります。 1つのアプローチは、オブジェクトの中心の深度(視点座標系のz)を取得し、それまでのベクトルを拡張(ストレッチ)することです。次に、ベクトルの「頭」がオブジェクトのボリューム内で終わっているかどうかを確認します(オブジェクトの中心が必要です。球の場合はその半径などが必要です)

関連する問題