射线追踪与扫掠检测

目前我们想要实现抓取物体的功能。能抓取的物体肯定需要是我们目光能看到的物体。在之前的文章中,我们已经添加了自定义的场景组件,即可以获取到相机视角信息。现在就差如何选定或检测到我们想要抓取的物体。

在 Unreal 中,我们可以使用射线追踪功能。射线追踪会从起点到终点投射一条射线,用于检测射线经过的路径上是否有物体。

但射线是一条无厚度、无体积的直线,检测精准但是检测范围有限。如果需要更大范围的检测,我们可以使用扫掠检测。扫掠检测类似于射线追踪,不同的是它使用一个有体积的形状(比如球体、胶囊、盒子等)沿着路径移动,检测是否碰撞到物体。

上述提及了碰撞这个概念,检测和碰撞有关。如图 1 所示,在 Unreal 里,每个物体都有一个碰撞组件。

图1 碰撞组件

在图 1 中可以看到碰撞相关的属性非常多,我们先只关心 碰撞预设 这个属性。

Unreal 里内置了许多默认的碰撞预设,比如 No Collision 为禁用碰撞,即不会与任何物体发生碰撞;比如 BlockAll 为阻挡所有碰撞,即所有物体无法穿过它。此处我们不使用默认碰撞预设,如图 2 所示,我们将碰撞预设设置为 Custom。将其展开,可以发现有许多属性可以手动配置。

图2 碰撞预设

我们首先看到碰撞启用方式,此处是 查询和物理,表示同时启用查询和响应物理碰撞。碰撞有三种响应方式:忽略重叠阻挡

碰撞通道可以用来区分物体类别,并定义这些类别之间的碰撞响应规则。在此处我们自定义了一个名为 Grabber 的碰撞通道,并将其响应方式设置为 阻挡

如何添加自定义的碰撞通道?我们可以在界面右上角打开 设置 - 项目设置 窗体。如图 3 所示,我们点击 新建检测通道,可以添加自定义通道。

图3 碰撞通道