导入配置
Godot提供了多种自定义导入数据的方法,比如导入停靠面板、高级导入设置对话框和继承场景。这可以用来对导入的场景进行进一步的更改,比如调整网格、添加物理信息和添加新节点。你还可以编写一个脚本,在导入过程结束时运行代码,以执行任意的自定义操作。
请尽可能在导入前修改初始数据,而不是导入后再配置场景。这有助于最大程度降低场景在 3D 建模软件中与实际导入场景之间的差异。可参考 导出模型的注意事项 及 使用名称后缀自定义节点类型 来获取更多信息。
导入工作流程
由于 Godot 只能保存自己的场景格式(.tscn
/.scn
),Godot 无法保存原始 3D 场景文件(使用不同的格式)。由于可以避免对源文件进行意外更改,这也是一种更安全的做法。
为了允许自定义场景及其材质,Godot 的场景导入器允许不同的工作流程,视数据的导入方式而定。
这个导入过程可以通过3个不同的界面进行自定义,具体取决于你的需求:
在“文件系统”面板中单击一次 3D 场景后,可以在导入面板进行操作。
在文件系统面板中双击 3D 场景,或者在带入面板中点击**高级**按钮,就可以打开**高级导入设置**对话框。在这里你可以直接在 Godot 中对每个物体进行定制。
Import hints, which are special suffixes added to object names in the 3D modeling software. This allows you to customize per-object options in the 3D modeling software.
对于基本自定义,使用导入面板的配置就足够了。但是对于更复杂的操作(例如基于每种材质定义材质覆盖),你需要使用“高级导入设置”对话框或导入提示,亦或者同时使用两者。
使用导入面板
在文件系统面板选中一个 3D 场景之后,可以在导入面板中调整以下选项:
根类型: 被用作为根节点的节点类型。建议使用一个继承自 Node3D 的节点。否则你可能会无法直接在 3D 编辑器里面设置节点的位置。
根名称: (Root Name)导入场景中根节点的名称。在编辑器中实例化场景(或从文件系统面板拖放)时,这通常不太明显,因为在这种情况下,根节点会被重命名以匹配文件名。
应用根缩放: (Apply Root Scale)如果启用, 根缩放 将直接 应用 于网格和动画,同时保持根节点的缩放为默认值 (1, 1, 1) 。这意味着如果你稍后在导入的场景中添加一个子节点,它不会被缩放。如果禁用, 根缩放 将乘以根节点的缩放。
网格
确保切线: (Ensure Tangents)如果勾选,在导入的网格没有提供切线数据时,将会使用 Mikktspace 生成顶点的切线。但更推荐使用 3D 建模软件在导出的时候生成切线图像,而不是依赖这个选项。正确显示法线和高度贴图以及需要切线的任何材质/着色器功能都需要切线。如果你不使用需要切线的材质特性,关闭这个选项可以减少导出文件的大小,并且能更快地导入没有存储切线的 3D 文件。
生成 LOD: 如果勾选,则会生成网格的低细节的变体,这些变体将显示在远处以提高渲染性能。并非所有网格体都会受益于 LOD,特别是如果它们从未从远处渲染。禁用此功能可以减少输出文件大小并加快导入速度。请参阅 网格的细节级别(LOD) 了解更多信息。
创建阴影网格: 如果勾选,则可以在导入时生成阴影网格。这可以通过在可能的情况下将顶点接在一起来优化阴影渲染,而不会降低质量。这反过来又减少了渲染阴影所需的内存带宽。阴影网格生成当前不支持使用比源网格更低的细节级别(但阴影渲染将在相关时使用 LOD)。
光照烘焙:在 3D 场景中配置网格的全局光照模式。如果设置为 Static Lightmaps(静态光照贴图),则将网格的 GI 模式设置为 Static(静态)并在导入时生成 UV2,用于烘焙光照贴图。
光照贴图纹素大小: (Lightmap Texel Size)仅当 光照烘焙 设置为 Static Lightmaps 时可见。用来控制烘焙光照贴图上每个纹素的大小。较小的值会产生更精确的光照贴图,但代价是更大的光照贴图大小和更长的烘焙时间。
蒙皮
使用具名蒙皮: 如果勾选,则为动画使用命名的 Skins。MeshInstance3D 节点包含 3 个相关属性:指向 Skeleton3D 节点的骨架 NodePath(通常为
..
)、一个网格和一个蒙皮:Skeleton3D 节点包含一个骨骼列表,其中包括骨骼的名称、它们的姿势和休息状态、一个名称和一个父骨骼。
网格是显示网格所需的所有原始顶点数据。就网格而言,它知道如何对顶点进行加权绘制,并使用一些通常从 3D 建模软件导入的内部编号。
蒙皮包含将此网格物体绑定到此 Skeleton3D 上所需的信息。对于 3D 建模软件选择的每一个内部骨骼 ID,它都包含两个内容。首先,一个矩阵,称为绑定姿势矩阵(Bind Pose Matrix)、逆绑定矩阵( Inverse Bind Matrix),或者简称 IBM。其次,蒙皮包含每个骨骼的名称(如果启用 使用具名蒙皮 选项),或者骨骼在 Skeleton3D 列表中的索引(如果禁用了 使用具名蒙皮 选项)。
这些信息加在一起,足以告诉 Godot 如何使用骨骼 3D 节点中的骨骼姿势来渲染每个 MeshInstance3D 中的网格。请注意,每个 MeshInstance3D 都可以共享绑定,这在从 Blender 导出的模型中很常见;或者每个 MeshInstance3D 都可以使用单独的蒙皮对象,这在从其他工具(如 Maya)导出的模型中很常见。
动画
导入: 如果选中,则从 3D 场景导入动画。
FPS: 用线性插值将动画曲线烘焙为一系列点时使用的每秒帧数。建议将此值设置为与 3D 建模软件中的基准值相匹配。数值越大,动画越精确,动作变化越快,但文件大小和内存使用量也越大。由于采用了插值技术,超过 30 FPS 通常不会有太大的好处(因为动画在更高的渲染帧频下仍会显得流畅)。
修剪: 如果没有关键帧变化,则修剪动画的开头和结尾。这可以减少某些 3D 场景的输出文件大小和内存使用量,具体取决于其动画轨道的内容。
移除不可修改的轨道: 移除只包含默认值的动画轨道。这可以减少某些 3D 场景的输出文件大小和内存使用量,具体取决于其动画轨道的内容。
导入脚本
- 路径: 导入脚本的路径,该脚本可在导入过程完成后运行代码,进行自定义处理。更多信息请参阅 使用导入脚本实现自动化。
glTF
- 嵌入图像处理: 控制如何处理嵌入 glTF 场景中的纹理。 Discard All Textures (忽略所有纹理)不会导入任何纹理,如果你想在 Godot 中手动设置材质,该选项将非常有用。 Extract Textures (提取纹理)将纹理提取到外部图像中,从而减小文件大小,并对导入选项进行更多控制。 Embed as Basis Universal (嵌入为基础通用)和 Embed as Uncompressed (嵌入为未压缩)分别将纹理嵌入已导入的场景中,并对 VRAM 进行压缩和不压缩。
FBX
Importer Which import method is used. ubfx handles fbx files as fbx files. FBX2glTF converts FBX files to glTF on import and requires additonal setup. FBX2glTF is not recommended unless you have a specific rason to use it over ufbx or working with a different file format.
Allow Geometry Helper Nodes enables or disables geometry helper nodes
Embedded Texture Handling: Controls how textures embedded within fbx scenes should be handled. Discard All Textures will not import any textures, which is useful if you wish to manually set up materials in Godot instead. Extract Textures extracts textures to external images, resulting in smaller file sizes and more control over import options. Embed as Basis Universal and Embed as Uncompressed keeps the textures embedded in the imported scene, with and without VRAM compression respectively.
使用高级导入设置对话框
你看到的第一个选项卡是场景选项卡。右侧面板中的选项与“导入”面板相同,但是你还可以看到 3D 预览。按住鼠标左键并拖动鼠标就能够旋转 3D 预览。缩放可以通过鼠标滚轮调整。
配置节点导入选项
在场景选项卡中,可以在左侧的树状视图中单独选中构成场景的节点:
这样就会出现针对节点的导入选项:
跳过导入:勾选后,该节点不会出现在最终导入的场景中。启用这个选项会禁用其他所有选项。
生成 > 物理:勾选后,会生成一个 PhysicsBody3D 父节点,碰撞形状会作为该 MeshInstance3D 节点的兄弟节点。
生成 > 导航网格:勾选后,会生成一个 NavigationRegion3D 子节点用于进行导航。Mesh + NavMesh 会保持原有网格可见,而 NavMesh Only 则只会导入导航网格(不带可视化表示)。NavMesh Only 应该在手动制作了用于导航的简化网格时使用。
生成 > 遮挡器:勾选后,会生成一个 OccluderInstance3D 兄弟节点用于进行遮挡剔除,会使用网格的几何体作为遮挡器形状的基础。Mesh + Occluder 会保持原有网格可见,而 Occluder Only 则只会导入遮挡器(不带可视化表示)。Occluder Only 应该在手动制作了用于遮挡剔除的简化网格时使用。
仅当启用上述某些选项时,这些选项才可见:
物理 > 实体类型: 仅在启用 生成 > 物理 后可见。控制创建的PhysicsBody3D: Static 即创建 StaticBody3D, Dynamic 创建 RigidBody3D , Area 创建 Area3D。
物理 > 形状类型: 仅在 生成 > 物理 启用时可见。 Trimesh (三角网格)可实现精确的三角形碰撞,但是它只能与 Static 主体类别一起使用。其他类型精度较低,可能需要手动配置,但可以用于任何实体类型。对于静态几何体,请使用 Trimesh 。 对于动态几何体, 尽可能使用图元,以获得更好的性能, 如果形状较大且复杂,则可以使用其中一种凸分解模式。
拆分 > 高级: 仅当 物理 > 形状类型 为 Decompose Convex (凸面分解)时可见。如果选中,则可以调整高级拆分选项。如果禁用,则只能调整预设的 精度 (通常就足够了)。
拆分 > 精度: 仅当 物理 > 形状类型 为 Decompose Convex 时可见。控制用于凸面分解的精度。数值越高,碰撞的细节越多,但生成速度会变慢,物理模拟时的 CPU 占用率也会增加,为提高性能,建议在使用时尽可能降低该值。
Occluder > Simplification Distance: Only visible if Generate > Occluder is set to Mesh + Occluder or Occluder Only. Higher values result in an occluder mesh with fewer vertices (resulting in decreased CPU utilization), at the cost of more occlusion culling issues (such as false positives or false negatives). If you run into objects disappearing when they shouldn’t when the camera is near a certain mesh, try decreasing this value.
配置网格和材质导入选项
在 “高级导入设置 “对话框中,有两种方法可以选择单个网格或材质:
切换到对话框左上角的 网格 或 材质 选项卡。
保留在 场景 选项卡中,但展开左侧树状视图中的选项。选择网格或材质后,会显示与 网格 和 材质 选项卡相同的信息,但显示的是树状视图而不是列表。
如果你选择了一个网格,右侧面板上将会出现不同的选项:
最常见的用例如下:
保存到文件: 将 Mesh 资源 保存到一个外部文件中(这不是一个场景文件)。通常,你不需要使用这个功能来将网格放置在一个3D场景中——相反地,你应该直接实例化 3D 场景。然而,直接访问 Mesh 资源对于特定节点很有用,例如 MeshInstance3D、 MultiMeshInstance3D 、 GPUParticles3D 或 CPUParticles3D。启用 保存到文件 后,你还需要使用出现的选项来指定一个输出文件路径。建议使用
.res
输出文件扩展名,因为它具有较小的文件大小和更快的加载速度,而.tres
用于写入大量数据时效率不高。生成 > 阴影网格: 针对 使用导入面板 中描述的场景范围导入选项 网格 > 创建阴影网格 的每个网格进行覆盖。 Default (默认)将使用场景范围的导入选项,而 Enable (启用)或 Disable (禁用)可以在特定网格上强制启用或禁用此行为。
生成 > 光照贴图 UV: 针对 使用导入面板 中描述的场景范围导入选项 网格> 光照烘焙 的每个网格覆盖。 Default (默认)将使用场景范围的导入选项,而 Enable (启用)或 Disable (禁用)可以在特定网格上强制启用或禁用此行为。在具有 Static 光烘焙模式的场景中将此设置为 Enable 相当于配置该网格使用 Static Lightmaps (静态光照贴图)。在具有 Static Lightmaps 光烘焙模式的场景中将此设置为 Disable 相当于配置该网格使用 Disable 。
生成 > LOD: 针对 使用导入面板 中描述的场景范围导入选项 网格> 生成 LOD 的每个网格进行覆盖。 Default 将使用场景范围的导入选项,而 Enable 或 Disable 可以在特定网格上强制启用或禁用此行为。
LOD > 法线拆分角度: 在生成网格 LOD 中保留几何边缘所需要的两个顶点之间的最小角度差异。如果在 LOD 生成中遇到视觉问题,减小此值可能会有所帮助(但会以更低效的 LOD 生成为代价)。
LOD > 法线合并角度: 在生成网格 LOD 中保留几何边缘所需要的两个顶点之间的最小角度差异。如果在 LOD 生成中遇到视觉问题,减小此值可能会有所帮助(但会以更低效的 LOD 生成为代价)。
如果你选择一种材质,在右侧面板中只会出现一个选项:
当选中 使用外部 并指定输出路径时,可以使用外部材质而不是原始 3D 场景文件中所包含的材质。请参阅下面的部分。
将材质提取到单独文件中
虽然 Godot 可以导入在 3D 建模软件中编辑过的材质,但默认配置可能不适合你的需求。例如:
你想要配置你所使用的 3D 应用程序不支持的材质特性。
你想要使用不同的纹理过滤模式,因为从 Godot 4.0 开始此选项是在材质中配置的(而不是在图像中)。
你想要将其中一种材质替换为完全不同的材质,例如一个自定义着色器。
为了能够在 Godot 编辑器中修改 3D 场景的材质,需要使用 外部 材质资源。
在“高级导入设置”对话框的左上角,选择 动作… > 提取材质 :
选择此选项后,选择一个文件夹来提取素材 .tres
文件,然后确认提取:
备注
提取材质后,3D 场景将自动配置为使用外部材质引用。因此,无需再在每种材质上手动启用 使用外部 来使外部 .tres
材质生效。
启用 使用外部 时,请注意,“高级导入设置”对话框将继续显示网格的原始材质(在 3D 建模软件中设计的材质)。这意味着你对材质进行的自定义在此对话框中不可见。为了预览修改后的材质,需要使用编辑器将导入的 3D 场景放置在另一个场景中。
重新导入源 3D 场景时,Godot 不会覆盖对提取材质所做的更改。然而,如果源 3D 文件中的材质名称发生更改,则原始材质和提取的材质之间的链接将会丢失。为此,你需要使用“高级导入设置”对话框,将重命名后的材质与现有提取的材质相关联。
上述操作可以在对话框的 材质 选项卡中完成。操作方法是,首先选择材质,启用 保存为文件 ,然后使用启用 保存为文件 后出现的 路径 选项指定保存路径。
使用导入脚本实现自动化
可以提供一个特殊脚本来处理导入后的整个场景。这非常适合后期处理、更换材质和用几何图形做有趣的事情等等。
通过右键单击文件系统面板并选择 新建脚本… ,创建一个不附加到任何节点的脚本。在脚本编辑器中,编写以下内容:
@tool # Needed so it runs in editor.
extends EditorScenePostImport
# This sample changes all node names.
# Called right after the scene is imported and gets the root node.
func _post_import(scene):
# Change all node names to "modified_[oldnodename]"
iterate(scene)
return scene # Remember to return the imported scene
# Recursive function that is called on every node
# (for demonstration purposes; EditorScenePostImport only requires a `_post_import(scene)` function).
func iterate(node):
if node != null:
print_rich("Post-import: [b]%s[/b] -> [b]%s[/b]" % [node.name, "modified_" + node.name])
node.name = "modified_" + node.name
for child in node.get_children():
iterate(child)
_post_import(scene: Node)
函数以导入的场景为参数(参数实际上是场景的根节点),必须返回最终使用的场景,可以是完全不同的另一个场景。
要使用你的脚本,请在导入选项卡的“导入脚本”类别下的“路径”选项中找到该脚本。
使用动画库
从 Godot 4.0 开始,可以选择从 glTF 文件导入 仅 动画,而不导入其他信息。这在某些资产管线中用于将动画与模型分开分发。比如,给多个角色使用一套动画,而每个角色不必有重复的动画数据。
那么,请在文件系统栏目中选择 glTF 文件,然后在导入栏中更改导入模式为动画库:
单击 重新导入 ,并根据提示重启编辑器。重启后, glTF 文件将作为 AnimationLibrary 导入,而不是 PackedScene 。然后,可以使用 AnimationPlayer 节点引用此动画库。
更改导入模式为动画库后,可见的导入选项与使用场景导入模式时相同。有关更多信息,请参阅 使用导入面板 。
过滤脚本
可以使用特殊语法指定过滤器脚本, 以决定应保留哪些动画的哪些轨道.
过滤脚本对每个导入的动画执行。语法由两种类型的语句组成,第一种用于选择要过滤的动画,第二种用于过滤匹配动画中的单个轨道。所有名称模式都使用不区分大小写的表达式匹配,并支持 ?
和 *
通配符(底层使用 String.matchn() )。
脚本必须以动画过滤器语句开头(如以 @
开头的行表示)。例如,如果我们想要将过滤器应用在所有以 "_Loop"
结尾的导入动画上:
@+*_Loop
类似地,还可以在同一行中添加其他模式,以逗号分隔。下面是一个修改后的例子,它额外包含所有名称以 "Arm_Left"
开头的动画,同时排除所有名称以 "Attack"
结尾的动画:
@+*_Loop, +Arm_Left*, -*Attack
在动画选择过滤器语句之后, 我们添加轨道过滤模式来指示保留或丢弃哪些动画轨道. 如果未指定轨道过滤器模式, 则匹配动画中的所有轨道都会被丢弃!
需要注意的是, 轨道过滤器表达式是按顺序作用于动画中的每条轨道, 这意味着, 一行表达式可能包含某个轨道, 但后续的规则仍然可以忽略它. 同样, 一个被之前规则排除的轨道, 可能被过滤器脚本后续的规则重新包含进来.
例如:包含动画中所有名字以 "_Loop"
结尾的轨道,但忽略任何以 "Control"
结尾的 "Skeleton"
轨道,除非它们的名字中有 "Arm"
:
@+*_Loop
+*
-Skeleton:*Control
+*Arm*
在上面的示例中,像 "Skeleton:Leg_Control"
这样的轨道会被丢弃,而像 "Skeleton:Head"
或 "Skeleton:Arm_Left_Control"
这样的轨道会被保留。
任何不是以 +
或 -
开头的轨道过滤器行将会被忽略.
存储
默认情况下, 动画保存为内置. 可以将它们保存到一个文件中. 这允许向动画添加自定义轨道并在重新导入后保留它们.
优化
导入动画时, 会运行优化程序, 从而大大减少动画的大小. 一般情况下, 除非你怀疑动画可能因启用而被破坏, 否则应始终启用此功能.
剪辑
可以指定单个时间轴中的多个动画作为剪辑. 这样做的话, 模型必须只有一个命名为 default
的动画. 为了创建剪辑, 把剪辑数量改成比0大的数. 然后可以修改剪辑名字, 指定开始和结束帧, 选择动画是否循环.
场景继承
在许多情况下,可能需要手动修改导入的场景。默认情况下,不太可能,因为如果源 3D 资产更改, Godot 将重新导入整个场景。
然而,可以使用场景继承来创建本地修改。如果你尝试使用场景 > 打开场景… 或场景 > 快速打开场景… 来打开已导入的场景,以下对话框将会出现:
在继承场景中,修改的唯一限制是:
无法删除基础场景中的节点,但可以在任何地方添加其他节点。
子资源无法被编辑(如上所述它们将保存在外部)。
除此之外,一切都是允许的。