Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

3D 骨架重定向

在多个骨架之间共享动画

Godot 用于骨架(Skeleton)骨骼动画的 3D 位置、旋转、缩放轨道(本文档称这些轨道为“变换”轨道)含有指向骨骼的节点路径。这意味着仅仅使用相同的骨骼名称是无法在多个骨架之间共享动画的。

Godot 允许骨骼与骨骼之间存在父子关系,每个骨骼都可以具有旋转、缩放、位置等属性,这意味着即使名称相同的骨骼仍然可以具有不同的变换值。

骨架(Skeleton)会将默认姿势所必须的变换值存储为放松姿势(Bone Rest)。如果骨骼姿势(Bone Pose)等于放松姿势,那么这个骨架就处于默认姿势。

备注

Godot 3 和 Godot 4 的骨骼姿势行为是不同的。在 Godot 3 中,骨骼姿势是以 放松姿势为基准的相对值,而在 Godot 4 中,骨骼姿势包括了放松姿势。具体见这篇文章

骨骼模型具有不同的放松姿势,具体取决于导出的环境。例如,Blender 输出的 glTF 模型的骨骼会将“编辑骨骼方向”作为放松姿势的旋转。然而有些骨骼模型是没有任何放松姿势旋转的,比如 Maya 输出的 glTF 模型。

要在 Godot 中共享动画,放松姿势和骨骼名称都需要相匹配,从而在某些情况下删除不需要的轨道。这可以使用场景导入器来实现。

重定向选项

骨骼映射

在高级场景导入菜单中选中 Skeleton3D 节点时,右侧将出现一个菜单,其中包含“重定向”部分。重定向部分只有一个属性:bone_map(骨骼映射)。

../../_images/retargeting1.webp

选中骨架节点后,请先设置一个新的 BoneMapSkeletonProfile。Godot 有一个用于人形模型的预设,名为 SkeletonProfileHumanoid。本教程假设你使用的就是 SkeletonProfileHumanoid

备注

如果需要不同于 SkeletonProfileHumanoid 的配置文件,你可以通过选择 Skeleton3D 并使用 3D 视口工具栏中的 Skeleton3D 菜单从编辑器中导出一个 SkeletonProfile

使用 SkeletonProfileHumanoid 时,会在设置 SkeletonProfile 时执行自动映射。如果自动映射的效果不佳,你也可以手动映射骨骼。

../../_images/retargeting2.webp

缺失、重复以及不正确的父子关系映射都会显示为洋红色/红色按钮(取决于编辑器设置)。这些问题不会阻止导入过程,但会警告动画可能无法正确共享。

备注

自动映射会对骨骼名称进行模式匹配。所以建议骨骼使用常见的英文名称。

设置 bone_map 后,以下部分中提供了多个选项。

../../_images/retargeting3.webp

移除轨道

如果要将资源导入为用于共享的 AnimationLibrary,那么我们建议启用这些选项。而如果要将资源导入为场景,某些情况下应该禁用这些选项。例如导入带有动画配件的角色时,这些选项可能会导致配件没有动画。

仅保留骨骼变换

删除动画中除骨骼变换轨道之外的所有轨道。

非重要位置

删除动画中除了在 SkeletonProfile 中定义过的 root_bonescale_base_bone 以外的位置轨道。在 SkeletonProfileHumanoid 中,这意味着删除“Root”和“Hips”之外的位置轨道。自 Godot 4 起,动画在变换值中包含放松姿势。如果禁用此选项,动画可能会意外地改变身体形状。

未映射骨骼

删除动画中未被映射骨骼的变换轨道。

骨骼命名器

重命名骨骼

重命名映射的骨骼。

唯一节点

使骨架成为唯一名称节点,名称在 skeleton_name 中指定。这使得动画轨道路径能够独立于场景层次结构保持一致。

放松修复器

SkeletonProfileHumanoid 中定义参考姿势有以下规则:

  • 人形物体呈 T 形姿势

  • 人形物体在 Y 朝上的右手坐标系中面向 +Z

  • 人形物体不应该有变换节点

  • 将 +Y 轴从父关节指向子关节

  • +X 旋转使关节像肌肉收缩一样弯曲

这些规则为混合动画和反向动力学(IK)提供了便捷的定义。如果你的模型与此定义不符,则需要用这些选项来进行修正。

应用节点变换

如果资产在导出时没有考虑到共享,导入的骨架可能会有用于变换的节点。例如,从 Blender 导出的没有执行“应用变换”的 glTF 就是这样的情况。模型看起来与定义相符,但内部的变换与定义不同。此选项可通过在导入时应用变换来修复此类模型。

备注

如果导入的场景包含骨架以外的其他对象,该选项可能会产生负面影响。

归一化位置轨道

位置轨道主要用于模型的移动,但在不同高度的模型之间共享移动动画可能会由于步长的差异而导致滑步现象。该选项会根据 scale_base_bone 的高度归一化位置轨道。scale_base_bone 高度作为 motion_scale 存储在骨架中,归一化的位置轨道值在播放时将乘以该值。如果禁用此选项,则位置轨道不会被归一化,导入后骨架的 motion_scale 始终为 1.0

对于 SkeletonProfileHumanoidscale_base_bone 是“髋部”(Hips),因此髋部的高度被用作 motion_scale

覆盖轴

通过覆盖模型的放松姿势来统一模型的放松姿势,以匹配 SkeletonProfile 中定义的参考姿势。

备注

该选项是 Godot 4 中共享动画最重要的选项,但请注意,如果外部设置的原始放松姿势很重要,此选项可能会产生糟糕的结果。如果你想在保留原始放松姿势的情况下共享动画,请考虑使用实时重定向模块

修复剪影

这会尝试让模型的剪影与 SkeletonProfile 中定义的参考姿势相匹配,例如 T-Pose。该功能无法修复差异太大的剪影,并且可能对修复骨骼滚动不起作用。

使用 SkeletonProfileHumanoid 时,不需要为 T-Pose 模型启用此选项,但应为 A-Pose 模型启用。然而在这种情况下,根据模型的脚跟高度,修复后脚部的结果有可能会很糟糕,所以你可能需要在 filter 数组中添加你不希望修复的 SkeletonProfile 中的骨骼名称,如下例所示。

../../_images/retargeting4.webp

此外,对于膝盖或脚弯曲的模型,可能需要调整 scale_base_bone 高度。为此可以使用 base_height_ adjustment 选项。