动画镜像功能将动画从角色的一侧复制到另一侧,以便在不同的情况下重复使用同一动画。利用 镜像数据表(Mirror Data Table) 和其他镜像工作流,不仅可以制作动画序列的镜像,还可以制作曲线、同步标识和通知的镜像。此外,虚幻引擎中的镜像功能也是一种创建镜像动画的方法,不再需要管理第二个副本。
本文档概括介绍如何使用镜像数据表和动画蓝图来制作动画的镜像。
先决条件
镜像数据表
要开始制作动画镜像,必须首先创建 镜像数据表(Mirror Data Table) 资产。镜像数据表为要制作镜像额骨架的所有元素提供了镜像分配和指令。
要创建镜像数据表,请在内容浏览器中点击 添加(+)(Add (+)) ,然后选择 动画(Animation) > 镜像数据表(Mirror Data Table) 。这将显示一个对话窗口,必须在其中选择要为其制作镜像的骨架。选择一个骨架,然后点击 接受(Accept) 。

打开镜像数据表,以查看编辑器中的以下主要区域:

- 数据表(Data Table) ,其中包含要为其制作镜像的元素列表。此列表根据骨骼、通知和其他元素名称来自动填充,而这些元素可以在数据表详细信息中进行配置。
- 数据表详细信息(Data Table Details) ,其中包含镜像行为的配置设置。
- 行编辑器(Row Editor) ,其中提供所选条目的设置,在这里可以编辑元素名称、镜像之后的名称和元素类型。
添加和编辑条目
要添加新的表条目,请点击 添加(+)(Add (+)) 工具栏按钮,并填写 行编辑器(Row Editor) 面板中的四个属性。
- 行名称(Row Name) ,这是条目的名称。
- 名称(Name) ,这是要制作镜像的第一个骨骼的名称。
- 镜像之后的名称(Mirrored Name) ,这是要制作镜像的第二个骨骼的名称。左侧或右侧骨骼可以包含在这些属性的任何一个中,但这些属性必须包含对称的骨骼。
- 镜像条目类型(Mirror Entry Type) ,这是要制作镜像的元素类型。可以选择以下类别:

为了获得具有完全镜像的角色,表中需要包含大部分蒙皮骨骼,包括身体中央骨骼,例如 骨盆(pelvis) 、 脊柱(spine) 、 颈部(neck) 和 头部(head) 。这样是为了让镜像操作能够沿着镜像轴恰当地翻转这些骨骼的旋转动作。对于这些条目,名称(Name) 和 镜像之后的名称(Mirrored Name) 应该匹配。

数据表详细信息
数据表详细信息面板包含镜像行为的配置和其他设置:

名称 | 说明 |
---|---|
镜像查找替换表达式(Mirror Find Replace Expressions) | 表达式数组,用于使用通用镜像条目来填充表。如需详细信息,请参考查找和替换表达式部分。 |
镜像轴(Mirror Axis) | 镜像操作的轴,在角色的前方。大部分情况下应该是 X 轴。 ![]() |
骨架(Skeleton) | 用于镜像操作的骨架资产。 |
行结构体(Row Struct) | 用于表中每一行的结构。如果要扩展此结构体,必须从 FTableRowBase 继承。 |
从客户端构建中剥离(Strip from Client Builds) | 启用此功能将不会把此数据表烘焙到客户端构建中。如果要制作只有服务器知道的保密表,则此功能非常有用。 |
查找和替换表达式
查找(Find) 和 替换表达式(Replace Expressions) 是可以添加到数据表详细信息中的数组条目,以自动搜索和替换骨架中元素的特定字符串文本。这些表达式随后可以提示在创建或重新导入骨架时自动填充了哪些元素。

每个数组都需要以下表达式:
名称 | 说明 |
---|---|
查找表达式(Find Expression) | 要搜索的文本。在大部分情况下,这可能是元素名称的对称修饰符,例如 _l 、 left_ 或 _left_ 。 |
替换表达式(Replace Expression) | 要替换的文本。在大部分情况下,这可能是元素名称的对称修饰符,例如 _r 、 right_, 或 _right_ 。 |
查找替换方法(Find Replace Method) | 要在替换文本时使用的搜索方法。可以从以下选项中进行选择:
|
在使用 正则表达式(Regular Expression) 作为替换方法时可以为 查找表达式(Find Expression) 和 替换表达式(Replace Expression) 编写自定义正则表达式。
例如,默认数组的 索引12(Index 12) 包含以下表达式,用于搜索常见的身体中央骨骼名称并分配到 名称(Name) 和 镜像之后的名称(Mirrored Name) 属性:
- 查找表达式:
((?:^[sS]pine|^[rR]oot|^[pP]elvis|^[nN]eck|^[hH]ead|^ik_hand_gun).*)
- 替换表达式:
$1
如果对称文本修饰符位于元素名称的中央,例如 finger_left_index1
,那么可以编写以下表达式来正确地进行搜索和替换:
- 查找表达式:
(\S*)_left_(\S*)
- 替换表达式:
$1_right_$2
数组中预填充了常用的表达式,例如将对称修饰符的几个permutation作为前缀或后缀进行搜索和替换。可以在项目设置中更改此默认数组。在虚幻引擎的主菜单栏中,选择 编辑(Edit) > 项目设置(Project Settings),然后导航到 引擎(Engine) > 动画(Animation) 部分,找到 镜像(Mirroring) 属性部分。

制作动画镜像
创建并填充镜像数据表之后,就可以在动画蓝图中制作动画镜像。这是使用 镜像(Mirror) AnimGraph节点来完成的。
要创建节点,请右键点击AnimGraph,然后从 镜像(Mirroring) 类别中选择表。

通过提供输入姿势和布尔值变量并启用或禁用镜像功能,即可预览镜像效果。

镜像节点包含以下属性:

名称 | 说明 |
---|---|
镜像(Mirror) | 启用或禁用镜像效果。此功能默认显示一个引脚。 |
镜像数据表(Mirror Data Table) | 要用于镜像操作的镜像数据表。 |
混合镜像状态变化上的时间(Blend Time on Mirror State Change) | 在启用或禁用 镜像(Mirror) 时,要在不同的镜像状态之间混合的时间长度。要使用此功能,还需要在镜像节点之后使用惯性化节点。 ![]() |
重置镜像状态变化上的子项(Reset Child on Mirror State Change) | 启用此功能将在镜像状态发生变化时重新初始化源姿势。 |
骨骼(Bone) | 是否在镜像操作中包含骨骼数据。 |
曲线(Curve) | 是否在镜像操作中包含曲线数据。 |
属性(Attributes) | 是否在镜像操作中包含通知和同步标识数据。 |
在蓝图通知中检测镜像后的动画
如果使用的是自定义通知状态,则可能需要对其进行更改,以根据镜像后的状态具备不同的行为。可以在通知蓝图宏使用 由镜像后的动画触发(Is Triggered By Mirrored Animation) 节点来区分镜像后的状态。
在此示例中,已接收通知函数(Received Notify Function) 来梳理逻辑,检查是否从镜像后的动画接收了通知。
