导入三维场景

Godot场景导入器

在处理3D资产时,Godot有一个灵活且可配置的导入程序。

Godot与 场景 . 这意味着在您最喜欢的3D DCC中正在处理的整个场景将尽可能靠近传输。

Godot支持以下3D 场景文件foomats

  • dae(collada),这是目前最成熟的工作流。

  • GLTF 2.0.支持文本和二进制格式。Godot完全支持它,但是它的格式是新的,并且越来越有吸引力。

  • OBJ(波阵面)格式。它也是完全支持的,但相当有限(不支持枢轴、骨架等)。

  • ESCN,一种特定于godot的格式,Blender可以用插件导出。

只需将场景文件和纹理一起复制到项目存储库中,Godot将进行完整导入。

导出时,网格不受骨骼变形非常重要。在使用您最喜欢的3D编辑器导出之前,请确保骨架重置为T形姿势或默认静止姿势。

为什么不FBX?

大多数游戏引擎使用FBX格式导入3D场景,这无疑是业内最标准的一种。但是,此格式要求使用来自Autodesk的封闭库,该库的分发使用的许可条款比Godot更为严格。

计划在将来的某个时候提供一个使用gdantive的二进制插件。

从maya和3dsmax中导出dae文件

欧特克为玛雅和3dsmax添加了内置的collada支持,但默认情况下它会被破坏,不应使用。导出此格式的最佳方法是使用 OpenCollada 插件。它们工作得很好,尽管它们并不总是最新版本的软件。

从Blender导出DAE文件

搅拌机也有内置的collada支持,但它也坏了,不应该使用。

Godot提供了 Python Plugin 这样可以更好地导出场景。

从搅拌机导出gltf 2.0文件

有三种方法可以从Blender导出GLTF文件。作为gltf二进制 (.glb 文件),GLTF嵌入 (.gltf 文件),并带有纹理 (gltf + .bin +纹理)。

gltf二进制文件是这三个选项中最小的。它们包括在搅拌机中设置的网格和纹理。当引入godot时,纹理是对象材质文件的一部分。

gltf嵌入文件的功能与二进制文件相同。它们在godot中不提供额外的功能,也不应该使用,因为它们有更大的文件大小。

有两个原因可以使用纹理分离的gltf。一种是将场景描述以基于文本的格式保存,将二进制数据保存在单独的二进制文件中。如果要查看基于文本格式的更改,这对于版本控制很有用。第二个问题是,需要将纹理文件与材质文件分开。如果您不需要这些gltf二进制文件中的任何一个都可以。

注解

Blender不使用gltf文件导出发射纹理。如果您的模型使用一个,它必须单独引入。

从搅拌机导出ESCN文件

最强大的一个,叫做 godot-blender-exporter . 它使用一个.escn文件,这是.tscn文件(godot scene文件)的另一种名称;它尽可能多地保存来自搅拌机场景的信息。

ESCN出口商有一个详细的 document 描述其功能和用法。

导入工作流

Godot场景导入器允许有关如何导入数据的不同工作流。根据许多选项,可以使用以下选项导入场景:

  • 外部材料(默认):每个材料保存到文件资源的位置。保留对它们的修改。

  • 外部网格:每个网格保存到不同的文件中。许多用户喜欢直接处理网格。

  • 外部动画:允许在源更改时修改和合并保存的动画。

  • 外部场景:将导入场景的每个根节点保存为单独的场景。

  • 单一场景:内置所有内容的单一场景文件。

../../../_images/scene_import1.png

由于不同的开发人员有不同的需求,这个导入过程是高度可定制的。

导入选项

进口商有几种选择,将在下面讨论:

../../../_images/scene_import2.png

结点

根类型

默认情况下,导入场景中根节点的类型为“空间”,但可以修改。

根名称

允许为生成的根节点设置特定名称。

根刻度

根节点的比例。

自定义脚本

可以提供在导入后处理整个场景的特殊脚本。这对于后期处理、更改材料、对几何图形进行有趣的处理等都非常有用。

创建这样的脚本:

tool # needed so it runs in the editor
extends EditorScenePostImport

func post_import(scene):
  # do your stuff here
  return scene # remember to return the imported scene

这个 post_import 函数将导入的场景作为参数(参数实际上是场景的根节点)。最终使用的场景必须返回。它可以是另一个。

保管部

默认情况下,godot导入单个场景。此选项允许指定根下的节点将分别是一个单独的场景并实例化到导入的场景中。

当然,在其他地方手动创建这样的导入场景也是可行的。

材料

位置

Godot支持网格或节点中的材质。默认情况下,材质将放置在每个节点上。

保管部

材质可以存储在场景中或外部文件中。默认情况下,它们存储在外部文件中,因此可以编辑它们。这是因为大多数3D DCC与Godot中的材质选项不同。

当材质是内置的时,每次修改和重新导入源场景时,它们都会丢失。

继续重新导入

一旦对材质进行编辑以使用Godot功能,导入器将保留编辑的功能,并忽略源场景中的功能。仅当材质保存为文件时,此选项才存在。

网格

压缩

使网格在网格的多个方面使用较低精度的数字以节省空间。

这些是:
  • 转换矩阵(位置、旋转和缩放):32位浮点到16位有符号整数。

  • 顶点:32位浮点到16位有符号整数。

  • 正常值:32位浮点到32位无符号整数。

  • 切线:32位浮点到32位无符号整数。

  • 顶点颜色:32位浮点到32位无符号整数。

  • uv:32位浮点到32位无符号整数。

  • uv2:32位浮点到32位无符号整数。

  • 顶点权重:32位浮点到16位无符号整数。

  • 电枢骨架:32位浮点到16位无符号整数。

  • 数组索引:32位或16位无符号整数,基于元素的数量。

