碰撞体
了解如何为导入到 Decentraland 的 3D 模型添加碰撞体。
要让 3D 模型与场景中的用户之间发生碰撞,你必须为模型添加碰撞器。没有碰撞器,玩家就可以像它们不存在一样穿过模型。碰撞器也是对象响应玩家指针事件或阻挡这些事件、或者被射线检测命中或阻挡射线检测所必需的。出于性能原因,碰撞器通常会单独建模为更简单的不可见几何体,其顶点数少于可见几何体。
该模型可以使用不可见几何体作为碰撞器,或者(从 SDK7 开始)你也可以直接将可见几何体指定为碰撞器。参见 3D 模型上的碰撞器 。你也可以为不同几何体分配不同的碰撞层,以分别控制玩家物理、指针事件以及其他自定义层,参见 3D 模型上的碰撞器 .
碰撞器不会影响模型和实体之间的交互,它们总是可以重叠。碰撞器只会影响模型与玩家头像的交互。
要让一个对象在 Decentraland 场景中被识别为碰撞器,只需以特定方式命名即可。对象名称末尾必须包含后缀 “_collider”。
例如,要为路灯创建碰撞器,你可以创建一个包围其杆身的简单盒子对象。场景中的玩家不会看到这个盒子,但它会阻挡他们的路径。

在这种情况下,我们可以将盒子命名为 “LampPostcollider”,并将树和盒子一起导出为一个 __gltf 模型。*__collider* 标记会告知 Decentraland 世界引擎,该盒子对象属于碰撞器集合,从而使碰撞网格不可见。
无论何时玩家在你的场景中查看路灯模型,他们看到的都会是路灯的复杂模型。然而,当他们走进去时,碰到的会是盒子,而不是树。
玩家空间限制
当你设计供玩家在其中行走的模型时,需要牢记以下参考尺寸:
玩家无需跳跃即可走上最高 30 厘米的台阶
玩家无需跳跃即可走上坡度最高 45 度的斜坡
玩家可跳起最高 1.8 米
头像身高约为 1.9 米,但要考虑他们头上可能戴着帽子或其他穿戴物。
无论何时玩家在你的场景中查看树模型,他们看到的都会是树的复杂模型。然而,当他们走进你的树时,碰到的会是盒子,而不是树。
为楼梯添加碰撞器
楼梯是碰撞器对象非常常见的用例。为了让玩家能够爬楼梯,必须有一个对应的 _collider 对象,供玩家踩踏。
我们建议为楼梯碰撞器使用坡道对象,这样在上下楼梯时体验会好得多。当他们爬上你的楼梯时,看起来会像平滑地上升或下降,而不需要他们逐级“跳”上每一步。
使用坡道对象还能避免创建不必要的几何体,为其他更复杂的模型节省空间。请记住,在计算时也会将碰撞器几何体考虑在内 场景限制
创建一个坡道形状的新对象,使其大小和比例与原始楼梯相似。

将坡道对象命名为类似于 Stair_collider。其结尾必须是 _碰撞体.
将坡道对象覆盖到楼梯上,使它们占据同一空间。

将两个对象一起导出为一个 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,
🔥优化提示🔥
如果碰撞器可以用 Box、Sphere 或 Capsule 形状近似,那么请使用额外后缀,并在这三种可选变体中选择一种:_box、_sphere 或 _capsule。使用这三种形状而不是任意网格进行碰撞检测,将提升你的场景性能和加载时间 💪🚀
示例:🟢 Teater_MainWall_North_collider_box, Fountain_Statue_collider_sphere
碰撞器最佳实践
创建碰撞器时始终尽可能使用最少的三角形。 避免复制复杂对象作为碰撞器使用。简单的碰撞器能够保证良好的用户体验,并使你的场景保持在三角形限制内。
碰撞器对象不应具有任何材质,因为你场景中的玩家永远看不到它。碰撞器对玩家是不可见的。
所有碰撞器对象名称都必须以 _ 结尾碰撞体. 例如,Tree_collider.
如果你使用 _plane_** 作为碰撞器,它只会在一个方向上阻挡。** 如果你希望碰撞器能从两侧阻挡,例如用于墙壁,你需要创建两个平面,并让它们的法线朝向相反方向。
复制碰撞器对象时,要注意它们的名称。某些程序会在文件名末尾附加一个 _1 ,以避免重复,例如 tree_collider_1。以这种方式命名的对象会被 Decentraland World Engine 解释为普通对象,而不是碰撞器。
如果你添加一个不可见的
MeshCollider组件到实体中,用它来近似 3D 模型的形状,那么就可以避免添加碰撞网格。如果你配置
GLTFContainer组件使用可见几何体作为碰撞器,也可以避免添加碰撞网格。参见 3D 模型上的碰撞器 .如果你正在创建一个包含许多网格形状且每个都需要碰撞器的 3D 模型,有一些实用的插件可以帮上忙。对于 Blender,你可以使用 Blender 中的批量重命名选项****,以自动添加一个
_collider后缀到组内所有网格名称中。关于此工具的更多内容见“使用 Blender 重命名资源”部分
最后更新于