← 全部概念
游戏系统 / 26
穿透
高速物体穿墙而过
交互演示
交互演示 · 移动指针或点击画面,观察变化
物体在一帧内移动过远,更新前还在墙的一侧,更新后就到了另一侧,逐帧重叠检测始终看不到二者接触,这就是穿透。这里的子弹每帧移动约 40 px,墙只有 6 px 厚;每个点代表一帧,演示已放慢。上方轨道只在这些点检测重叠,让子弹穿墙而过;下方轨道检测相邻两点之间的整段路径,因此能把子弹挡在墙上。
适用场景
如果物体在一次更新中移动的距离可能超过薄障碍物的厚度,应使用扫掠碰撞检测。射线表示没有体积的点状弹丸;球体或胶囊体扫掠则表示具有体积的物体。
实现示例
不依赖特定引擎的伪代码。请根据你使用的引擎调整函数和坐标约定。
next = position + velocity * dt
hit = sweepShape(shape, position, next)
if hit:
position = hit.safePosition
resolveImpact(hit)
else: position = next常见错误
如果物理系统仍以低频率采样,仅提高渲染 FPS 并不能解决问题。应根据物体的速度、尺寸和碰撞需求,选择连续碰撞检测或物理子步。
内容原作 Nicolas Zullo · 中文整理与交互改编