使用gluUnProject将触摸映射到Android OpenGL ES 2.0中z = 0平面上的x,y线

时间:2013-12-19 23:34:52

标签: android opengl-es touch opengl-es-2.0 raytracing

我在OpenGL 2.0 ES中绘制了z = 0的网格,只想将触摸输入转换为该平面上的x / y坐标。看起来最好通过光线跟踪完成,包括在0和1上运行gluUnProject,然后创建一条光线,为z = 0解决该光线?

我找到了这段代码,但它是OpenGL ES 1.0:i-schuetz / Android_OpenGL_Picking

Screenshot of app running so you can see camera distortion.

My code on Github, only 4 files。我正在尝试编写的unproject函数在MyGLRenderer.java中:

    public float[] unproject(float rx, float ry) {
            float rz = 1;
        float[] xyzw = {0, 0, 0, 0};
        int[] viewport = {0, 0, mDisplayWidth, mDisplayHeight};
        android.opengl.GLU.gluUnProject(
                        rx, ry, rz, // window coordinates
                        mViewMatrix, 0,
                        mProjectionMatrix, 0, 
                        viewport, 0,
                        xyzw, 0);
        xyzw[0] /= xyzw[3];
        xyzw[1] /= xyzw[3];
        xyzw[2] /= xyzw[3];
        xyzw[3] = 1;
        return xyzw;
    }

我希望这个函数为屏幕取rx和ry,并为z = 0平面返回rx和ry。

1 个答案:

答案 0 :(得分:2)

gluUnProject (...)的作用没有什么特别之处。如果您拥有所有矩阵和视口尺寸 x,y w idth h 8 我可以引导您完成自己实施的过程。

注意:我倾向于用不同的名称调用每个坐标空间,了解 屏幕空间 窗口空间的另一个名称 查看空间 眼睛空间的另一个名称 对象空间 模型空间 的另一个名称。

<小时/>

步骤1:

NDC空间的屏幕空间(撤消视口转换)

NDC X =(2.0×(屏幕 X - 视口 X )/ 视口 W < / sub>) - 1.0

NDC Y =(2.0×(屏幕 Y - 视口 Y )/ 视口 H < / sub>) - 1.0

NDC空间的屏幕空间(撤消深度范围映射)

通常在屏幕空间中,深度范围会将 z = 0 映射到 附近 z = 1

NDC Z = 2.0×屏幕 Z - 1.0

<小时/>

步骤2

NDC空间到对象空间(撤消投影,视图和模型转换) < / H2>

投影矩阵) -1 × NDC XYZ1 = 查看 <子> XYZW

ModelView 矩阵) -1 ×查看 XYZW = <强>对象 <子> XYZW

这实际上可以组合成一个步骤,如下所示......


对象 XYZ w =(投影矩阵×模型视图矩阵) -1 × NDC XYZ 1

<小时/> 现在,您可能会注意到我在对象 XYZ 中划掉了 W ,我们真的根本不关心这个,但数学会产生然而,一个讨厌的 W 值。此时,您可以将对象 XYZ 的各个组件作为 r X ,r Y r Z