OpenGL ES 2.0 を使用する Android アプリケーションを作成していますが、壁にぶつかりました。画面座標 (ユーザーが触れる場所) を世界座標に変換しようとしています。GLU.gluUnProject を読んで遊んでみましたが、間違っているか、理解していません。
これは私の試みです....
public void getWorldFromScreen(float x, float y) {
int viewport[] = { 0, 0, width , height};
float startY = ((float) (height) - y);
float[] near = { 0.0f, 0.0f, 0.0f, 0.0f };
float[] far = { 0.0f, 0.0f, 0.0f, 0.0f };
float[] mv = new float[16];
Matrix.multiplyMM(mv, 0, mViewMatrix, 0, mModelMatrix, 0);
GLU.gluUnProject(x, startY, 0, mv, 0, mProjectionMatrix, 0, viewport, 0, near, 0);
GLU.gluUnProject(x, startY, 1, mv, 0, mProjectionMatrix, 0, viewport, 0, far, 0);
float nearX = near[0] / near[3];
float nearY = near[1] / near[3];
float nearZ = near[2] / near[3];
float farX = far[0] / far[3];
float farY = far[1] / far[3];
float farZ = far[2] / far[3];
}
私が得ている数字は正しくないようです。これはこの方法を利用する正しい方法ですか? OpenGL ES 2.0 で動作しますか? これらの計算 (Matrix.setIdentityM(mModelMatix, 0)) の前に、モデル マトリックスを恒等マトリックスにする必要がありますか?
フォローアップとして、これが正しい場合、出力 Z をどのように選択すればよいですか? 基本的に、ワールド座標をどのくらいの距離に配置したいかは常にわかっていますが、GLU.gluUnProject の Z パラメータは、近平面と遠平面の間のある種の補間のように見えます。それは単なる線形補間ですか?
前もって感謝します