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.
Checking the stable version of the documentation...
碰撞形状(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% 精确的。它们会找到巧妙的方法来隐藏这一点,或者让它在正常游戏过程中不易被察觉。