【问题标题】:Open GL - ES 2.0 : Touch detectionOpen GL - ES 2.0:触摸检测
【发布时间】:2012-02-16 21:14:41
【问题描述】:

大家好,我正在 iOS 上做一些工作,这项工作需要使用 OpenGL es。所以现在我在屏幕上有一堆正方形、立方体和三角形。其中一些几何形状可能重叠。触摸检测的任何想法/方法?

问候

【问题讨论】:

  • 你真的应该提高你的接受率(截至目前,它显示为 0%)。

标签: iphone ios opengl-es touch


【解决方案1】:

为了跟进已经给出的答案,正方形、立方体和三角形都是凸面形状,因此您可以非常轻松地执行射线与对象的相交,甚至可以直接从几何而不是从完美对象的数学描述中进行。

您将需要能够计算点到平面的距离以及射线与平面的交点。作为一个简单的测试,您可以非常快速地实现自己,对于凸形上的每个多边形,计算出射线和平面之间的交点。然后检查该点是否位于与您刚刚测试的共享边的多边形定义的所有平面后面。如果是这样,那么命中就在对象的表面上——尽管你应该小心共面的相邻多边形和舍入误差。

一旦你发现了一个碰撞,你可以很容易地得到光线的长度到碰撞点。距离最短的物体是在前面的那个。

如果速度足够快,那就太好了,否则您可能会想研究划分世界或将物体分解成它们的轮廓。凸对象非常简单——考虑一个多边形和下一个多边形之间的所有边。如果这些多边形中只有一个是正面的,那么边缘就是轮廓的一部分。所有轮廓边一起可以投影到视图平面上的凸二维形状。然后,您可以通过执行 2d 多边形点来测试触摸。

另一种消除大部分数学运算的常见替代方法是采摘。您将场景渲染到一个不可见的缓冲区,每个对象都显示为具有适当独特颜色的实心斑点。要测试触摸,您只需执行glReadPixels 并检查颜色。

对于 iPhone 上的 glu,您可以获取 SGI's implementation(MESA 使用的)。我之前在运输、生产项目中使用过它的 tessellator。

【讨论】:

  • 嗨,Tommy,感谢您回答我的问题。昨天我在我的场景中使用射线球相交方法实现了触摸检测。但是,如果我的场景中的对象开始旋转,我无法跟上数学。我现在正在研究采摘方法。我想我的第一个问题是如何将我的场景渲染到隐藏缓冲区
  • 最简单的方法——假设你至少有双缓冲——是像往常一样将场景渲染到普通帧缓冲区,然后执行glReadPixels,然后快速执行glClear 和以通常的方式绘制场景。在绘制您真正希望用户看到的版本之前不要翻转缓冲区,并且您的特殊颜色版本将保持不可见。或者,在调试时,禁用正常绘制以快速直观地确保您获得唯一颜色的对象,每个对象都是单一颜色。
  • 我有点遵循渲染然后清除然后渲染场景的基本方法......但这产生了非常明显的闪光......我通过不发出对 presentRenderBuffer 的调用解决了闪光问题当我为触摸检测绘制场景时。现在触摸检测工作正常。我想现在下一个挑战是使用顶点数组
【解决方案2】:

我过去也遇到过这个问题。我使用的是你可以在谷歌上找到的 glu unproject 的实现(它使用模型视图投影矩阵和视口大小的倒数)。这允许您将 2D 屏幕坐标映射到世界中的 3D 矢量。然后,您可以使用此向量与您的对象相交,并查看哪个相交(或非常接近)。

我确实希望有更好的方法来做到这一点,所以我也期待其他答案!

【讨论】:

  • 我认为我没有正确理解您的答案。据我所知,glu 函数在 open gl es 上不可用
  • glu 函数不可用,但只要维护自己的 MVP 矩阵,就可以找到 unproject 的实现。这是一个例子:codng.com/2011/02/gluunproject-for-iphoneios.html 我相信还有其他的。
  • 实际上我可以用谷歌搜索并想出一种使用 unproject 的方法....我使用 unproject 函数获取 2 个向量并从中创建了一条射线.. 但是问题我现在拥有的是如何测试这条射线是否对我的任何矩阵感兴趣?
【解决方案3】:

获得逆模型视图并投射光线(矢量)后,您仍然需要知道光线是否与几何体相交。一种方法是获取对象中心的深度(视图坐标系中的 z)并将矢量延伸(拉伸)那么远。然后看看向量的“头”是否在你的对象的体积内结束(你需要对象的中心,例如它的半径,如果它是一个球体)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多