Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 模型矩阵转换后的三维拾取OpenGL ES 2.0_Java_Android_Opengl Es 2.0 - Fatal编程技术网

Java 模型矩阵转换后的三维拾取OpenGL ES 2.0

Java 模型矩阵转换后的三维拾取OpenGL ES 2.0,java,android,opengl-es-2.0,Java,Android,Opengl Es 2.0,嘿,我正在尝试在我的程序中实现3D拾取,如果我不从原点移动,它将非常有效。这是非常准确的。但是,如果我将模型矩阵从原点移开,viewmatrix眼睛仍处于0,0,0,拾取向量仍从原始位置绘制。它应该仍然是从视图矩阵eye 0,0,0绘制的,但不是。下面是我的一些代码,看看你是否能找到原因 Vector3d near = unProject(x, y, 0, mMVPMatrix, this.width, this.height); Vector3d far = u

嘿,我正在尝试在我的程序中实现3D拾取,如果我不从原点移动,它将非常有效。这是非常准确的。但是,如果我将模型矩阵从原点移开,viewmatrix眼睛仍处于0,0,0,拾取向量仍从原始位置绘制。它应该仍然是从视图矩阵eye 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.

任何帮助都将不胜感激!谢谢。

我想知道你实现了哪种算法。这是解决问题的光线投射方法吗

我没有太多地关注代码本身,但这看起来是一种过于简单的实现方式,无法成为一个完全可操作的光线投射解决方案

以我微薄的经验,我想建议你,根据你的最终项目的复杂性(我不知道),采用颜色选择解决方案

这种解决方案通常是最灵活和最容易实现的

它包括使用独特的平面颜色渲染场景中的对象。通常情况下,禁用着色器中的照明,使其成为后缓冲…纹理,然后获取单击触摸的坐标,并读取该特定坐标中像素的颜色

拥有像素的颜色和渲染的不同对象的颜色表,可以让您从逻辑角度理解用户单击的内容

还有其他方法可以解决对象拾取问题,这可能是公认的最快的方法

干杯
毛里齐奥

我真的弄明白了。它只是投射光线并检查与设定平面的交点。我后来实现了检查对象的中心离射线有多近,如果足够近,它会选择该对象。谢谢你。