通过OpenGL方块检测用户的触摸

时间:2010-11-11 12:14:44

标签: android opengl-es touch

  

可能重复:
  How do I determine what is touched in 3D space from the screen?

我正在开发一个Android应用程序。我也在使用OpenGL图形。

我在屏幕上画了一个正方形,我想让用户在接触它时移动它。换句话说,当用户将手指放在正方形上时,用户应该能够移动方形。如果他接触到广场外没有任何事情发生。

如何检测用户何时接触方块?

感谢。

3 个答案:

答案 0 :(得分:4)

可以使用光线拾取实现检测触摸。我遇到了同样的问题,我在此页面上使用了代码:Android OpenGL ES ray picking。方法getViewRay()计算射线的方向。如果您知道从[0,0,0]到ray [x,y,z]的方向,则可以很容易地模拟光线投射并检测与边界对象的碰撞。

答案 1 :(得分:3)

其他答案中提供的拣选和选择教程不适用于此;其中glSelectBuffer和glRenderMode不属于OpenGL ES。

如其他地方所述,基本上有两种方法。您可以弄清楚触摸如何映射到场景中并以数学方式测试对象。如果您的方块是平坦的,就像您在2d中绘制它,那么您可以很容易地实现它。

或者,您可以执行一些基本上类似于拾取但适用于OpenGL ES下可用功能的操作。例如,将场景清除为黑色并以纯蓝色绘制正方形。使用glReadPixels获取触摸位置的颜色值。如果它是蓝色的,那么触摸就在广场上。这可能是一种更昂贵的测试方式,因为它意味着场景的额外绘制,但这意味着您不必实施除GL提供的任何额外的数学或其他代码。

要记住的唯一微不足道的事情是OpenGL使用相同的方法处理各处的像素 - (0,0)是左下角,正y向上,正x向左。因此,无论您的触摸坐标相对于哪个轴,都需要将它们转换为相对于执行glReadPixels之前的相对。

答案 2 :(得分:0)

如果你只有一个正方形,你可以检查触摸坐标是否位于由正方形的四个顶点形成的空间内。如果不平行于x轴方形,则应使用投影矩阵投影其顶点。

更常见的是,有几种技术可以“选择”OpenGL模型:光线拾取颜色选择是最常用的。请务必查看this doc