2012-02-29 9 views
0

私の質問はから来ていますなぜ OpenGLおよび/またはAndroidは単に現在の行列をつかんでフロートとして格納する方法がありません[]。私が見つけたすべての研究は、Open GLマトリックスの現在の状態を取得できるように、MatrixGrabberと呼ばれる私のプロジェクトをダウンロードして入れなければならないようなこれらのクラスを使用することを示唆しています。OpenGL ES 2.0で画面座標の3D座標を決定する簡単な方法がない理由Android

私は、Open GLの世界の場所が、イベントでX座標とY座標を取得できる画面に触れることによって引き起こされるイベントを特定します。

最高の回避策私は見つけましたAndroid OpenGL 3D pickingです。あなたは、単にあなたが欲しい行列をレトリーバーしてからちょうど呼び出すことができる方法はありませんなぜ私が疑問に思う

GLU.gluUnProject(...); 
私の質問は、OpenGLおよび/またはAndroidは単につかむための方法を持っていない理由から来て

答えて

4

現在の行列をfloat []として格納します。

のOpenGL ES 2.0(コアデスクトップGL 3.1以上)は、必ずしも持っていないので "現在の行列" をすべての変換はシェーダーロジックを介して行われるため、行列は関与する必要はありません。そこに何かをしている可能性があります。

現在のマトリックスがないため、何も得られません。そして、プロジェクトを解くことはありません。

0

ES 1では現在の行列を取得することができ、pnameGL_MODELVIEW_MATRIXGL_PROJECTION_MATRIX又はGL_TEXTURE_MATRIXとして適用可能で、glGetFloatvを用いてフロートとして保存します。

GLUは本質的にOpenGL ESの一部ではありません。なぜなら、ESは最小限の仕様であり、GLUはオプションの余分なものであるからです。しかし、あなたはSGI's reference implementation of GLUをつかんで、そのgluUnProjectをかなり簡単に使うことができます。

EDIT:考えを打ち消すために、NicolはES 2の現在の行列と同じものはないと指摘しています。あなたは、任意の目的のために任意に多くの行列をシェーダに供給します。あなたはGLにそれらを再び戻すように頼む必要はありません。

0

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixGrabber.htmlちょうどあなたが参照しているMatrixGrabberのように見えますが、特に複雑には見えません。実際、それはオーバービルドされています。 gl2.getMatrixを直接使用してgluUnProjectにプラグインすることができます。

MatrixGrabberコードを設計する理由は、GPUがCPUに非同期に実行されるためにコードがgetMatrixの応答を待たなければならないため、複数の用途の値をキャッシュすることにあります。できるだけそれを取得し、データを再利用してください。

一般的な問題の複雑さのもう1つの原因は、touchが2個のディメンションのみを指定することです。ワンタッチでは深さが示されないため、アプリケーション固有の方法で行う必要があります。明白なapproacjは深度バッファを読み込むことです(OpenGL実装ではそれをサポートしていません)が、例えばタッチに "透過的"なものがあればうまくいかないでしょう。別の方法として、(2つの異なる深度で2回投影を外すなどして)レイを作成してから、シーンにレイキャスティングすることができます。

関連する問題