虚幻引擎学习之路:动画模块进阶篇之动画融合

虚幻引擎学习之路:动画模块进阶篇之动画融合

上周UWA介绍了Unreal 4引擎动画模块中的基本功能,接下来我们将进一步介绍Unreal 4引擎动画模块中提供的进阶功能。其中主要包括:动画融合、动画重定向、反向运动学、顶点动画。鉴于篇幅原因,今天我们先来讲解动画融合。

在此,特别感谢Unreal中国团队对于本篇文章中Unreal引擎相关内容的审核,并在UWA团队学习其引擎的道路上提供的大力支持。


动画融合

动画融合是游戏引擎动画模块中的重要功能。本节将介绍Unreal 4引擎中提供的动画融合功能,主要包括:Blend节点、Blend Space、Animation Montage、Animation Composite以及Post Process Animation Blueprint。

1、Blend节点
Unreal 4引擎的Anim Graph中提供了一系列的Blend节点可以实现不同的动画融合功能,其类似于Unity引擎中的Blend Tree功能。Blend节点的输入是来自多个不同动画文件的Pose数据以及Alpha权重参数,它会根据权重参数计算出最后融合的Pose,如下图所示:

请输入图片描述

其中,A和B为两个输入Pose,Alpha为[0,1]的浮点数表示A和B的权重。当Alpha为0时输出Pose全部来自A,当Alpha为1时输出Pose全部来自B,当Alpha为0~1之间时输出Pose为A和B的融合结果。类似功能的节点还有:Apply Additive、Blend Multi等。

Time Based Blend类型节点可用于连接两个或多个动画,并在动画切换时进行融合。Blend
Poses by bool节点是其中一种,该节点根据输入的Bool值(红框中的Active Value)来控制True Pose和False Pose的切换,并且可分别设置两个Pose的融合时间(蓝框所示),其分别表示切换到True Pose的融合时间和切换到False Pose的融合时间,如下图所示:

请输入图片描述

类似功能的节点还有:Blend Posed by int,支持多个动画Pose的切换融合。

Layered Blend per bone节点可以将多个动画的不同骨骼融合在一起,例如:将Locomotion的下半身体和射击以及近战的上半部分身体进行融合,可以实现一边行走一边射击等动作。该节点需要配合Animation Montage的Slot使用,本文将在Animation Montage小节中进行介绍。

2、Blend Space
Blend Space是Unreal 4引擎动画模块中用于实现复杂动画融合功能的资源。它最多可提供两个控制参数,并支持在二维平面上摆放动画采样点对多个动画进行融合。当变量取值在二维平面中的某一坐标位置时,Blend Space会根据采样点处的动画和坐标插值计算出当前坐标的动画。下图显示了1D和2D的Blend Space示意图:

请输入图片描述

其中,左图为1D的Blend Space,包含一个参数Speed。右图为2D的Blend Space,包含两个参数Speed和Yaw。

Blend Space的创建与其他资源创建过程类似,点击Add New按钮或在Content Browser中点击右键,在弹出菜单中选择Blend Space即可。Blend Space资源分为1D和2D,分别支持一个和两个控制参数的动画融合。创建好Blend Space资源后双击即可打开编辑界面,如下图所示:

请输入图片描述

上图例子使用了1D的Blend Space,实现了根据Speed参数对Idle、Walk以及Run三个动画进行采样融合效果。其中,区域1显示了资源的参数设置,区域2显示了控制参数坐标轴以及动画采样点,区域3显示了动画文件列表。通常在使用Blend Space时首先需要设置坐标轴,如下图所示:
请输入图片描述

其中,在Interpolation Type选项中可以设置动画插值计算方式,默认设置是Averaged Interpolation。

设置好坐标轴即可从区域3动画列表中选取采样动画拖动到区域2中。上述例子中设置了三个动画采样点:Idle、Walk和Run。在区域1中可查看其参数设置,如下图所示:

请输入图片描述

上图参数设置表示Idle动画位于Speed取值为0处,Walk动画位于Speed取值为93.75处,Run动画位于Speed取值为375.0处。在区域3中可查看采样动画分布,如下图所示:
请输入图片描述

其中,三个白色菱形点表示三个采样动画在Speed坐标轴上的位置,蓝色菱形点表示当前Speed取值。点击播放动画,并拖动蓝色菱形点在Speed坐标轴上移动,即可看到不同的动画插值结果。上述例子为1D的Blend Space,2D的Blend Space比1D多了纵坐标,使用方式与1D类似。

