For the complete documentation index, see llms.txt. This page is also available as Markdown.

碰撞体

了解如何为导入到 Decentraland 的 3D 模型添加碰撞体。

要让 3D 模型与场景中的用户之间发生碰撞,你必须为模型添加碰撞器。没有碰撞器,玩家就可以像它们不存在一样穿过模型。碰撞器也是对象响应玩家指针事件或阻挡这些事件、或者被射线检测命中或阻挡射线检测所必需的。出于性能原因,碰撞器通常会单独建模为更简单的不可见几何体,其顶点数少于可见几何体。

💡 提示: 安装 Decentraland Tools Blender 插件。它包含一些实用功能,可帮助你编辑和导出 3D 模型、穿戴物和表情动作。

该模型可以使用不可见几何体作为碰撞器,或者(从 SDK7 开始)你也可以直接将可见几何体指定为碰撞器。参见 3D 模型上的碰撞器 。你也可以为不同几何体分配不同的碰撞层,以分别控制玩家物理、指针事件以及其他自定义层,参见 3D 模型上的碰撞器 .

碰撞器不会影响模型和实体之间的交互,它们总是可以重叠。碰撞器只会影响模型与玩家头像的交互。

要让一个对象在 Decentraland 场景中被识别为碰撞器,只需以特定方式命名即可。对象名称末尾必须包含后缀 “_collider”。

例如,要为路灯创建碰撞器,你可以创建一个包围其杆身的简单盒子对象。场景中的玩家不会看到这个盒子,但它会阻挡他们的路径。



在这种情况下,我们可以将盒子命名为 “LampPostcollider”,并将树和盒子一起导出为一个 __gltf 模型。*__collider* 标记会告知 Decentraland 世界引擎,该盒子对象属于碰撞器集合,从而使碰撞网格不可见。

无论何时玩家在你的场景中查看路灯模型,他们看到的都会是路灯的复杂模型。然而,当他们走进去时,碰到的会是盒子,而不是树。

玩家空间限制

当你设计供玩家在其中行走的模型时,需要牢记以下参考尺寸:

  • 玩家无需跳跃即可走上最高 30 厘米的台阶

  • 玩家无需跳跃即可走上坡度最高 45 度的斜坡

  • 玩家可跳起最高 1.8 米

  • 头像身高约为 1.9 米,但要考虑他们头上可能戴着帽子或其他穿戴物。

无论何时玩家在你的场景中查看树模型,他们看到的都会是树的复杂模型。然而,当他们走进你的树时,碰到的会是盒子,而不是树。

为楼梯添加碰撞器

楼梯是碰撞器对象非常常见的用例。为了让玩家能够爬楼梯,必须有一个对应的 _collider 对象,供玩家踩踏。

我们建议为楼梯碰撞器使用坡道对象,这样在上下楼梯时体验会好得多。当他们爬上你的楼梯时,看起来会像平滑地上升或下降,而不需要他们逐级“跳”上每一步。

使用坡道对象还能避免创建不必要的几何体,为其他更复杂的模型节省空间。请记住,在计算时也会将碰撞器几何体考虑在内 场景限制

  1. 创建一个坡道形状的新对象,使其大小和比例与原始楼梯相似。


  1. 将坡道对象命名为类似于 Stair_collider。其结尾必须是 _碰撞体.

  2. 将坡道对象覆盖到楼梯上,使它们占据同一空间。


  1. 将两个对象一起导出为一个 glTF 模型。

现在,当玩家在你的场景中查看楼梯时,他们看到的是更精细的楼梯模型,但当他们爬楼梯时,碰到的会是坡道。

优化碰撞器

  • 优先使用 Box, Sphere 和 Capsule 碰撞网格,因为这样在加载和运行时的性能更好。

  • 可以考虑用多个原始碰撞网格(Box/Sphere/Capsule)



示例:Ring 的碰撞器可以由多个 Capsule 或 Box 碰撞器组成

  • 将碰撞网格放在与其相关对象的层级结构中。例如,从层级结构的角度看,Spaceship_collider 可以作为 Spaceship 父对象中的子对象

凸形与凹形碰撞器

如果唯一的选择是使用任意网格碰撞器,那么请将碰撞网格做成凸形(而不是凹形)。这可以防止奇怪的物理情况,例如卡顿、卡在碰撞器内部或穿过去。注意,通常可以用多个凸网格来模拟凹网格。



碰撞命名

使用有意义的名称。名称应能体现该资源用于何处,或它关联对象的哪个部分。

在资源命名中,我们混合使用 PascalCase 和 snake_case,我们可以称之为 PascalSnake_case。基本规则如下——新词或分隔符(_)后面的词以 大写字母开头。

Collision Mesh 是在 Explorer 中创建碰撞器时用作参考的网格

  • 它遵循与上面的 Meshes 相同的原则,但在 _collider 末尾有后缀 示例: 🟢 建议 名称 - Tram_Wheel_LeftFront_collider 🔴 避免 名称 - Primitive.001_Collider, collider (1), Cylinder.007_collider,

碰撞器最佳实践

  • 创建碰撞器时始终尽可能使用最少的三角形。 避免复制复杂对象作为碰撞器使用。简单的碰撞器能够保证良好的用户体验,并使你的场景保持在三角形限制内。

  • 碰撞器对象不应具有任何材质,因为你场景中的玩家永远看不到它。碰撞器对玩家是不可见的。

  • 所有碰撞器对象名称都必须以 _ 结尾碰撞体. 例如,Tree_collider.

  • 如果你使用 _plane_** 作为碰撞器,它只会在一个方向上阻挡。** 如果你希望碰撞器能从两侧阻挡,例如用于墙壁,你需要创建两个平面,并让它们的法线朝向相反方向。

  • 复制碰撞器对象时,要注意它们的名称。某些程序会在文件名末尾附加一个 _1 ,以避免重复,例如 tree_collider_1。以这种方式命名的对象会被 Decentraland World Engine 解释为普通对象,而不是碰撞器。

  • 如果你添加一个不可见的 MeshCollider 组件到实体中,用它来近似 3D 模型的形状,那么就可以避免添加碰撞网格。

  • 如果你配置 GLTFContainer 组件使用可见几何体作为碰撞器,也可以避免添加碰撞网格。参见 3D 模型上的碰撞器 .

  • 如果你正在创建一个包含许多网格形状且每个都需要碰撞器的 3D 模型,有一些实用的插件可以帮上忙。对于 Blender,你可以使用 Blender 中的批量重命名选项****,以自动添加一个 _collider 后缀到组内所有网格名称中。关于此工具的更多内容见“使用 Blender 重命名资源”部分

最后更新于