Opengl es OpenGL用于检测用户触摸的对象

Opengl es OpenGL用于检测用户触摸的对象,opengl-es,opengl-es-2.0,Opengl Es,Opengl Es 2.0,我有一张基于OpenGL的地图。这张地图包括街道、公路和边界。我想知道用户接触的对象是什么,比如多边形、多段线或简单线。如何从OpenGL检测这些对象?在OpenGL ES中,没有选择缓冲区,因此没有专门设计的功能允许您在特定点识别屏幕上的对象 您有两个选择: 将屏幕空间位置(x,y)取消投影到世界空间位置,并测试所有对象与通过该点的光线的交点(通常是性能最好的方法) 使用唯一标识场景的特殊颜色渲染场景中的所有内容,然后在屏幕空间位置(x,y)读取像素的颜色 选项2的速度较慢,因为它需要等待GP

我有一张基于OpenGL的地图。这张地图包括街道、公路和边界。我想知道用户接触的对象是什么,比如多边形、多段线或简单线。如何从OpenGL检测这些对象?

在OpenGL ES中,没有选择缓冲区,因此没有专门设计的功能允许您在特定点识别屏幕上的对象

您有两个选择:

  • 将屏幕空间位置(x,y)取消投影到世界空间位置,并测试所有对象与通过该点的光线的交点(通常是性能最好的方法)

  • 使用唯一标识场景的特殊颜色渲染场景中的所有内容,然后在屏幕空间位置(x,y)读取像素的颜色

  • 选项2的速度较慢,因为它需要等待GPU完成渲染,但它的优点是可以更精确地处理非常薄的对象(如线)。它的实现也简单得多

    有关选项2的更多详细信息,请参见以下两个链接:


    需要更多信息。当你说“用户触摸”时,你的意思是点击还是碰撞?通常,OpenGL不会检测到这两种情况(除非您使用类似于使用
    选择缓冲区进行拾取的方法)。我的意思是单击街道,然后我想知道所选项目是否为多边形,折线还是直线?有没有办法通过opengl来检测这些对象?因为我们在这个问题中讨论的是opengl ES,没有。非常旧的原始opengl版本有一种称为选择缓冲区的东西,可以帮助实现这一点。您需要使用交集测试或使用特殊颜色绘制所有内容,并使用
    glReadPixels(…)
    。该过程称为
    颜色拾取
    ,如果您想选择线条等非常薄的对象,这可能是您唯一的选择。请使用物理引擎,以最快的方式完成此操作!谢谢你的回复。我忘了提到所有的物体都有不同的形状colors@MuneemHabib:这很好,只要用户在屏幕上单击,您就可以使用唯一标识对象的颜色渲染对象。您应该立即重新绘制场景(在执行
    glReadPixels(…)
    后),以正常的方式隐藏假颜色。由于内存带宽较低,在移动设备上进行额外的渲染过程是痛苦的。如果可能的话,最好使用非投影。@SergeyK.:是否可以使用非投影精确地测试与线原语的交点?这是我建议使用黑颜色拾取的唯一原因——问题陈述包括以下行:-\@AndonM.Coleman:我知道并使用桌面GPU上的颜色拾取。但移动是另一回事。无论如何,答案是+1。