在Open GL ES 2.0 Android中没有简单的方法来确定屏幕坐标的3D坐标的原因



我的问题来自为什么OpenGL和/或Android不能简单地获取当前矩阵并将其存储为浮点[]。我发现的所有研究都建议使用这些类,看起来我必须下载这些类,并将其放入名为MatrixGrabber的项目中,才能获取Open GL矩阵的当前状态。

我的总体目标是轻松确定通过触摸屏幕引起的事件的Open GL世界位置,在屏幕上我可以检索事件的X和Y坐标。

我找到的最好的解决方法是Android OpenGL 3D拾取。但我想知道为什么没有一种方法可以简单地检索你想要的矩阵,然后调用

GLU.gluUnProject(...);

我的问题来自于OpenGL和/或Android为什么不能简单地获取当前矩阵并将其存储为浮点[]。

因为OpenGL ES 2.0(以及核心桌面GL 3.1及以上版本)不一定"当前矩阵"。所有变换都是通过着色器逻辑完成的,所以矩阵甚至不必涉及。它可能在里面做任何事情。

没有当前矩阵,所以没有什么可得的。没有什么可以取消的。

在ES 1中,您可以使用glGetFloatv获取当前矩阵并将其存储为浮点值,pnameGL_MODELVIEW_MATRIXGL_PROJECTION_MATRIXGL_TEXTURE_MATRIX(视情况而定)。

GLU本身并不是OpenGL ES的一部分,因为ES是一个最小的规范,而GLU是一种可选的额外规范。但是您可以很容易地获取SGI的GLU参考实现并使用它的gluUnProject

编辑:正如尼科尔所指出的,ES 2中没有当前矩阵。您可以为着色器提供任意多个矩阵,用于任意多个目的,并且由于您首先提供了这些矩阵,因此不需要要求GL再次将其取回。

我刚刚看了一眼http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixGrabber.html它看起来像你所指的MatrixGrabber,看起来并不特别复杂——事实上,它是过度构建的。您可以直接使用gl2.getMatrix,然后将其插入gluUnProject。

MatrixGrabber代码设计的可能原因是它缓存值以供多次使用——因为GPU与CPU异步运行,您的代码可能必须等待getMatrix响应,因此尽可能少地获取并重用数据更有效。

一般问题复杂性的另一个来源是,触摸只指定两个维度。单次触摸并不表示任何深度,因此您必须以特定于应用程序的方式进行操作。显而易见的方法是读取深度缓冲区(尽管一些OpenGL实现不支持这一点),但如果你有例如应该对触摸"透明"的东西,那就不起作用了。另一种方法是构造一条光线(例如,使用两个不同的深度取消投影两次),然后在场景中进行光线投射。

相关内容

  • 没有找到相关文章

最新更新