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

网格

了解导入到 Decentraland 的 3D 模型支持哪些网格属性。

3D 模型有一个 网格 由三角形 面组成。这些面彼此相接于 边 (它们接触的线)以及 顶点 (它们角点相交的点)。

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

空间限制

场景中的所有 3D 模型都必须位于其地块限制范围内。如果在预览运行时,模型的任何部分超出这些限制,那么超出的部分将被截断且不会渲染。



在 Creator Hub 编辑器中,你会看到模型被标红,其包围盒也以红色标出。



📔 注意:在较旧的 Decentraland Web 客户端中,出于性能原因,如果 3D 模型的任何部分超出边界,即使只是包围盒,整个模型也不会被渲染。自 Decentraland 2.0 桌面客户端起,只有超出边界的模型部分会被截断。模型中位于场景内的部分会被渲染。

包围盒

如果你的模型的所有顶点都整齐地位于场景区域内,但其包围盒很大且大部分为空,并延伸到场景限制之外,那么在 Creator Hub 中整个模型都会被标记为超出场景限制。模型中位于你的地块内的部分会被正确渲染,并且你仍然可以发布你的场景。

每个网格都有一个包围盒,它围绕着形状的边界。为了让 3D 模型在 Decentraland 中更易用,请确保它的包围盒不要比必要范围更大地超出模型。

为避免这个问题,你可以清理你的 3D 模型,重置网格的位置和旋转,使包围盒不会超出它们所包裹的网格。



在 Blender 中,你可以通过选择对象,按 Ctrl+A,然后应用“全部变换”来做到这一点。

例如,在旋转模型边缘附近的一个子网格时要谨慎。由于包围盒是立方体,即使网格是圆形的,在将其旋转 45° 后,其包围盒的角也可能会伸出去。



我们建议你对模型中的每个网格烘焙其旋转和缩放,以确保没有不必要的包围盒超出其应有大小。

三角面限制

由于 Decentraland 是一个开放世界,充满不同的场景和对象,这些内容会在同一 3D 空间中动态下载,因此优化我们的网格以在游玩时获得良好性能非常重要。在这方面,关于网格有一些我们始终需要牢记的场景限制:

n 表示一个场景占用的地块数量。

  • 三角面: n x 10000 场景中所有模型的三角面总数。

  • 高度: 330 米,不受地块数量影响。

  • 文件大小: 每个地块 15 MB - 最大 300 MB 上传到内容服务器的文件总大小。包括 3D 模型和音频。不包括未上传的文件,例如 node.js 包。

  • 单个文件最大 50 MB 场景中任何类型的单个文件都不能超过 50 MB,无论场景有多少地块。

更多信息请查看全部场景限制 这里。

大型场景中的网格

在创建网格时,我们应牢记这 2 条最佳实践:

  • 模块化: 将大型网格拆分为更小的模块化部分。例如,不要为整栋建筑使用单一网格,而可以将建筑拆分为各个墙面、地板和建筑不同部分的独立网格。这样可以让 Unity 的视锥裁剪更有效地工作,因为只需要考虑可见部分进行渲染。它还会改善内存占用,因为同一个网格可以在不同位置被重复使用多次用于同一对象(要做到这一点,你需要在 SDK7 场景定义中引用同一个网格,或者在从 Blender 导出场景时使用实例而不是重复对象)。

  • 包围体积:确保每个对象的包围体积尽可能贴合。包围体积中的多余空间会导致对象在不可见时仍被渲染。



什么是视锥裁剪?

视锥裁剪是一种优化技术,它会禁用位于摄像机视野之外对象的渲染器(网格)。请看以下两个示例:



一个类似迷宫的室内关卡。这个普通场景视图显示所有可见的游戏对象。



常规视锥裁剪只渲染摄像机视野内的对象。这是自动的,并且始终会发生。

实例化对象 vs 复制对象