其他信息:
  • uv2=细节纹理和烘焙光照贴图纹理的第二个UV通道。

  • 数组索引=对上面数组的每个元素进行编号的数字数组;即它们对顶点和法线进行编号。

在某些情况下,这可能会导致精度损失,因此可能需要禁用此选项。例如,如果一个网格非常大,或者导入的多个网格覆盖了一个很大的区域,压缩该网格的导入可能会导致几何体中的间隙或顶点不在它们应该在的位置。

确保切线

如果要使用具有法线映射的纹理,则网格需要有相切数组。此选项确保在源场景中不存在时生成这些。Godot使用米克特空间,但最好是在出口商中生产。

保管部

网格可以存储在单独的文件(资源)中,而不是内置的。这没有太多实际的用途,除非你想直接用它们来构建对象。

此选项用于帮助那些喜欢直接使用网格而不是场景的用户。

光烘烤

网格是否用于烘焙的光照贴图。

  • 禁用: 网格不用于烘焙的光照贴图。

  • 启用: 网格用于烘焙的光照贴图。

  • 通用光照图: 网格用于烘焙光照贴图,并为光照贴图打开第二个UV层。

注解

有关光烘焙的详细信息,请参见 烘焙光照图 .

外部文件

生成的网格和材质可以选择存储在具有场景名称的子目录中。

动画选项

Godot提供了许多关于如何处理动画数据的选项。某些导出器(如Blender)可以在单个文件中生成许多动画。其他动画(如3ds Max或玛雅)需要将许多动画放入同一时间轴,或者最坏情况下,将每个动画放入单独的文件中。

../../../_images/scene_import3.png

默认情况下启用动画导入。

FPS

大多数3D导出格式以秒而不是帧存储动画时间线。为确保动画尽可能真实地导入,请指定用于编辑动画的每秒帧数。不这样做可能会导致不稳定的动画。

筛选脚本

可以用一种特殊的语法指定一个过滤器脚本来决定哪些轨迹应该保留动画。(@todo这需要文档)

保管部

默认情况下,动画保存为内置的。可以将它们保存到文件中。这允许向动画添加自定义轨迹并在重新导入后保留它们。

优化器

导入动画后,将运行优化器,这将大大减小动画的大小。通常,除非您怀疑动画可能因启用而中断,否则应始终启用该选项。

剪辑

可以将单个时间线上的多个动画指定为剪辑。指定每个剪辑必须从哪个帧拍摄到哪个帧(当然,不要忘记指定上面的fps选项)。

场景继承

在许多情况下,可能需要对导入的场景进行修改。默认情况下,这是不可能的,因为如果源资产发生变化(源 .dae.gltf.obj 从3D建模应用程序中重新导出文件),Godot将重新导入整个场景。

但是,可以使用 场景继承 . 尝试打开导入的场景,将出现以下对话框:

../../../_images/scene_import4.png

在继承的场景中,修改的唯一限制是:

  • 无法删除节点(但可以添加到任何位置)。

  • 无法编辑子资源(请按照上面的说明将其保存在外部)

除此之外,一切都是允许的!

导入提示

很多时候,在编辑场景时,需要在导出之后完成一些常见任务:

  • 向对象添加碰撞检测

  • 将对象设置为导航网格

  • 删除游戏引擎中未使用的节点(如用于建模的特定灯光)

为了简化这个工作流程,Godot提供了一些后缀,可以添加到3D建模软件中对象的名称中。导入后,godot会自动检测并执行以下操作:

删除节点(-noimp)

具有此后缀的节点名将在导入时删除,无论其类型如何。它们不会出现在导入的场景中。

创建冲突(-col、-colonly、-concolonly)

选项“-col”仅适用于网格节点。如果检测到,将使用与网格相同的几何体添加子静态碰撞节点。

然而,通常情况下,视觉几何图形太复杂或太不平滑,无法进行碰撞,最终无法正常工作。

为了解决这个问题,存在“-colonly”修饰符,它将在导入时移除网格并创建一个 StaticBody 相反,碰撞。这有助于分离视觉网格和实际碰撞。

选项“-concolonly”将创建一个 ConvexPolygonShape 而不是 ConcavePolygonShape .

选项“-colonly”也可以用于搅拌机的空对象。导入时,它将创建一个 StaticBody 将碰撞节点作为子节点。碰撞节点将具有许多预定义形状中的一个,具体取决于搅拌机的空绘制类型:

../../../_images/3dimp_BlenderEmptyDrawTypes.png

为了在Blender的编辑器中获得更好的可见性,用户可以在碰撞清空时设置“X射线”选项,并在用户首选项/Themes/3D View/Empty中为它们设置一些不同的颜色。

创建导航(-navmesh)

具有此后缀的网格节点将转换为导航网格。将删除原始网格节点。

创建车身(车辆)

具有此后缀的网格节点将作为子节点导入到 VehicleBody 节点。

创建车辆车轮

具有此后缀的网格节点将作为子节点导入到 VehicleWheel 节点。

刚性体(刚性)

从该网格创建刚体。

动画循环(-loop,-cycle)

collada文档中以标记“loop”或“cycle”开始或结束的动画片段将作为带有loop标志集的godot动画导入。这是区分大小写的,不需要连字符。

在Blender中,这需要使用NLA编辑器并用“loop”或“cycle”前缀或后缀命名操作。