シーン (Android アプリ、OpenGL ES) を次のように設定します。
GLU.gluPerspective(gl, 60, viewRatio, 0.1f, 1000.0f);
// ...
GLU.gluLookAt(gl, cameraX, cameraY, cameraZ, cameraX, cameraY, cameraZ - 1f, 0f, 1f, 0f);
// Scene scaled down because object positions are in [-10000..10000] for x & y
gl.glScalef(0.001f, 0.001f, 1.0f);
シーンは適切にレンダリングされ、z=-10 の四角形と z=-30 の 1 つの巨大な背景四角形が含まれています。私は今、このようにレイピッキングを実装しようとしています (このスレッドから取得:
public float[] unproject(float rx, float ry, float rz) {
float[] xyzw = {0, 0, 0, 0};
int[] viewport = {0, 0, mDisplayWidth, mDisplayHeight};
android.opengl.GLU.gluUnProject(rx, ry, rz, mMatrixGrabber.mModelView, 0, mMatrixGrabber.mProjection, 0, viewport, 0, xyzw, 0);
xyzw[0] /= xyzw[3];
xyzw[1] /= xyzw[3];
xyzw[2] /= xyzw[3];
xyzw[3] = 1;
return xyzw;
}
画面へのタップは、次のようにテストされます。
unproject(tapX, mDisplayHeight - tapY, BACKGROUND_Z);
予想される動作: 返される X、Y 座標は、深さ = -30 (BACKGROUND_Z) でタップされた点に似ています。
実際の動作: 画面中央をタップすると、正しい X、Y 座標が返されます。しかし、画面の中心とタップされたポイントの間の距離は正しく解釈されません。何らかの要因で縮小されているようです。たとえば、画面の中央をタップすると [0,0] が表示され、画面の左端をタップすると ~[-3600,0] が表示されますが、代わりに [-1.13,0] が表示されます。以前にタッチしたポイントが画面の中央になるようにビューをパンすると、本来のように ~[-3600,0] になります。
これは、シーンを 0.001 ずつスケーリングしたことが原因でしょうか? さまざまな構成をテストしました(gluLookAtの前にスケーリングを移動するか、完全に削除します)が、問題は解決しません:(
画面左端でのタッチのサンプルデータ出力:
unproject() に渡されるタッチポイント:
x=3, y = 554 (0,0 at bottom left; w=720, h=1280)
射影行列:
[2.8482616, 0.0, 0.0, 0.0,
0.0, 1.7320509, 0.0, 0.0,
0.0, 0.0, -1.0001999, -1.0,
0.0, 0.0, -0.20001999, 0.0]
モデル マトリックス:
[0.0010, 0.0, 0.0, 0.0,
0.0, 0.0010, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 1.0, 1.0]
unproject() 出力:
[-1.1232367, -0.11801138, -1.0032262, 1.0]
ここで私の頭に浮かぶのは、返された z 値が間違っているように見えるということです。 unproject() に渡された z 値は -30 です (上記のとおり)。