在 Blender 中,复制对象会创建该对象的一个完全独立副本,而实例化对象会创建一个与原始对象共享相同数据的副本。

当对象被复制时,它会创建一个带有完全独立数据集的新对象,包括其所有几何体、材质和动画。这意味着对原始对象所做的任何更改都不会反映到复制对象上,反之亦然。

另一方面,当对象被实例化时,对原始对象所做的任何更改都会反映到其所有实例上,反之亦然。这是因为所有实例共享相同的底层数据。

就性能而言,实例化通常比复制高效得多,尤其是在处理复杂场景或大量对象时。因为实例化比复制占用更少内存,它不会为每个实例创建新数据。此外,实例化还可以让 Blender 通过将所有实例视为单个对象来优化渲染过程,而不是分别渲染每个副本。

总的来说,实例化是一个强大的工具,可以提高 Blender 以及你的 Decentraland 场景中的性能和工作流效率,尤其是在处理大型复杂场景时。



在某些情况下,当复制树木、植物和路灯这类对象时,与直接复制相比,实例化可以显著提升性能。例如,这个场景有十四个路灯,它们都完全相同。我们知道每个路灯有两种不同的纹理,一种用于灯杆,另一种用于灯光。因此在这种情况下,我们会有两次绘制调用,每种纹理一次。



在 Blender 中,当你处于在空间中克隆并定位元素的阶段时,你有三种选择:复制、实例化或合并对象。

让我们分析一下每种方法的优缺点。

复制对象

菜单:
对象 ‣ 复制对象

快捷键:

Shift-D

这会创建所选对象在视觉上相同的副本,但它们会被视为不同的对象。因此在导出时,每个对象会有 2 次绘制调用,2 * 14 = 28 次绘制调用,磁盘总占用为 320kb。



实例化对象

面板:
工具栏 ‣ 工具 ‣ 编辑 ‣ 复制链接

菜单:

对象 ‣ 复制链接

快捷键:

Alt-D

这会创建一个新对象,其所有数据都链接到原始对象。如果你在编辑模式下修改其中一个链接对象,所有链接副本都会被修改。变换属性仍然保持为副本而不是链接,因此你仍然可以自由旋转、缩放和移动,而不会影响其他副本。



当我们导出这些模型时,绘制调用次数仍然相同(28)。不过请注意,现在我们只有一个网格,这显著减少了磁盘占用(41 kb)。



为了保持条理,你可以简单地在场景中实例化集合,这样你就可以从一个单独的文件夹和源来控制所有实例。

💡 提示:同样的逻辑也适用于 SDK 端。十四个实体都指向它们的 GltfContainer 相同的 .glb 文件时,其行为就像实例:文件只下载一次,只转换一次,而且无论有多少实体使用它,其网格和纹理都只会在内存中保留一份。将相同内容拆分成十四个几乎相同的 .glb 文件,相当于复制,这会带来十四次下载和内存中的十四份副本。

合并对象

菜单:
对象 ‣ 合并

快捷键:

Ctrl-J

这会将所选对象合并为一个带有单一网格的对象。它在对象模式下工作,将所有内容合并到最后选中的 活动 对象中,并要求所有选中的对象类型相同。材质会被保留并合并,因此我们那十四个路灯不再是十四个可渲染对象,而变成一个,渲染引擎只需 2 次绘制调用而不是 28 次——每种材质一次。

这是这三种选项中唯一真正减少绘制调用次数的方法,而且为什么要这样说很值得讲清楚:Decentraland 引擎在运行时会根据流式内容构建你的场景,因此它不能像某些引擎那样替你对重复对象进行分组或批处理。若你需要更少的绘制调用,合并必须在 Blender 中完成。

