【发布时间】:2012-02-16 21:14:41
【问题描述】:
大家好,我正在 iOS 上做一些工作,这项工作需要使用 OpenGL es。所以现在我在屏幕上有一堆正方形、立方体和三角形。其中一些几何形状可能重叠。触摸检测的任何想法/方法?
问候
【问题讨论】:
-
你真的应该提高你的接受率(截至目前,它显示为 0%)。
标签: iphone ios opengl-es touch
大家好,我正在 iOS 上做一些工作,这项工作需要使用 OpenGL es。所以现在我在屏幕上有一堆正方形、立方体和三角形。其中一些几何形状可能重叠。触摸检测的任何想法/方法?
问候
【问题讨论】:
标签: iphone ios opengl-es touch
为了跟进已经给出的答案,正方形、立方体和三角形都是凸面形状,因此您可以非常轻松地执行射线与对象的相交,甚至可以直接从几何而不是从完美对象的数学描述中进行。
您将需要能够计算点到平面的距离以及射线与平面的交点。作为一个简单的测试,您可以非常快速地实现自己,对于凸形上的每个多边形,计算出射线和平面之间的交点。然后检查该点是否位于与您刚刚测试的共享边的多边形定义的所有平面后面。如果是这样,那么命中就在对象的表面上——尽管你应该小心共面的相邻多边形和舍入误差。
一旦你发现了一个碰撞,你可以很容易地得到光线的长度到碰撞点。距离最短的物体是在前面的那个。
如果速度足够快,那就太好了,否则您可能会想研究划分世界或将物体分解成它们的轮廓。凸对象非常简单——考虑一个多边形和下一个多边形之间的所有边。如果这些多边形中只有一个是正面的,那么边缘就是轮廓的一部分。所有轮廓边一起可以投影到视图平面上的凸二维形状。然后,您可以通过执行 2d 多边形点来测试触摸。
另一种消除大部分数学运算的常见替代方法是采摘。您将场景渲染到一个不可见的缓冲区,每个对象都显示为具有适当独特颜色的实心斑点。要测试触摸,您只需执行glReadPixels 并检查颜色。
对于 iPhone 上的 glu,您可以获取 SGI's implementation(MESA 使用的)。我之前在运输、生产项目中使用过它的 tessellator。
【讨论】:
glReadPixels,然后快速执行glClear 和以通常的方式绘制场景。在绘制您真正希望用户看到的版本之前不要翻转缓冲区,并且您的特殊颜色版本将保持不可见。或者,在调试时,禁用正常绘制以快速直观地确保您获得唯一颜色的对象,每个对象都是单一颜色。
我过去也遇到过这个问题。我使用的是你可以在谷歌上找到的 glu unproject 的实现(它使用模型视图投影矩阵和视口大小的倒数)。这允许您将 2D 屏幕坐标映射到世界中的 3D 矢量。然后,您可以使用此向量与您的对象相交,并查看哪个相交(或非常接近)。
我确实希望有更好的方法来做到这一点,所以我也期待其他答案!
【讨论】:
获得逆模型视图并投射光线(矢量)后,您仍然需要知道光线是否与几何体相交。一种方法是获取对象中心的深度(视图坐标系中的 z)并将矢量延伸(拉伸)那么远。然后看看向量的“头”是否在你的对象的体积内结束(你需要对象的中心,例如它的半径,如果它是一个球体)
【讨论】: