1

シーン (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 です (上記のとおり)。

4

1 に答える 1

5

見てみましょう-あなたが得た値を再現できませんでしたが、これは問題ではないと思います.

unproject内にない z 値で呼び出すことはできません[-1;+1]。最初にunproject行う必要があるのは、ウィンドウ変換を逆にすることです。その後、座標は NDC 空間にある必要があります。OpenGL では、これは立方体です[-1;+1]^3( songhoには素敵なグラフィックが含まれています)。unprojectwithの呼び出し-30は、ポイントがニア プレーンの前にある必要があることを意味します。で呼び出すとz=-1.0f、ニア プレーンとz=+1.0fファー プレーンの結果が得られます。

zすべての行列反転の後に stを選択する方法、z=-30保持 - わかりません。

于 2012-03-29T18:38:10.903 に答える