Line Trace / Raycasting 如何在游戏引擎中工作以测试交叉点?

How does Line Trace / Raycasting works in game engines to test intersections?

我从事游戏开发已经有一段时间了,从那时起我就一直找不到答案。

那么,说真的,这个魔法是如何在其基础上发挥作用的呢?例如,当我使用 Unreal Engine 4 时,我可以简单地调用 LineTraceByChannel,选择一个起点和终点,然后引擎将追踪一条线并 return 我得到命中结果。我也可以想象它。但我的大脑是这样想的:

“好吧,没有射击线段这样的东西,就像子弹一样,这是一种更简单的可视化方式。它背后一定有大量的数学运算。它如何检测相交的演员?是吗?检查每个可用的几何体或仅检查端点半径内的几何体 - 起点?那么它如何检测到这些角色在该半径内?为什么它不会 'that' 昂贵?"

如果有人能解释一下在线跟踪命中测试背后到底是什么,我会非常开明...谢谢您的宝贵时间...

问得好。要密集获得那种“光线投射就像这样工作”的简短答案,仅此而已。重要的是如何优化光线投射和获得的碰撞点,以及它背后的所有数学和软件技巧,使其如此便宜。但是,我认为这太复杂了,无法在答案中进行解释。那并不意味着我知道答案。

一种近似未优化的方法可以是使用 sphere-line intersection the entities of the scene. The ray is just a line, so two points. Then, once you got the entities interesected, you get the lowest z coordinate one (closest to the camera where the ray is thrown from), and for all the polygons of that entity, you check for the plane-line 检查 3d 实体模型的所有平面。同样重要的是如何优化它以使其计算成本如此之低并用于例如 Update()

碰撞也会出现同样的问题。在 2D 中,这并不容易,但您可以自己构建一个简单的碰撞系统,以检查两个多边形是否发生碰撞,例如,只需检查其中一个多边形的所有点是否在另一个多边形内。为了优化效率 and/or 精度 convex hull 和边界体积(盒子、球体、胶囊、圆柱体等),使用了 obtention 技术。当你进入 3D 时,这会失去控制。

至于解释用于碰撞检测和优化的边界体积技术的内容太大太深以至于无法在解释游戏引擎中的碰撞的答案中解释,应该发生类似的事情来解释光线投射的方式我相信这些东西在细节上起作用。

无论如何,我也很乐意阅读任何关于光线投射如何在游戏引擎中详细工作的评论,也许是一些高层次的解释,超出了我解释的简单模型示例,我不知道它是否即使实际使用,它也只是一种计算几何方法来实现交点。