检测用户在OpenGL正方形上的触摸

5

可能是重复问题:
如何确定屏幕上触摸的3D空间中的内容?

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

我在屏幕上画了一个正方形,我想让用户在触摸它时移动它。换句话说,当用户放手指在正方形上时,他应该能够移动它。如果他触摸到正方形以外的区域,则不会发生任何事情。

我该如何检测用户何时触摸正方形?

谢谢。

3个回答

4

可以使用射线拾取来实现触摸检测。我曾经遇到过同样的问题,我使用了这个页面上的代码:Android OpenGL ES射线拾取。getViewRay()方法计算射线的方向。如果你知道从[0,0,0]到射线[x,y,z]的方向,那么模拟射线投射并检测与边界对象的碰撞就相当容易了。


3
其他答案中提供的拾取和选择教程在这里不适用;其中glSelectBuffer和glRenderMode不属于OpenGL ES的一部分。
正如其他地方所述,基本上有两种方法。您可以找出触摸如何映射到您的场景并通过数学测试您的对象。如果您的正方形是平面的,就像您在2D中绘制它一样,那么您可以很容易地实现它。
或者,您可以做一些类似于拾取但适应OpenGL ES可用功能的事情。例如,将场景清除为黑色,并以实心蓝色绘制正方形。使用glReadPixels获取触摸位置处的颜色值。如果是蓝色,则表示触摸在正方形上。这可能是一种更昂贵的测试方式,因为它意味着额外绘制场景,但这意味着您不必实现任何额外的数学或其他代码,只需使用GL提供的即可。
唯一需要记住的小事是OpenGL在任何地方都使用相同的像素寻址方式-(0,0)是左下角,正y向上,正x向左。因此,无论您将触摸坐标相对于哪个轴,都需要在执行glReadPixels之前将它们转换为相对于该轴的坐标。

看起来很困难。我将在屏幕上放置一些按钮,并使用它们来移动OpenGL对象。 - VansFannel
@VansFannel 这并不难,只需按照选择颜色的教程进行操作。让一个按钮来代替在 iPhone 上手指可以完成的操作是一个很糟糕的想法。 - rano
@rano:我是为Android做的,不是为iPhone。 - VansFannel
1
@VansFannel 哈哈,笨拙的我,我的意思是:在触摸设备上,不充分利用用户手指的自然特性是一个不好的想法。 - rano

0

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

更一般地说,有几种技术可以“拾取”OpenGL模型:射线拾取和颜色拾取是最常用的。确保查看{{link1:此文档}}。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接