AdvancedLocomotionSystemV4分析(三):动作叠加

AdvancedLocomotionSysemV4分析(一):移动和脚步IK

AdvancedLocomotionSystem分析(二):攀爬系统

AdvancedLocomotionSystemV4分析(四):布娃娃和起身

AdvancedLocomotionSystemV4分析(五):镜头


本片主要分析一下ALS项目的动作叠加部分,主要用到各类姿势的切换,如受伤状态、持枪、持弓状态等,另外一种一般项目会用到的AnimOffset在这里没有用到,头部转向用了另外一种方式制作

录制_2020_10_29_16_42_10_43

姿势的切换通过接口BPI_Set_OverlayState调用,无论是用ALS项目的UI切换或者其他方式都可以

ABP中直接改变OverlayState变量也可以直接预览效果,比之前的模块都简单一些

image-20201029161903882

如上图,Overlay单独做了一个动画层

image-20201029162011256

我这边实现了部分动作,如上图,其实思路大同小异,性别/受伤等切换比较简单,弓箭/枪类等动作会有一个内部状态机切换动作,稍微会讲

判断类型基本是通过OverlayState来判定

Default

如果按照我们之前两篇文章的制作,到这里之前角色是静态的,因为之前的默认动作只是播放ALS_N_Pose的第一帧动作,但是加上目前这个逻辑以后就开始有了IDLE动作了,我们看Default状态机做了什么

image-20201029162347423

文字描述一下就是

根据步态/站姿/是否在空中,来决定基础动作使用姿势动画的第几帧,这里名字带Variation的字样的都是单帧动画的集合,使用的都是某一帧的数据

然后叠加次要运动动画,这个动画是带起伏的IDLE动作,如下图

录制_2020_10_29_16_28_06_978

所以所有姿势的起伏动作都是来源于这个动画,值得借鉴

Bow

至于男女姿势其实跟默认的没啥逻辑上的区别就略过了,下面看看弓箭的动作,这个还是蛮实用的,我们实际开发中基本肯定会用到射击类的武器

image-20201029163239993

上图就是整个弓箭的状态机,除了几个特殊动作,默认都用子状态机Bow,特殊动作比如GetUp用的就是基础弓箭动作的某一帧比如下图,而这个整形变量OverlayStateCount是通过动画通知修改的,容易理解

image-20201029163214826

image-20201029163523606

我们看一下子状态机里面的内容,如上图

默认是一个松弛状态,然后有准备动作和瞄准动作

其实就是把之前的比如Default类型的姿势模仿一遍扔过来就可以了,无非就是换一个单帧混合动画而已

image-20201029163714887

这里看到上面从Ready切换回Released会有3个Contition,理论上来讲不用这么多,当然他总有他的道理

3个分别解释一下是

  1. Bow状态机持续超过3秒同时旋转值(RotationAmount)等于0
  2. Bow状态机持续超过3秒同时正在移动
  3. 冲刺状态或者空中状态

其中上面第三个判定优先级是2

那么就凑成了一个完整的弓箭姿势叠加

LayerBlending层

只看Overlay层还不够,因为最开始的一张图显示,还有一个LayerBlending层来混合3个另外的层

image-20201029164641087

一眼望去很绝望的赶脚,确实做的非常细致

我们看几个代表性的

image-20201029164742536

image-20201029171059067

image-20201029171216089

BasePose通过两种方式叠加BaseLayer缓存为Pose

后面根据各种Layering曲线的值来决定混合的动作和插槽

然后从脚步pose开始逐步骨骼分层

image-20201029172626602

上图比较特殊,在最后部分用了2个特殊的骨骼分层,倒数第二个用了一个root创建的基于root的虚拟骨骼,暂时没发现什么具体作用;最后一个骨骼分层节点没有设置成员

按照注释解释是将两个图层中的动画曲线混合在一起,并覆盖上一层的干扰。

好吧,此坑先留着,后面来挖

制作叠加的时候发现了一个坑,动作切换的时候,Base_N_Pose曲线的值会回到0,然后导致每次切换姿势回瞬间跳转到默认姿势再调准到期望姿势,产生了异常抖动效果。

按照正常情况站姿的情况下该值应该一直处于1才对,然后手动在基础动画层的最后节点之前手动ModifyCurves把此曲线值先设为1。