我自己是一名 iOS 开发人员,但我最近为我的游戏实现了光线投射,所以我将尝试以与平台无关的方式来回答这个问题。
光线投射操作有两个步骤:首先,您需要从用户的点击中获取光线,其次,您需要测试定义模型的三角形是否相交。请注意,这要求您仍将它们保存在内存中或能够恢复它们——您不能只将它们保存在显卡上的 vbo 中。
首先,转换为世界坐标。由于您毫无疑问使用投影矩阵来获得模型的 3-D 透视图,因此您需要取消投影点以使其处于世界坐标中。已经实现了许多库,例如 glut 的 glunproject,我相信它可以在 Android 上使用。我相信从数学上讲,这相当于对当前作用于您的模型的所有转换进行逆运算。无论如何,您可以从中复制许多在线公开可用的实现。
此时,您将需要一个 Z 坐标来表示您尝试取消投影的点。您实际上想要取消投影两次,一次 Z 坐标为 0,一次 Z 坐标为 1。z 坐标为 0 的向量是射线的原点,并通过从您的 z- 中减去该向量1个向量的坐标,您将获得方向。现在您已准备好测试模型多边形的交叉点。
我已经使用本文中介绍的方法(http://www.cs.virginia.edu/~gfx/Courses/2003/ImageSynthesis/papers/Acceleration/Fast%20MinimumStorage%20RayTriangle%20Intersection.pdf)取得了成功实际相交测试。该算法最后在 C 中实现,但您应该能够毫不费力地将其转换为 Java。