我在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。
答案 0 :(得分:2)
gluUnProject (...)
的作用没有什么特别之处。如果您拥有所有矩阵和视口尺寸( x,y 和 w idth , h 8 )我可以引导您完成自己实施的过程。
注意:我倾向于用不同的名称调用每个坐标空间,了解 屏幕空间 是 窗口空间的另一个名称 , 查看空间 是 眼睛空间的另一个名称 , 对象空间 是 模型空间 的另一个名称。
<小时/>
NDC X =(2.0×(屏幕 X - 视口 X )/ 视口 W < / sub>) - 1.0
NDC Y =(2.0×(屏幕 Y - 视口 Y )/ 视口 H < / sub>) - 1.0
通常在屏幕空间中,深度范围会将 z = 0 映射到 附近 和 z = 1 到 远 :
NDC Z = 2.0×屏幕 Z - 1.0
<小时/>
(投影矩阵) -1 × NDC XYZ1 子> = 查看强> <子> XYZW 子>
( ModelView 矩阵) -1 ×查看 XYZW 子> = <强>对象强> <子> XYZW 子>
† 这实际上可以组合成一个步骤,如下所示......
对象 XYZ w =(投影矩阵×模型视图矩阵) -1 × NDC XYZ 强> 1 子>
<小时/> 现在,您可能会注意到我在对象 XYZ 中划掉了