Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

碰撞形状(3D)

本指南介绍以下内容:

  • Godot 中可用于 3D 的碰撞形状类型。

  • 使用凸形或凹形网格作为碰撞形状。

  • 有关 3D 碰撞的性能注意事项。

Godot 提供了多种碰撞形状,它们在性能和精度方面各有权衡。

你可以通过添加一个或多个 CollisionShape3Ds 作为直接子节点来定义 PhysicsBody3D 的形状。间接子节点(即子节点的子节点)会被忽略,不会用作碰撞形状。另外请注意,你必须在检查器面板中为碰撞形状节点添加一个 Shape3D 资源

备注

当你为单个 PhysicsBody 添加多个碰撞形状时,不必担心它们会重叠。它们不会相互“碰撞”。

基本碰撞形状

Godot 提供以下基本碰撞形状类型:

你可以使用一个或多个基本形状来表示大多数较小物体的碰撞。但是,对于更复杂的物体,例如大型飞船或整个关卡,你可能需要使用凸形或凹形。下面会有更详细的介绍。

我们建议动态物体(如 RigidBody 和 CharacterBody)优先使用基本形状,因为它们的行为最可靠,通常也能提供更好的性能。

凸形碰撞形状

凸碰撞形状是基本碰撞形状和凹碰撞形状之间的折衷方案。它们可以表示任何复杂程度的形状,但有一个重要的限制。顾名思义,单个形状只能表示形状。例如,金字塔是的,而空心盒子是的。要用单个碰撞形状定义凹形物体,你需要使用凹碰撞形状。

根据物体的复杂程度,使用多个凸形而不是一个凹形碰撞形状可能会获得更好的性能。Godot 允许你使用凸分解来生成与空心物体大致匹配的凸形。请注意,超过一定数量的凸形后,这种性能优势就不复存在了。对于像整个关卡这样的大型复杂物体,我们建议使用凹形。

你可以通过选择 MeshInstance3D 节点并使用 3D 视口顶部的网格菜单,在编辑器中生成一个或多个凸碰撞形状。编辑器提供两种生成模式:

  • 创建单个凸碰撞同级节点使用 Quickhull 算法。它会创建一个 CollisionShape 节点,并自动生成一个凸碰撞形状。由于只生成单个形状,它的性能良好,非常适合小型物体。

  • 创建多个凸碰撞同级节点使用 V-HACD 算法。它会创建多个 CollisionShape 节点,每个节点都有一个凸形。由于它能生成多个形状,因此对于凹形物体的精度更高,但代价是性能。对于中等复杂度的物体,这种方法可能比使用单个凹形碰撞形状更快。

凹形或三角网格碰撞形状

凹碰撞形状(也称为三角网格碰撞形状)可以呈现任何形式,从几个三角形到数千个三角形不等。凹形是性能最差的选项,但在 Godot 中也是最精确的。你只能在 StaticBody 中使用凹形。除非 RigidBody 的模式设置为 Static,否则它们不适用于 CharacterBody 或 RigidBody。

备注

尽管凹形提供了最精确的碰撞,但接触报告的精度可能不如基本形状。

在不使用 GridMap 进行关卡设计时,凹形是关卡碰撞的最佳选择。也就是说,如果你的关卡包含细小的细节,出于性能和游戏体验的考虑,你可能希望将这些细节排除在碰撞之外。为此,你可以在 3D 建模软件中构建一个简化的碰撞网格,并让 Godot 为其自动生成碰撞形状。下面会有更详细的介绍

请注意,与基本形状和凸形不同,凹碰撞形状没有实际的“体积”。你既可以将物体放置在形状的外侧,也可以放置在内侧

你可以通过选择 MeshInstance3D 节点并使用 3D 视口顶部的网格菜单,在编辑器中生成凹碰撞形状。编辑器提供两个选项:

  • 创建三角网格静态体是一个方便的选项。它会创建一个 StaticBody,其中包含与网格几何形状匹配的凹形。

  • 创建三角网格碰撞同级节点会创建一个 CollisionShape 节点,其中包含与网格几何形状匹配的凹形。

参见

有关如何为 Godot 导出模型以及如何在导入时自动生成碰撞形状的信息,请参阅导入 3D 场景

性能注意事项

每个 PhysicsBody 并不局限于一个碰撞形状。不过,我们建议尽量减少形状数量以提升性能,尤其是对于 RigidBody 和 CharacterBody 这类动态物体。此外,避免对 CollisionShape 进行平移、旋转或缩放,以便从物理引擎的内部优化中受益。

当在 StaticBody 中使用单个未经变换的碰撞形状时,引擎的 broad phase(粗略检测)算法可以忽略不活跃的 PhysicsBody。这样 narrow phase(精确检测)就只需考虑活跃物体的形状。如果 StaticBody 有多个碰撞形状,broad phase 就会失效。速度较慢的 narrow phase 就必须对每个形状执行碰撞检查。

如果遇到性能问题,你可能需要在精度方面做出妥协。大多数游戏的碰撞都不是 100% 精确的。它们会找到巧妙的方法来隐藏这一点,或者让它在正常游戏过程中不易被察觉。