1

3Dピッキングのために、私はこれを行う予定でした:

・タッチ座標(x,y)を取得

-モデルの頂点バッファーから頂点を選択します (xM、yM、zM)。

-次に、自分の手で (xM、yM、zM) をスクリーン座標に投影します。

(xM, yM, zM) ---> (xP, yP, ...)

次に、一致を確認します (たとえば、sqrt((x - xP)^2 + (y - yP)^2) < SOME_EPS)

投影のために、錐台マトリックスをmProjectionMatrixに保存しました。

gl.glFrustumf(-ratio / q, ratio / q, -1 / q, 1 / q, 1, 25);
Matrix.frustumM(mProjectionMatrix, 0, -ratio / q, ratio / q, -1 / q, 1 / q, 1, 25);

mAccRotationに保存された変換座標:

gl.glLoadMatrixf(mAccRotation, 0);

したがって、テスト関数は次のようになりました: (TESTIFY_VERT は私のモデルの 1 つです)

public void touch(float x, float y){

    float TESTIFY_VERT[] = {0.0f, 0.0f, -1.5f, 1.0f}; //first vert in L0
    float Resulted[] = new float[4];
    float rMatrix[] = new float[16];

    Matrix.multiplyMM(rMatrix, 0, mProjectionMatrix, 0, mAccRotation, 0);
    Matrix.multiplyMV(Resulted, 0, rMatrix, 0, TESTIFY_VERT, 0);
}

Resulted[0], Resulted[1]を (xP, yP) として使ってみた

(Resulted[0] + 1) * ( WIDTH / 2.0f ), (-Resulted[1] + 1) * ( HEIGHT / 2.0f )を使用しようとしました

そして、これは機能しません。なんで?アドバイスいただけますか?

PS 私はそのような質問をすべて見てきましたが、私の問題に答えていません。

4

1 に答える 1

2

パースペクティブの分割が欠けている可能性があります。Resulted [0]Resulted[1]Resulted[3]で割り、比率を(xP, yP)として使用します。

float xP = Resulted[0] / Resulted[3];
float yP = Resulted[1] / Resulted[3];
于 2016-11-07T22:22:22.080 に答える