本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式。教程内容将同步免费发布于开发游戏的老王(知乎|CSDN)的专栏《玩转UE4/UE5动画系统》。教程中使用的资源及工程将以开源项目的形式更新到GitHub:玩转UE4上。
工程文件: 玩转UE4(GitHub)
演示视频: Overlay系统(ALS V4实现方案详解)
工程说明:
- 动态实现了呼吸效果
- ALS V4原工程中实现了包含了如下图所示的诸多可以叠加到基本动作上的叠加动画,不过它们的套路都是相同的,所以在拆解版工程中,我只偷懒实现了扛桶的叠加动画。
- 0. 效果演示
- 1. 概述与原理
- 科普:什么是Overlay动画?
- 什么是Overlay框架?
- Overlay框架概要
- 2. 三个输入层
- 2.1 Base Poses Layer(基本姿势层)
- 2.2 Base Layer(基础动画层)
- 2.3 Overlay Layer(叠加动画层)
- 3. 核心:Layer Blending (混合层)
- 3.1 Step 1 计算Base Additive
- 3.2 Step 2 计算局部姿态副本
- 3.2.1 Overlay作用模式控制
- 3.2.2 Overlay作用权重控制
- 3.3 Step 3 插入局部姿态
- 3.4 Step 4 曲线覆盖
- 4. 补充:呼吸效果的实现
假设,在项目中我们实现了角色的Idle/Walk/Run等基础运动动画,接下来我们想给角色实现射击功能,依照设定角色在Idle/Walk/Run的时候都可以射击并且射击动画的上体动作基本相同,这时我们没有必要为Idle/Walk/Run分别制作一套动画,让它们的上体共用同一个射击动画就可以了,以后我们可能还想制作骑马功能,如果想让角色骑着马射击的话,同样把Overlay动画应用到骑马动画上就可以了,这样即灵活又省力。
什么是Overlay框架?框架的意义在于可复用并且可扩展,ALS V4中Overlay部分的实现就具备了这样的特性,因此称之为Overlay框架。我们可以根据项目需要在Overlay框架中自由拆装Overlay动画。
Overlay框架概要ALS V4的Overlay框架由4如下4个部分构成,下文中我们将逐一解释其意义。
Base Poses Layer很简单,它提供了ALS_N_Pose(站立) 和ALS_CLF_Pose(蹲) 两个姿势,其作用是生成动态叠加(Make Dynamic Additive) 时充当 “被减姿势” 即 Base Pose。
Base Layer 就是诸如上文所述的Idle/Walk/Run基础动画层。
本例中,我使用的就是横板卷轴模板中的默认状态机作为Base Layer 。
Overlay Layer 要叠加的动画层 ALS V4中实现了如下若干种叠加动画,它们都是并列且互斥的关系,其拆装的原理都是相同的。这也体现了Overlay框架的意义。 我们可以根据项目的需要,在这里自由安装或拆卸叠加动画。
因此在本例中,时间的关系我只添加了扛桶一个叠加动画。
Overlay状态切换的标志位是OverlayState,原版ALS V4中在角色蓝图中更新完OverlayState,通过BPI Get Current States 接口传递给动画蓝图,在本拆解版中我偷了点懒。
OverlayState 是表示叠加动画的枚举类型,在实际项目中可根据需要增减枚举值。
Layer Blending 层是整个Overlay框架的核心部分,整体分为4个大的步骤。
注意: 这里计算了Mesh Space和Local Space两个版本的Base Additive的备份。其中Local Space版本备份主要用于双臂的Overlay动画,身体的其它部分均使用Mesh Space版本。
这个步骤将身体拆解为双腿(Legs)、骨盆(Pelvis)、脊椎(Spine)、头部(Head)、左臂(Arm L)以及右臂(Arm R)等局部动画副本,用于在下一步通过Layered blend per bone插入到最终姿态中。计算这些副本的逻辑相同(仅在坐标系上略有不同),下面就医双腿和左臂为例解释一下。
带入上一步的公式,整理一下可得:
-
当Section 1的Alpha值为1时:
这实际上就是将Overlay Layer以Additive的形式叠加到Base Layer 上。
-
当Section 1的Alpha值为0时:
换句话说,Section 1中Alpha的作用就是控制Overlay Layer的作用方式:
- Alpha = 1: 将Overlay Layer视为Additive动画
- Alpha = 0: 直接使用Overlay Layer
而Section 2的作用就通过曲线来控制Overlay Layer的权重
- 曲线值为1:使用叠加后的Pose
- 曲线值为0:此Pose屏蔽Overlay Layer,只使用Base Layer
注意: 上文例子中,Arm L Add 的值取自曲线Layering_Arm_L_Add ,此处的后缀Add即为Additive;而控制权重的曲线是Layering_Arm_L,二者名字相似,请注意区分。
3.3 Step 3 插入局部姿态通过Layered blend per bone将局部姿态插入到最终姿态中,这里需要注意的是插入手臂姿态时,Local Space版本和Mesh Space版本的选择
Arm L(R)LS和Arm L(R)MS的关系如下:
LS值取整后再被1减,获得MS的值,这就意味着只有当LS取1时,MS为0,其余情况MS值均为1。换句话说:LS和MS的取值只有如下两种情况:
- LS = 0~0.99999 ; MS = 1
- LS = 1 ; MS = 0
这个步骤确保曲线的取值都来源于Base Layer和Overlay Layer且未经混合(Blend)的原始值。
Layered blend per bone 1 的作用是可以通过蒙太奇动画动态地提供曲线,这个蒙太奇动画本身是不起作用的,只提供曲线。
Layered blend per bone 2 ** 的作用是将Base Layer和Overlay Layer**原始曲线值提供给最终Pose。
呼吸在ALS V4中被称为Secondary Motion(次级动作),它的实现比较简单(使用了静态的Additive方式),并不依赖于这个Overlay框架。