0

3D ピッキングを自分のプログラムに実装しようとしていますが、原点から移動しなければ完全に機能します。それは完全に正確です。しかし、モデル マトリックスを原点から遠ざけると (viewmatrix の目は 0,0,0 のまま)、ピッキング ベクトルは元の位置から描画されます。ビュー マトリックスの目 (0,0,0) から描画する必要がありますが、そうではありません。理由を見つけることができるかどうかを確認するための私のコードの一部を次に示します..

        Vector3d near = unProject(x, y, 0, mMVPMatrix, this.width, this.height);
        Vector3d far = unProject(x, y, 1, mMVPMatrix, this.width, this.height);
        Vector3d pickingRay = far.subtract(near);
        //pickingRay.z *= -1;
        Vector3d normal = new Vector3d(0,0,1);
        if (normal.dot(pickingRay) != 0 && pickingRay.z < 0)
        {
            float t = (-5f-normal.dot(mCamera.eye))/(normal.dot(pickingRay));
            pickingRay = mCamera.eye.add(pickingRay.scale(t));
            addObject(pickingRay.x, pickingRay.y, pickingRay.z+.5f, Shape.BOX);


        //a line for the picking vector for debugging
        PrimProperties a = new PrimProperties(); //new prim properties for size and center
        Prim result = null;
        result = new Line(a, mCamera.eye, far);//new line object for seeing look at vector
        result.createVertices();
        objects.add(result);
        }

public static Vector3d unProject(
        float winx, float winy, float winz,
        float[] resultantMatrix,
        float width, float height)
{
    winy = height-winy;
    float[] m = new float[16],
    in = new float[4],
    out = new float[4];
    Matrix.invertM(m, 0, resultantMatrix, 0);
    in[0] = (winx / width) * 2 - 1;
    in[1] = (winy / height) * 2 - 1;
    in[2] = 2 * winz - 1;
    in[3] = 1;
    Matrix.multiplyMV(out, 0, m, 0, in, 0);

    if (out[3]==0)
        return null;

    out[3] = 1/out[3];
    return new Vector3d(out[0] * out[3], out[1] * out[3], out[2] * out[3]);
}

Matrix.translateM(mModelMatrix, 0, this.diffX, this.diffY, 0); //i use this to move the model matrix based on pinch zooming stuff.

どんな助けでも大歓迎です!ありがとう。

4

1 に答える 1

0

どのアルゴリズムを実装したのだろうか。問題へのレイキャスティングアプローチですか?

コード自体にはあまり注目しませんでしたが、これは実装が単純すぎて、完全に機能するレイ キャスティング ソリューションにはなりません。

私の謙虚な経験では、最終プロジェクトの複雑さ (私にはわかりません) に応じて、カラー ピッキング ソリューションを採用することをお勧めします。

通常、このソリューションは最も柔軟で、実装が最も簡単です。

シーン内のオブジェクトを一意の単色 (通常はシェーダーでも照明を無効にします) でバックバッファー...テクスチャにレンダリングし、クリック (タッチ) の座標を取得して、その特定の座標のピクセルの色。

ピクセルの色と、レンダリングしたさまざまなオブジェクトの色のテーブルがあれば、ユーザーがクリックしたものを論理的な観点から理解することができます。

オブジェクト ピッキングの問題には他のアプローチもありますが、おそらくこれが最速のアプローチとして広く認識されています。

乾杯マウリツィオ

于 2012-06-27T13:39:47.257 に答える