AdvancedLocomotionSystemV4分析(三):动作叠加
AdvancedLocomotionSysemV4分析(一):移动和脚步IK
AdvancedLocomotionSystem分析(二):攀爬系统
AdvancedLocomotionSystemV4分析(四):布娃娃和起身
AdvancedLocomotionSystemV4分析(五):镜头
本片主要分析一下ALS项目的动作叠加部分,主要用到各类姿势的切换,如受伤状态、持枪、持弓状态等,另外一种一般项目会用到的
AnimOffset
在这里没有用到,头部转向用了另外一种方式制作
姿势的切换通过接口BPI_Set_OverlayState
调用,无论是用ALS
项目的UI切换或者其他方式都可以
在ABP
中直接改变OverlayState
变量也可以直接预览效果,比之前的模块都简单一些
如上图,Overlay
单独做了一个动画层
我这边实现了部分动作,如上图,其实思路大同小异,性别/受伤等切换比较简单,弓箭/枪类等动作会有一个内部状态机切换动作,稍微会讲
判断类型基本是通过OverlayState
来判定
Default
如果按照我们之前两篇文章的制作,到这里之前角色是静态的,因为之前的默认动作只是播放ALS_N_Pose
的第一帧动作,但是加上目前这个逻辑以后就开始有了IDLE
动作了,我们看Default
状态机做了什么
文字描述一下就是
根据步态/站姿/是否在空中,来决定基础动作使用姿势动画的第几帧,这里名字带Variation
的字样的都是单帧动画的集合,使用的都是某一帧的数据
然后叠加次要运动
动画,这个动画是带起伏的IDLE
动作,如下图
所以所有姿势的起伏动作都是来源于这个动画,值得借鉴
Bow
至于男女姿势其实跟默认的没啥逻辑上的区别就略过了,下面看看弓箭的动作,这个还是蛮实用的,我们实际开发中基本肯定会用到射击类的武器
上图就是整个弓箭的状态机,除了几个特殊动作,默认都用子状态机Bow
,特殊动作比如GetUp
用的就是基础弓箭动作的某一帧比如下图,而这个整形变量OverlayStateCount
是通过动画通知修改的,容易理解
我们看一下子状态机里面的内容,如上图
默认是一个松弛状态,然后有准备动作和瞄准动作
其实就是把之前的比如Default
类型的姿势模仿一遍扔过来就可以了,无非就是换一个单帧混合动画而已
这里看到上面从Ready
切换回Released
会有3个Contition
,理论上来讲不用这么多,当然他总有他的道理
3个分别解释一下是
Bow
状态机持续超过3秒同时旋转值(RotationAmount)等于0Bow
状态机持续超过3秒同时正在移动- 冲刺状态或者空中状态
其中上面第三个判定优先级是2
那么就凑成了一个完整的弓箭姿势叠加
LayerBlending层
只看Overlay
层还不够,因为最开始的一张图显示,还有一个LayerBlending
层来混合3个另外的层
一眼望去很绝望的赶脚,确实做的非常细致
我们看几个代表性的
BasePose
通过两种方式叠加BaseLayer
缓存为Pose
后面根据各种Layering
曲线的值来决定混合的动作和插槽
然后从脚步pose开始逐步骨骼分层
上图比较特殊,在最后部分用了2个特殊的骨骼分层,倒数第二个用了一个root
创建的基于root
的虚拟骨骼,暂时没发现什么具体作用;最后一个骨骼分层节点没有设置成员
按照注释解释是将两个图层中的动画曲线混合在一起,并覆盖上一层的干扰。
好吧,此坑先留着,后面来挖
坑
制作叠加的时候发现了一个坑,动作切换的时候,Base_N_Pose
曲线的值会回到0,然后导致每次切换姿势回瞬间跳转到默认姿势再调准到期望姿势,产生了异常抖动效果。
按照正常情况站姿的情况下该值应该一直处于1才对,然后手动在基础动画层的最后节点之前手动ModifyCurves
把此曲线值先设为1。