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 具有 3D 位置、旋转、缩放轨道(本文称这些轨道为“变换”轨道),其节点路径指向骨骼,用于骨架骨骼动画。这意味着仅仅通过使用相同的骨骼名称是无法在多个骨架之间共享动画的。

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

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

备注

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

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

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

重定向选项

骨骼映射

在高级场景导入菜单中选中 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 中,这意味着要删除除 RootHips 之外的位置轨道。自 Godot 4.0+ 起,动画在变换值中包含放松姿势。如果禁用此选项,动画可能会意外地改变身体形状。

未映射骨骼

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

骨骼命名器

重命名骨骼

重命名映射的骨骼。

唯一节点

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

放松修复器

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

  • 人形物体呈 T 形姿势

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

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

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

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

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

应用节点变换

如果没有正确导出资产进行共享,导入的骨骼可能会将Transform作为节点。例如,从 Blender 导出的但没有执行 "应用变换"的glTF就是这样的情况。看起来模型与定义相符,但内部Tranforms与定义不同。此选项可通过在导入时应用变换来修复此类模型。

备注

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

归一化位置轨道

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

对于 SkeletonProfileHumanoidscale_base_bone 是“臀部”,因此臀部的高度用作 motion_scale

覆盖轴

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

备注

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

修复剪影

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

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

../../_images/retargeting4.webp

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