Blend Space资源设置完成后,即可拖入Animation Blueprint的Anim Graph中作为节点使用,如下图红框所示:

请输入图片描述

3、Animation Montage
Unreal 4引擎中的Animation Montage是一个多功能的动画编辑工具。它可以将多个动画进行连接,并且支持自定义切分动画段、循环播放、任意跳转以及配合Layered Animation实现不同骨骼播放不同动画的功能。它支持如同普通Animation Sequence一样的Notification和Curve的编辑。同时,Animation Montage还支持重用。本节将对上述功能和使用方法进行介绍。

Animation Montage创建方式与其他资源相同,在Content Browser中双击即可打开编辑界面,如下图所示:

请输入图片描述

其中,区域1显示了资源的参数设置,区域2显示了Animation Montage中Timeline相关的设置,区域3显示了资源列表和Slot信息。

- 自定义切分动画
Animation Montage中重要概念是Slot和Section。Slot类似于一个容器,可以存放多个动画文件,并将它们按时序排列,其顺序可通过在Slot的Timeline上拖动进行设置。Slot的管理支持分组,每组可包含多个Slot,如下图所示:

请输入图片描述

上图显示了Slot的Timeline。其中的Slot名字为Jump,属于Default Group,并且包含了三个动画:ThirdPersonJump_Start、ThirdPersonJump_Loop和ThirdPersonJump_End。从区域3中动画文件列表中可以添加更多的动画文件到Slot中。

Section则是将整个Slot进行切分后的片段,主要作用是让开发者可以在每个片段上进行编辑,从而达到不同的效果。默认情况,Slot只有一个Section,通过新建Section可将Slot分成多段,切分位置可通过在Section的Timeline上拖动进行设置,如下图所示:

请输入图片描述

上图显示了Section的Timeline,其中包含了三个Section:Start、Loop和End,绿色竖线为其起始位置。添加新的Section可通过右键菜单创建。

通过在Section Track上添加Section并重新组合排列就可生成新的动画序列。该新生成的动画序列就是Animation Montage的输出结果,如下图所示:

请输入图片描述

上图红框中显示了Section Track,其中Start、Loop和End被顺序连接成一个动画序列。

- Branch Notify
同时,Animation Montage也具有普通Animation Sequence一样的Notification和Curve设置功能。并且,Animation Montage还具有新的Notification—Branch Notify。它支持在动画播放的任意时刻跳转到任意Section,如下图所示:

请输入图片描述

上图显示了Animation Montage中的Notify和Curve的Timeline,其功能和编辑方式与Animation Sequence中相同。其中,Element Timing的Timeline显示了当前所有Notify以及Section起始位置的可视化信息。比如,上图中绿框0、1、3分别表示动画Start、Loop和End动画的起始位置,而蓝框2表示TestNotify事件的起始位置。方框中序号显示了事件触发的时序,方便编辑的同时查看。图中的Animation Montage的Branch Notify事件响应逻辑可以在Animation Blueprint的Event Graph中实现,如下图所示:
请输入图片描述

上图红框中显示了在Event Graph中通过添加Montage Set Next Section节点实现Branch Notify的过程。其中,触发事件为TestNotify,即上图Animation Montage的Notify Timeline中添加的事件。当该事件被触发时,Montage Set Next Section节点会从Loop Section跳转到End Section,从而实现了Section的跳转功能。利用Section跳转,可以实现更加丰富的动画逻辑。

- 循环播放Section
此外,Section支持重复循环播放的功能,如下图所示:

请输入图片描述

上图中Loop Section变成蓝灰色(红框所示),表示其设置为循环播放。该功能可以用于制作有吟唱的技能,吟唱Section循环次数可根据吟唱时间确定,当吟唱结束后可利用Branch Notify跳转到技能后摇的Section。

Animation Montage的播放可以利用Anim Graph中的Slot节点指定播放的Slot,如下图所示:

请输入图片描述

其中,Slot节点的输入是动画状态机的Pose数据,输出则作为角色最终的Pose。然后在Event Graph中用Montage Play节点播放,如下图所示:
请输入图片描述

Montage Play节点中可设置需要播放的Animation Montage资源名字,然后根据游戏中的逻辑连接到相应的流程中。

- Layered Animation
Animation Montage配合Layered Animation能够实现不同骨骼播放不同动画的功能,例如:上半身骨骼播放攻击动画,下半身骨骼播放行走或是下蹲等动画。该功能可以在Anim Graph中利用Layered blend per bone节点配合Animation Montage实现,如下图所示。

