在虚幻引擎中,骨骼动画可以通过重定向资产在不同骨骼之间共用。基于 Morph Target 的表情动画同样可以复用,但具体做法因目标模型而异。
本文着重讨论 ARKit 表情动画的复用,但介绍的方法同样适用于任意 Morph Target 动画。
准备工作
首先,我们通过道乐师 MONO 录制一段表情动画,并将其导入虚幻引擎。将道乐师的 FBX 文件导入虚幻可以参见这里的注意事项。
导入完成后,打开该动画资产,可以看到其中包含了基于 ARKit 标准的动画 Curve 数据。

要将这段动画应用到新模型上,具体做法取决于目标模型的 Morph Target 配置情况。
1. 目标模型拥有同名 Morph Target
比如下面这个 Ready Player Me 模型,就带有以 Apple 的命名标准建立的全套 ARKit Morph Target。

这种情况比较简单。只需打开目标模型的 Skeleton 资产,在 Window 菜单中选择 Asset Details。

在弹出的面板中找到 Compatible Skeletons 一栏,将道乐师表情动画对应的骨骼添加进去即可。

完成后,为目标模型创建一个动画蓝图。此时在资产浏览器中就可以看到道乐师导出的动画了。

将这个动画连接到输出节点后,你可能会发现模型突然变大或朝向改变。

这是因为道乐师表情动画的 Root 骨骼自带旋转信息,且 Scale 不为 1。播放动画时,这些数据也会被应用到最终的骨骼姿态上,导致模型整体发生形变。

解决方法是在动画蓝图中使用 Layered Blend per Bone 节点。将表情动画作为 Base Pose 输入,Blend Poses 0 留空。同时,在该节点的 Layer Setup 下的 Branch Filters 中添加目标模型的根骨骼,这个 Ready Player Me 模型的根骨骼名为 Hips。

这个节点的作用是,对于 Hips 及其子骨骼,使用 Blend Poses 0 的输入,由于留空,模型会保持原始骨骼姿态。对于 Curve 等其他通道,则使用 Base Pose 的输入,也就是表情动画数据。这样,骨骼的位置和缩放不受影响,表情 Curve 数据却能正常传递。
2. 目标模型没有同名 Morph Target,但提供了 Pose Asset
MetaHuman 是这种情况的典型案例。虽然它不直接包含 ARKit 同名的 Morph Target,但提供了 Pose Asset,可以实现从 ARKit Curve 到面部 Pose 的映射。

操作步骤与第 1 节类似。在 MetaHuman 的 Skeleton 中添加道乐师骨骼为兼容骨骼,然后就可以在 MetaHuman 的动画蓝图中播放道乐师的表情动画。
不同之处在于,需要在动画节点后面额外接入一个 Evaluate Pose 节点,并在其 Pose Asset 属性中选择 MetaHuman 自带的 ARKit 映射资产 PA_MetaHuman_ARKit_Mapping。这样,输入的 Morph Target 曲线就能正确转换为 MetaHuman 的面部 Pose。

3. 目标模型既没有同名 Morph Target,也没有 Pose Asset
比如下面这个 Daz 模型,它的 Morph Target 使用了与 Apple ARKit 完全不同的命名方式,比如 Jaw_Open 而非 jawOpen,Eye_Blink_Left 而非 eyeBlinkLeft。

这种情况需要借助我们开源的重定向工具。
github.com/SunnyViewTech/UE-MorphTarget-Retargeting-Tools
这是一个 Python 脚本,运行后会按映射文件把源动画中的 Morph Target 曲线重命名,输出一个新的动画序列,直接拖到目标模型上就能用。
打开脚本后,需要配置以下几个关键参数。
SOURCE_ANIM_PATH = "/Game/Capture.Capture"
MAPPING_FILE_PATH = "C:/arkit_mapping.txt"
TARGET_MESH_PATH = "/Game/MyHead.MyHead"SOURCE_ANIM_PATH 是源动画序列的资产路径。在内容浏览器中右键点击动画序列,选择 Copy Object Path 即可获取。

MAPPING_FILE_PATH 是 Morph Target 映射文件的本地路径。映射文件为纯文本格式,每行两列,左列为源动画中的 ARKit 名称,右列为目标模型中对应的 Morph Target 名称。

TARGET_MESH_PATH 是目标模型的资产路径,同样通过右键 Copy Object Path 获取。
参数填写完毕后,在虚幻编辑器的 Tools 菜单下选择 Execute Python Script,然后选中该脚本执行。

运行完成后,会在指定目录下生成一个新的动画序列资产。打开可以看到,其中的 Curve 名称已经按照映射文件转换为目标模型的命名规范,可以直接在目标模型上播放。

关于一对多的 Morph Target 映射
在实际项目中,有时会遇到源动画中的一个 Morph Target 需要同时驱动目标模型中多个 Morph Target 的情况。例如,源动画中的 jawOpen 可能需要同时驱动目标模型的 jawOpen 和 tongue_jawOpen 两个变形目标。

处理方法很简单,只需在映射文件中为同一个源名称编写多行记录即可。工具会自动识别重复项,并将同一条 Curve 数据复制到所有对应的目标通道上。

