首页 > 解决方案 > Line Trace / Raycasting 如何在游戏引擎中工作以测试交叉点?

问题描述

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

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

“好吧,没有像射击子弹那样的线段,这是一种更简单的可视化方法。它背后一定有巨大的数学。它如何检测相交的演员?它是否检查每个可用的几何图形还是只有在端点半径范围内的那些 - 起点?那么它如何检测到这些演员在那个半径范围内?为什么它不会'那么'昂贵?

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

标签: c#c++unity3dgame-engineunreal-engine4

解决方案


好问题。密集地获得“光线投射就像这样”的简短答案,就是这样。最重要的是如何优化光线投射和获得的碰撞点,以及它背后的所有数学和软件技巧,让它变得如此便宜。但是,这太深奥和复杂,无法在我相信的答案中解释。这并不意味着我知道答案。

一种近似未优化的方法可以是用球线相交检查场景的实体。射线只是一条线,所以是两个点。然后,一旦你让实体相交,你就会得到最低的 z 坐标一个(最靠近抛出光线的相机),并且对于该实体的所有多边形,你检查所有平面的平面线3d实体模型。同样重要的是如何将其优化为计算成本如此低廉并用于例如Update()

碰撞也会出现同样的问题。在 2D 中这并不容易,但您可以自己构建,例如,一个简单的碰撞系统,以检查两个多边形是否发生碰撞,只需检查一个多边形的所有点(如果有的话)。为了优化关于效率和/或精度的凸包和边界体积(盒子、球体、胶囊、圆柱体等),使用了获取技术。当您转到 3D 时,情况就会失控。

为了解释甚至用于碰撞检测和优化的边界体积技术的东西太大太深,无法在解释游戏引擎中的碰撞的答案中解释,类似的事情应该发生以解释光线投射的东西是如何工作的详细我相信。

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


推荐阅读