2

オブジェクトがクリックされたかどうかを判断するために、OpenGL ES 2.0 でレイピッキングを実装しようとしています。これまでのところ、特定の三角形が押されているかどうかを確認しようとしています。このサイトを動機として使用していますhttp://android-raypick.blogspot.ca/2012/04/first-i-want-to-state-this-is-my-first.html

これは私がこれまでに持っているものです:

public void onClick(float x, float y)
{
    float[] temp = new float[4];
    float[] temp2 = new float[4];
    System.out.println("X coordinate: " + x);
    System.out.println("Y coordinate: " + y);
    float[] pos = new float[4];

    y = (float) viewport[3] - y;

    int res = GLU.gluUnProject(x, y, 1.0f, 
            mMVPMatrix, 0,
            mProjectionMatrix, 0,
            viewport, 0, 
            temp, 0);

    Matrix.multiplyMV(temp2, 0, mMVPMatrix, 0, temp, 0);
    float[] nearCoOrds = new float[3];

    if(res == GLES20.GL_TRUE)
    {
        nearCoOrds[0] = temp2[0] / temp2[3];
        nearCoOrds[1] = temp2[1] / temp2[3];
        nearCoOrds[2] = temp2[2] / temp2[3];
        System.out.println("Near0: " + nearCoOrds[0]);
        System.out.println("Near1: " + nearCoOrds[1]);
        System.out.println("Near2: " + nearCoOrds[2]);
    }

    res = GLU.gluUnProject(x, y, 0,
            mMVPMatrix, 0,
            mProjectionMatrix, 0,
            viewport, 0,
            temp, 0);

    Matrix.multiplyMV(temp2,0,mMVPMatrix, 0, temp, 0);
    float[] farCoOrds = new float[3];

    if(res == GLES20.GL_TRUE)
    {
        farCoOrds[0] = temp2[0] / temp2[3];
        farCoOrds[1] = temp2[1] / temp2[3];
        farCoOrds[2] = temp2[2] / temp2[3];
        System.out.println("Far0: " + farCoOrds[0]);
        System.out.println("Far1: " + farCoOrds[1]);
        System.out.println("Far2: " + farCoOrds[2]);
    }

    float[] coords = new float[3];

    coords[0] = farCoOrds[0]-nearCoOrds[0];
    coords[1] = farCoOrds[1]-nearCoOrds[1];
    coords[2] = farCoOrds[2]-nearCoOrds[2];

    System.out.println("REAL COORDS 0: " + coords[0]);
    System.out.println("REAL COORDS 1: " + coords[1]);
    System.out.println("REAL COORDS 2: " + coords[2]);

}

とfloat はxy指が画面を押した場所の x 座標と y 座標です。関数onClickは から呼び出されますMainActivity

 GLU.gluUnProject(x, y, 1.0f, 
            mMVPMatrix, 0,
            mProjectionMatrix, 0,
            viewport, 0, 
            temp, 0);

mMVPMatrixモデルビュー マトリックスです。mProjectionMatrixは射影行列でviewport、値は {0,0,screenhwidth,screenheight} です。

私が得る出力の例は次のとおりです(画面の中央付近に触れました):

REAL COORDS 0: -0.21542415
REAL COORDS 1: 0.31117013
REAL COORDS 2: 9.000003

私の質問/トピックは、ここで正しい軌道に乗っているかどうかわからないということですか? 私は正しい考えを得ましたか、それとも何かを誤解しているように見えますか? または、三角形でタッチ検出を実現できる他の方法はありますか?

助けや指導をありがとう!

4

2 に答える 2

1

Rajawaliと呼ばれる Android 用の優れた OpenGL フレームワークがあります。オブジェクトのピッキングをサポートしています。サンプル コードは非常にシンプルに見えます。ぜひ試してみてください。

于 2013-01-12T19:33:27.873 に答える
0

あなたの多くは少し誤解していると思います(または私が誤解しているかもしれません^^)。近座標と遠座標を使用して光線セグメントを構築し、ポリゴン/ヒットボックスに対してテストします。セグメントはワールド空間と呼ばれるものにあり、頂点/モデルに対してテストするには、それらをモデル空間(ロードされたときにあるもの)からワールド空間に変換する必要があります。それらを mModelView マトリックスで乗算します(すべての変換を持ち、その中の回転など)。あなたがリンクしたその記事は、その点を説明しているようです^^ 意味がわかりましたか、それとも何か見逃しましたか?

ボーナス リンク: http://www.siggraph.org/education/materials/HyperGraph/raytrace/rtinter0.htm

于 2013-01-15T10:47:13.750 に答える