这种减少不是免费的。合并会同时放弃好几样东西:

  • 磁盘占用会再次上升。 合并后的网格会存储全部十四个路灯的几何体,因此你失去了实例化带来的节省。

  • 视锥裁剪变成要么全部要么没有。 只要合并对象的任何部分出现在屏幕上,它就会被完整绘制。沿街分布的十四个路灯几乎总会有一个路灯可见,所以你最终会一直绘制全部十四个——这很容易比你节省下来的绘制调用更耗费性能。

  • 这些部分不再能单独操作。 你不再能够移动、制作动画、点击或隐藏单个路灯,因为现在只剩一个对象了。

请谨慎使用合并:适用于许多小型装饰物、它们总是在同一地点一起出现、不会被交互,而且只有在你确认对象数量确实在拖慢性能之后。对于其他情况,实例化才是更好的默认选择。

网格命名

为你的网格使用有意义的名称。名称应当说明资源使用的上下文,或它对应对象的哪个部分。

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

  • 为你的网格使用有意义的名称 示例: 🟢 优先使用 名称 - 剧院, 有轨电车 🔴 避免 名称 - 未命名.008, primitive(1), Cylinder.091, _sphere-AB

  • 使用下划线 _ 作为分隔符,为名称增加更多上下文。先放更通用的内容,具体内容放在末尾。 示例: 🟢 优先使用 名称 - 喷泉雕像, 剧院主墙, 有轨电车左轮 🔴 避免 名称 - 北_主墙_剧院, 电车_左前_轮

如果有多个同名对象,请在词语后加上数字: FountainStatue01、FountainStatue02 等。

创建模型的工具

有许多插件和外部工具可以在创建资源时帮助工作,让流程更快、更高效,其中一些是免费的,一些需要购买,举例如下:

Decimate

这是一个众所周知的修改器,可用于在保持模型表面结构的同时减少网格的三角面数量。虽然这是一个非常强大的模型优化工具,但要注意,一旦模型被简化,拓扑可能会受到影响,从而导致不良拓扑(因为它会把几何体打碎成不可预测的碎片)。另一方面,简化会把网格的四边形转换为三角形,使其在被使用后更难修改。在这方面 简化适合静态模型,但不适合动画模型。




使用简化优化网格的另一种方式,是先简化模型,然后再进行正确的重拓扑。这样你可以确保结果更可预测,并获得干净的拓扑。

一些可能有用的重拓扑插件有(其中一些是付费的):

  • Simplygon: https://www.simplygon.com/

  • Speedretopo: https://blendermarket.com/products/speedretopo?ref=2

  • Retopoflow: https://blendermarket.com/products/retopoflow

镜像修改器

Blender 中的镜像修改器是一种通过将对象的一半镜像到任意方向(X、Y、Z)来创建对称模型的工具。当你有对称模型时,它是一个很棒的工具,因为它减少了 3D 建模和 UV 展开的时间(因为你只需要展开模型的一部分,其余部分会共享相同的 UV 坐标),同时也通过避免把纹理分辨率浪费在本质上是镜像的部分上来优化你的纹理。



批量重命名

一个非常方便、可以轻松更改命名约定的工具是 Blender 内置工具箱中的批量重命名。要访问它,请前往 编辑 然后 批量重命名.



选择你想要更改名称的对象,只需将默认对象名称替换为新名称即可。此工具提供不同的方法和资源类型进行重命名,因此它在更改网格、动画、骨骼等名称时也非常灵活。




几何体最佳实践 #

  • 要注意你为 3D 模型添加了多少面,因为面越多,渲染要求就越高。请参见 场景限制 ,了解场景施加的限制。

  • 确保没有看不见但会增加三角面数量的隐藏面。

  • 对于应该有圆滑边侧的形状,将其设置为 平滑 ,而不是添加额外的面。

  • 确保所有面的 法线 都朝外而不是朝内。如果你的模型中有些面在渲染时似乎不存在,最可能的原因就是这个。

  • 烘焙网格的旋转和缩放,以便其包围盒不会不必要地向外延伸。

最后更新于