如何在我的OpenGL ES 1.1 Android应用程序中使用gl.gluUnproject来确定用户触摸屏幕时选择了什么?
我的理解是触摸事件会产生一条线,我必须找到它与第一个“物体”相交的位置。
有没有关于如何做到这一点的教程?
编辑 Android实现了自己的gluUnproject版本。可以通过调用它来创建射线,为近和远平面(0和1)分别调用它,并从远平面结果中减去近平面结果以获得射线方向。射线起点是视图位置。更多信息。
我认为对于大多数应用程序,您应该选择正确的3D方法:光线投射。
将用户选择的2D屏幕坐标位置投影到您的世界空间中。这会产生一条从相机起始并指向场景的3D射线。现在,您需要在3D中执行碰撞测试。在大多数情况下,这可以通过将对象简化为一组简单的几何形状(例如椭球体、球体和盒子)来加速完成。
鉴于手持设备的精度,这应该已经足够精确了。请注意,根据物体的形式,您可能需要使用多个基本原语。此外,总是使用相同的原语是毫无意义的:显然,包围球是非常长的棒子的一个非常糟糕的近似值。
这完全取决于你正在渲染什么。你可能不应该使用拾取方法,因为:
a) 它听起来会很慢,特别是在安卓上。 b) 你可能想要为小物体提供更大的“触摸区域”,这样你就不必精确地触摸它们所在的位置。 c) 它并没有真正回答正确的问题——它给出了结果“最顶层的图形项是在我触摸的位置上精确渲染的吗?”而你想知道的是“用户触摸或接近了哪个游戏实体?”
正如我所说,这完全取决于你的游戏。如果它是一个2D或几乎是2D的游戏,那么很简单,你只需要将触摸坐标输入到你的游戏模型中。对于3D游戏,我建议使用我刚想出来的这个简单算法:
为了得到精确的结果,可以使用线交点算法。有一些算法可以实现这个功能(搜索“平面线交点射线投射”)。
我想到的一个方法是缓存调用gluProject的结果。这可能只适用于处理固定相机时才实际可行。在任何相机视角变化结束时,我可以重新生成这个“可触摸”缓存。
这还有一个额外的好处,就是确保我只测试那些会响应触摸的输入对象。
我很感谢对这种方法的任何想法!