0

私のゲームでは、プレイヤーが触れている場所を見つける必要があります。MotionEvent.getX() と MotionEvent.getY() はウィンドウ座標を返します。そこで、この関数を作成して、ウィンドウ座標を OpenGL 座標に変換することをテストしました。

public void ConvertCoordinates(GL10 gl) {
        float location[] = new float[4];

        final MatrixGrabber mg = new MatrixGrabber(); //From the SpriteText demo in the samples.
        mg.getCurrentProjection(gl);
        mg.getCurrentModelView(gl);

        int viewport[] = {0,0,WinWidth,WinHeight};

        GLU.gluUnProject((float) WinWidth/2, (float) WinHeight/2, (float) 0, mg.mModelView, 0, mg.mProjection, 0, viewport, 0, location,0);
        Log.d("Location",location[1]+", "+location[2]+", "+location[3]+"");
    }

X と y は、ほぼ -33 からほぼ +33 まで振動しました。Z は通常 10 です。MatrixGrabber を間違って使用したのでしょうか。

4

2 に答える 2

1

私がこれに入る最も簡単な方法は、画面上のクリックを、カメラの位置から始まり無限に続く光線として想像することでした

その光線を取得するには、少なくとも 2 つの Z 位置 (ビュー座標内) でワールド座標を要求する必要がありました。

レイを見つけるための私の方法は次のとおりです(同じAndroidデモアプリから取得したと思います)。私のアプリでは問題なく動作します:

public void Select(float x, float y) {
    MatrixGrabber mg = new MatrixGrabber();
    int viewport[] = { 0, 0, _renderer.width, _renderer.height };

    _renderer.gl.glMatrixMode(GL10.GL_MODELVIEW);
    _renderer.gl.glLoadIdentity();
    // We need to apply our camera transformations before getting the ray coords 
    // (ModelView matrix should only contain camera transformations)
    mEngine.mCamera.SetView(_renderer.gl);

    mg.getCurrentProjection(_renderer.gl);
    mg.getCurrentModelView(_renderer.gl);

    float realY = ((float) (_renderer.height) - y);
    float nearCoords[] = { 0.0f, 0.0f, 0.0f };
    float farCoords[] = { 0.0f, 0.0f, 0.0f };
    gluUnProject(x, realY, 0.0f, mg.mModelView, 0, mg.mProjection, 0,
            viewport, 0, nearCoords, 0);
    gluUnProject(x, realY, 1.0f, mg.mModelView, 0, mg.mProjection, 0,
            viewport, 0, farCoords, 0);

    mEngine.RespondToClickRay(nearCoords, farCoords);
}

OGL10 AFAIK では、Z バッファーにアクセスできないため、画面の x、y 座標で最も近いオブジェクトの Z を見つけることができません。レイが最初にヒットしたオブジェクトを自分で計算する必要があります。

于 2011-04-29T07:21:26.010 に答える
1

エラーは、出力配列のサイズに起因します。上記のコードのように長さ 3 ではなく、長さ 4 が必要です。

于 2011-09-14T19:39:46.867 に答える