前言
在游戏开发中,当物体移动速度过快时,有可能出现"穿透"现象,这是因为离散的update检测可能跳过了实际的碰撞点。以下是整理的解决方案。
1.连续碰撞检测(CCD)
启用RigidBody的连续碰撞检测(CCD)功能。
连续碰撞检测(简称 CCD)是一种用于避免高速运动的物体在离散运动时出现穿透现象而导致碰撞数据不精确的技术,可用于实现类似高速运动的子弹与物体发生碰撞时,不会直接穿透物体。
要注意不同物理引擎支持的形状不同。
2.子步检测法
在Update的移动逻辑中,将移动细化。比如设置为每帧执行60步,那么就在移动方法中将移速设为1/60,移动60次,并在每次移动后判断碰撞(自定义物理模块)。
其实原理和直接降低每帧运行时间类似,相同的速度执行次数多了自然就更容易检测到了。
3.扫掠体积(Swept Volume)
传统的离散碰撞检测(Discrete Collision Detection, DCD)是基于物体在每一帧的位置进行碰撞判断的。如果物体移动速度过快,在一帧的时间内,它可能直接穿过另一个物体,而离散碰撞检测无法检测到这次碰撞,导致穿透现象。
扫掠体积方法通过考虑物体在一段时间内的运动轨迹,将碰撞检测从离散的点扩展到连续的空间,从而解决了穿透问题。
简单来说就是记录物体移动轨迹的连续空间,与其它物体和扫掠体积进行检测。
要注意的是如果两个扫掠体积有交集不一定是发生了碰撞,有可能刚好错过,这就需要进一步计算了,比如把轨迹按时间子步检测分成更小的空间,检查是否有同时重合等方案。
4.最大速度限制
降低移动速度避免这个问题。
5.射线检测法
从开始处向移动后位置发射射线进行检测。
要注意直接用射线无法检测出两个高速移动物体是否有过交集。