2

私はAndroidゲームアプリを作成しており、openGLを使用して3Dobjモデルをアプリにロードしています。これらのオブジェクトをインタラクティブにする方法について誰かが私を助けてくれるかどうか知りたいです。私が本当に必要としているのは、オブジェクトをクリック可能にすることだけですが、画面上でオブジェクトをドラッグするなど、もっと学ぶのはクールでしょう。

助けてくれてありがとう。

4

1 に答える 1

1

あなたが欲しいものはピッキングと呼ばれます。

これは簡単な作業ではありません。正確に実行したい場合は、複数のオプションがあります。

問題: 2D 座標 (マウス/タッチ位置) に基づいて 3D 空間でオブジェクトを選択したい。2D マウス座標が原因で、3D 空間での正確なクリック位置を決定するための 1 つの座標が失われます。

1 つの可能なオプションは次のとおりです。

  • オブジェクトを特定の色 (例: 完全な赤) でレンダリングします。
  • その後、現在の表示バッファを変数に保存します
  • 表示バッファをクリアし、標準設定でモデルを再度レンダリングします (これがユーザーに表示される画面です)
  • クリック/タッチ位置を決定し、それを表示領域の座標に変換します
  • 保存された表示バッファでこの座標の色を確認してください。この位置の色が赤の場合、ユーザーはオブジェクトをクリックまたはタッチしました

このアプローチはそれほど柔軟ではありませんが、実装は他のソリューションに比べて非常に簡単です。使用者が特定のオブジェクトをクリック/タッチしたかどうかしか検出できず、オブジェクトの正確な位置を特定できないため、制限があります。

別の可能なオプションは、2D クリック位置に基づいて 3D ワールドで光線を計算し、次にこの光線と衝突する 3D 空間内のすべてのオブジェクトを決定することです。これはレイピッキングと呼ばれます。レイ ピッキングの OpenGl チュートリアルはこちら

この例ではglRenderMode, glLoadName, etc.、固定関数パイプラインを使用していない場合 (たとえば、カスタム シェーダーを使用している場合など)、これが最適な選択ではない可能性があります。

別のオプションは、クリック位置、ビューポート、および投影行列に基づいて、計算を行い、光線ベクトルを自分で計算することです。これを行いたい場合は、gluUnprojectのドキュメントが役に立ちます。

于 2012-07-06T18:38:22.330 に答える