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

时间:2012-02-29 22:04:07

标签: android opengl-es

我的问题来自为什么 OpenGL和/或Android无法简单地抓取当前矩阵并将其存储为float []。我发现的所有研究建议使用这些类似乎我必须下载并放入我的项目名为 MatrixGrabber ,以便能够获取Open GL矩阵的当前状态。

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

我找到的最佳解决方法Android OpenGL 3D picking。但我想知道为什么没有办法可以简单地检索你想要的矩阵然后只需要调用

GLU.gluUnProject(...);

3 个答案:

答案 0 :(得分:4)

  

我的问题来自于为什么OpenGL和/或Android无法简单地抓取当前矩阵并将其存储为float []。

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

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

答案 1 :(得分:0)

在ES 1中,您可以使用glGetFloatv获取当前矩阵并将其存储为浮点数,pname GL_MODELVIEW_MATRIXGL_PROJECTION_MATRIXGL_TEXTURE_MATRIX为适用。

GLU本身并不是OpenGL ES的一部分,因为ES旨在成为最小规格,而GLU则是一种可选的额外规格。但您可以轻松抓取SGI's reference implementation of GLU并轻松使用gluUnProject

编辑:并完善思路,正如Nicol所指出的那样,ES 2中没有当前矩阵。你可以为任意多个矩阵提供任意多个矩阵,因为你首先提供它们你不应该要求GL再次让他们回来。

答案 2 :(得分:0)

我刚看了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实现不支持),但是如果你有一些应该对触摸“透明”的东西那就不行。另一种方法是构造一条射线(例如通过两次不同深度投射两次),然后在场景中进行光线投射。