Collision shapes (3D)

This guide explains:

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

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

  • Performance considerations regarding 3D collisions.

Godot provides many kinds of collision shapes, with different performance and accuracy tradeoffs.

您可以通过添加一个或多个 class_PhysicsBody`作为子节点来定义 :ref:`CollisionShapes <class_CollisionShape>`的形状。请注意,你必须在属性检查器面板中为碰撞形状节点添加一个:ref:`class_Shape resource

注解

当你将多个碰撞形状添加到一个PhysicsBody中时,你不必担心它们会重叠,它们不会相互 "碰撞"。

Primitive collision shapes

Godot provides the following primitive collision shape types:

您可以使用一个或多个原始形状来表示大多数较小物体的碰撞。然而,对于更复杂的物体,如大型船舶或整个水平面,你可能需要凸形或凹形来代替。下面会有更多的介绍。

建议动态对象使用原始形状,如 RigidBodies 和 KinematicBodies,因为它们的行为是可靠的,通常也能提供更好的性能。

Convex collision shapes

:ref:`凸形碰撞形状<class_ConvexPolygonShape>`是基础碰撞形状和凹形碰撞形状之间的折衷,可以表示任何复杂的形状,但要警告的是,正如名称所示,一个单独的形状只能表示一个*凸*的形状。要用单个碰撞形状定义一个凹形对象,需要使用一个凹形碰撞形状。例如,一个金字塔是*凸*的,但一个空心盒子是*凹*的。

根据对象的复杂程度,可能要通过使用多个凸形而不是一个凹形碰撞形状来获得更好的性能。Godot可以使用*凸分解*来生成与空心物体大致匹配的凸形。请注意,在一定数量的凸形之后,就没有了这种性能优势,对于大而复杂的对象,如整个关卡,建议使用凹形代替。

您可以通过选择一个网格实例,并使用3D视图顶部的**网格**菜单从编辑器中生成一个或多个凸形碰撞形状。编辑器有两种生成模式:

  • **创建单凸碰撞同级**使用Quickhull算法,创建一个CollisionShape碰撞形状节点,并自动生成一个凸碰撞形状,由于只生成单个形状,因此提供了良好的性能,非常适合小对象。

  • **创建多个凸形碰撞同级**使用V-HACD算法。创建多个CollisionShape碰撞形状节点,每个节点都有一个凸形,由于它能生成多个形状,所以对于凹形物体来说,精度更高,但性能不佳。对于中等复杂度的对象,可能会比使用单个凹形碰撞形状更快。

Concave or trimesh collision shapes

凹形碰撞形状,也称为三角碰撞形状,可以采取任何形式,从几个到数千个三角形,凹形是最慢的选择,但也是Godot中最精确的。**除非刚体的模式是静态的,否则它不能用于KinematicBodies动态体或RigidBodies刚体。

注解

即使凹形提供了最准确的*碰撞*,但触碰信息的精度可能不如基础形状。

当不使用网络地图进行关卡设计时,凹形是关卡碰撞的最佳方法,也就是说,如果关卡有一些小细节,可能希望将这些细节排除碰撞之外,以保证性能和游戏体验,要做到这一点,可以在3D建模中建立一个简化的碰撞网格,并让Godot为其自动生成一个碰撞形状。下面会有更多的介绍

请注意,与基础形状和凸形状不同,凹形碰撞形状没有实际的 "体积",既可以将对象放置在形状的*外侧*,也可以放置在*内侧*。

您可以通过选择一个网格实例,并使用3D视口顶部的**网格**菜单从编辑器中生成一个凹形碰撞形状。编辑器提供两个选项:

  • 创建三网格静态体是个方便的选择。它创建一个包含与网格几何学匹配的凹形的静态体。

  • **创建Trimesh(三角面)碰撞同级**创建具有与网格几何体匹配的凹面形状的CollisionShape(碰撞形状)节点。

注解

假设你需要在concave collision shape(凹面碰撞形状)上做一个刚体滑动。在这种情况下,你可能会注意到,有时,刚体会向上颠簸。要解决此问题,请打开**Project (项目)>Project Setting(项目设置)**,然后启用**Physics(物理)>3d> Smooth Trimesh Collision(平滑三角面碰撞)**。

启用“smooth trimesh collision(平滑三角面碰撞)”后,请确保StaticBody(静态物体)的上只有concave shape(凹面形状)一个碰撞体,并且它位于原点而不进行任何旋转。这样,RigidBody(刚体)应该在StaticBody(静态物体)上完美地滑动。

参见

Godot可以为导入的3D场景自动生成碰撞形状。 请参阅文档中的 导入提示

Performance caveats

每个PhysicsBody(物理体)不限于一个碰撞形状。尽管如此,我们还是建议尽量减少碰撞形状的数量以提高性能,特别是对于像RigidBodies (刚体)和KinematicBodies(运动体)这样的动态对象。除此之外,避免translating(平移)、rotating(旋转)或scaling(缩放)碰撞形状,可以提高物理引擎运行效率。

在静态体中使用单个非转换碰撞形状时,引擎的宽相位算法可以丢弃不活跃的物理体。这个窄相只需考虑到活跃物体的形状。如果一个StaticBody有许多碰撞形状,那么宽相位就会失败。较慢的窄相位必须对每个形状执行碰撞检查。

如果遇到性能问题,您可能需要在准确性方面进行权衡。大多数游戏都没有100%的精确碰撞。他们找到了一些创造性的方法来隐藏它,或者在正常的游戏中让它变得不让人注意。