使用OpenGL检测用户触摸的对象。

3

我有一个基于OpenGL构建的地图。这张地图包含街道、高速公路和边界。我想知道用户触摸的是哪个对象,比如是多边形、折线还是简单的直线。我该如何从OpenGL中检测这些对象?


需要更多的信息。当你说“用户触摸”时,是指点击还是碰撞?通常情况下,你不会使用OpenGL来检测这两种情况(除非你使用类似于使用“选择缓冲区”进行拾取的方法)。 - undefined
我是说点击街道,然后我想知道所选项目是多边形、折线还是直线? - undefined
有没有办法通过OpenGL来检测这些对象? - undefined
由于我们在这个问题中讨论的是OpenGL ES,所以不行。原始OpenGL的非常旧版本有一个称为选择缓冲区的东西,可以帮助解决这个问题。你需要使用交集测试或者用特殊颜色绘制所有内容,并使用glReadPixels (...)函数。这个过程被称为“颜色拾取”,如果你想选择非常细的对象(如线条),这可能是你唯一的选择。 - undefined
使用物理引擎,这是最快的方法! - undefined
@felix,如果有相关链接的话,将非常有帮助。 - undefined
1个回答

2
在OpenGL ES中,没有“选择缓冲区”,因此没有专门设计的功能可以允许您识别特定点上屏幕上的对象。
您有两个选择:
1.将屏幕空间位置(x,y)反投影到世界空间位置并测试所有物体是否与通过此点的射线相交(通常是最佳性能方法)。
2.使用唯一标识它的特殊颜色渲染场景中的所有内容,然后读取屏幕空间位置(x,y)处像素的颜色。
选项2较慢,因为它需要等待GPU完成渲染,但它具有更准确处理非常细的对象(如线条)的优点。 它也更简单易行。
有关选项2的更多详细信息,请参见以下两个链接:

谢谢您的回复。我忘记提到所有的对象都有不同的颜色。 - undefined
@MuneemHabib:没问题,当用户点击屏幕时,你只需要用一种能够独特标识对象的颜色来渲染它们。在执行完glReadPixels (...)后,你应该立即以正常方式重新绘制场景,以隐藏虚假的颜色。 - undefined
移动设备由于内存带宽较低,额外的渲染通道非常痛苦。如果可能的话,应该优先选择反投影。 - undefined
@SergeyK: 使用反投影技术能够准确地测试线元素的相交吗?这就是我建议使用颜色拾取的原因,因为问题描述中包括了线条 :-\ - undefined
@AndonM.Coleman:我知道并且在桌面GPU上使用过颜色拾取。但移动设备则另当别论。总之,给你的答案点个赞(+1)。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接