请输入图片描述

其中,上图节点图中红框表示获取Pose的Cache信息,主要分别用于蓝框和红框操作来进行使用;蓝框为直接将Cache Pose进行索引,而红框则是将Cache Pose通过UpperBody的Animation Montage操作输出新的Pose,并将新的Pose索引到混合结点中。最终,通过融合结点,则可以计算出最终的动作融合效果。在Layered blend per bone节点的属性中可以对bone layer进行设置,如下图所示:
请输入图片描述

上图的设置使得Animation Montage的输出Pose被融合到spine_01骨骼以及其子节点骨骼中,从而实现了角色上半身骨骼播放Animation Montage的动画,下半身依旧播放Locomotion状态机动画的功能。

从大方向上来看,上述功能类似于Unity引擎Mecanim动画系统的Layer动画层融合功能,而从细微处来看, Layered blend per bone功能更像是Unity引擎中Layer动画层融合功能中又加入了Mask的效果,大家可以体会一下:)

- Animation Montage重用
Unreal 4引擎提供了Animation Montage的重用功能。对于已经配置好的Animation Montage可以通过创建Child Animation Montage继承其父类的所有设置。在Child Animation Montage除了 Slot中的动画可以替换之外,其他的设置都无法修改,如下图所示:

请输入图片描述

其中,Slot的Timeline中黄色的部分(红框中)表示被替换掉的动画,绿色表示继承自父类的动画。从上图可见,其他的设置选项都被置为灰色,并且无法编辑。

4、Animation Composite
Unreal 4引擎中的Animation Composite提供了将多个动画连接成一个动画的功能,并且支持与普通动画相同的Notify和Curve的功能。其创建方式与其他资源相同,在Content Browser中双击可打开编辑器,如下图所示:

请输入图片描述

Animation Composite编辑界面与Animation Montage类似,上图红色区域中显示了Composite、Notify以及Curve的Timeline。其操作方式只需将右侧列表中的动画拖入Timeline即可。其播放方式是在Anim Graph中当做普通动画即可,如下图所示:
请输入图片描述

Animation Composite的功能与Animation Montage有相似之处,它们都能将多个动画拼接成一个动画。但是,Animation Composite只提供了简单的拼接以及Notify和Curve的功能,而Animation Montage则提供了更加复杂的Section循环以及跳转功能。Animation Composite比Animation Montage使用更简单可直接当做一个Animation Sequence使用,而Animation Montage还需指定Slot等信息。

5、Post Process Animation Blueprint
Unreal 4引擎的Skeletal Mesh资源参数中有一项Post Process Animation Blueprint,它为角色提供同时运行两个Animation Blueprint的功能。通常情况下,角色的Animation Blueprint可以在Character Blueprint中的Skeletal Mesh组件的Anim Class参数中进行设置,如下图所示:

请输入图片描述

Post Process Animation Blueprint不仅能替代主Animation Blueprint,更重要的功能是它可以允许开发者访问和改变相关的骨骼动画信息。在Unity引擎中,我们可以在LateUpdate中访问和改变骨骼动画信息,而在Unreal 4引擎中,则是通过Post Process Animation Blueprint来处理这件事。

同样,Unreal 4引擎提供了AnimDynamic功能来与之配合使用,从而实现角色基于物理的动画,其功能类似于Unity Asset Store中的Dynamic Bone,而Dynamic Bone功能更像是AnimDynamic的简化版。

AnimDynamic节点支持对角色身上物件实现类似Ragdoll的动画,例如:头发、项链、衣服等。该效果能够在角色移动时,更加真实地模拟项链等物件的被施加外力从而产生摆动的动画。AnimDynamic的底层实现并不会计算物理碰撞,而是利用小方盒对物体的形状进行近似,然后通过限制方盒运动的角度范围近似模拟物理碰撞产生的自然摆动,如下图所示:

请输入图片描述

Unreal官方网站【1】中介绍了利用AnimDynamic和Post Process Animation Blueprint对怪物身上的项链施加动画的教程,有兴趣的读者可进一步阅读。


参考文献

【1】 https://docs.unrealengine.com/latest/INT/Engine/Animation/AnimHowTo/AnimDynamics/index.html


以上则为Unreal 4引擎动画模块关于动画融合的介绍,希望通过上述内容,可以让您对Unreal引擎的动画模块产生明晰的感性认识。下周,UWA将为您带来动画模块中动画重定向、反向运动学等进阶功能,欢迎关注!