可能重复:
How do I determine what is touched in 3D space from the screen?
我正在开发一个Android应用程序。我也在使用OpenGL图形。
我在屏幕上画了一个正方形,我想让用户在接触它时移动它。换句话说,当用户将手指放在正方形上时,用户应该能够移动方形。如果他接触到广场外没有任何事情发生。
如何检测用户何时接触方块?
感谢。
答案 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