簡體   English   中英

模型矩陣轉換后的3D選擇OpenGL ES 2.0

[英]3D Picking OpenGL ES 2.0 after model matrix translation

嘿,我正在嘗試在程序中實現3D拾取,如果我不從原點移動,它會完美地工作。 這是完全准確的。 但是,如果我將模型矩陣移離原點(視矩陣眼仍在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.

任何幫助將不勝感激! 謝謝。

我想知道您實現了哪種算法。 這是射線投射的方法嗎?

我並沒有太在意代碼本身,但是這看起來太簡單了,無法實現完全可操作的光線投射解決方案。

以我不起眼的經驗,我建議您根據最終項目的復雜性(我不知道),建議您采用顏色選擇解決方案。

該解決方案通常是最靈活,最容易實現的。

它包括將場景中的對象以唯一的平面顏色(通常在着色器中也禁用照明)渲染到后緩沖區...紋理,然后獲取單擊(觸摸)的坐標並讀取該特定坐標中像素的顏色。

有了像素的顏色以及所渲染的不同對象的顏色的表格,就可以從邏輯的角度了解用戶單擊的內容。

還有其他方法可以解決對象拾取問題,這可能是公認的最快方法。

干杯毛里齊奧

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM