我正在开发一个Android应用程序。我也在使用OpenGL图形。
我在屏幕上绘制了一个球体,我想让用户在触摸它时移动它。如果他接触球体之外没有任何事情发生。
如何检测用户何时触及球体?
答案 0 :(得分:1)
在这种情况下最简单的方法是使用gluUnproject两次,一次将Z设置为near,一次将Z设置为far,这将使光线“进入”屏幕。如果光线与球体相交(有点琐碎),则用户点击它。否则,不是。
或者,您可以读回该像素处的z缓冲区值(这将是一个管道停顿,但您可以使用前一帧,除非动画完全狂野,否则很可能会注意到)。这将使用gluUnproject为您提供3D单点。这对于测试更为微不足道,因为如果它在球体上,则sqrt(dx * dx + dy * dy + dz * dz)必须是半径。要考虑舍入误差,您可能需要比较< = 1.0001 * radius等。
最后,您可以使用1x1像素视口执行遮挡查询。这对于球体来说并不是非常有用,因为碰撞检查要容易得多,但是对于可能有孔的更复杂的物体以及需要像素精确检测的地方,可能需要做些什么。