【问题标题】:Collision detection for UI elements with transparency具有透明度的 UI 元素的碰撞检测
【发布时间】:2012-12-12 00:31:39
【问题描述】:

我有一个使用 OpenGL/OpenGL ES 渲染的 UI 框架。一些 UI 元素具有透明区域。现在我使用边界矩形进行碰撞,但在某些特定情况下,一个元素的透明部分与另一个元素重叠,它无法检测到正确的元素。

我不想保留所用纹理的副本(作为最后的解决方案,我可能只保留 Alpha 通道)。

您认为在这种情况下我应该如何处理碰撞检测?该解决方案应该是快速且内存友好的。

OpenGL/OpenGL ES 纹理内存读取速度是否足够快以使用它(很少,仅在事件上)来获取一个像素的 alpha 值?这个读数会破坏 OpenGL/OpenGL ES 管道吗?

编辑:

为了更清楚,我只需要 Object-Point 碰撞 - 它是一个 UI 库,但例如某些按钮可能没有矩形形式,并且它们的边界框可能重叠。在这种情况下,我需要正确检测按下的按钮。

【问题讨论】:

  • @genpfault 为什么要删除我的 opengl 标签?一些用户可能认为我只在 OpenGL ES 中使用它,这是不正确的。
  • 我通常会尝试将openglopengl-es 标签分开,因为在大多数情况下它们是完全不同的。昨天必须在自动驾驶仪上重新标记,抱歉。

标签: opengl opengl-es opengl-es-2.0 collision-detection


【解决方案1】:

如果 UI 元素没有改变,您可以为每个按钮声明一个 CGPathRef,然后使用 CGPathContainsPoint 检测哪个按钮被按下。您可能必须遍历每个按钮,但核心图形完成的检查速度足够快,不会减慢应用程序的速度。

请注意,这是像素完美检测。如果不使用物理引擎,您将无法获得更快或更精确。

编辑:

在这种情况下使用PIP 算法将起作用......正如你所注意到的......它有一个洞。您也可以对多个孔使用相同的想法。

【讨论】:

  • CGPathRef 和 CGPathContainsPoint 是 Apple 特定的,我不能在 PC 上使用它。当对象中有“洞”时,路径方法也会失败。
  • 那么您正在寻找的是 point-in-polygon problem 。你也没有指定你正在使用的平台
  • 感谢您的帮助,但我认为当对象包含带有多边形的“孔”时,很难描述它。
  • 我的问题不是检测点是否在多边形中的算法,而是将我的形状描述为多边形的算法。它可以是任何形状,其中有许多任何类型的“洞”。如果我使用几个点,碰撞将是不精确的。如果我使用很多点,算法将花费非常多的时间来检查,最终会比位图消耗更多的内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 2013-05-04
  • 1970-01-01
相关资源
最近更新 更多