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

接下来就是布娃娃系统,对应的就有从布娃娃恢复成正常状态的起身动作。

这里还同时分析了一下站立和下蹲姿势的切换,因为起身动作会涉及到这一块

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

AdvancedLocomotionSystem分析(二):攀爬系统

AdvancedLocomotionSystemV4分析(三):动作叠加

输入

站姿切换的输入比较简单粗暴,ASL项目用一个按键来实现姿势切换和翻滚,我这里方便测试就直接把这两个功能分开了,只需要设定一个按键直接调用CrouchUnCrouch即可,然后在角色自带的时间OnStartCrouchOnEndCrouch去调用方法OnStanceChanged

然后是布娃娃的输入,直接按键以后调用RagdollStart即可,如果已经处于Ragdoll状态就调用RagdollEnd结束布娃娃状态

布娃娃

开始/进入布娃娃状态

image-20201030105803687

进入布娃娃状态我们分3步走

  1. 设置移动状态为None,设置MovementStateRagdoll
  2. 关闭胶囊体碰撞,设置骨骼模型的碰撞为PhysicsBody,开启物理和检测效果,打开pelvis及以下的所有骨骼物理效果
  3. 停止当前蒙太奇动画

这里有一个非常大的坑需要注意,第2条的开启骨骼物理效果需要修改默认的骨骼物理资产,见下图

image-20201030110213472

需要注意几点

  1. root添加一个碰撞体
  2. 修改碰撞体属性,PhysicsType设置为Kinematic,关闭碰撞检测
  3. 修改rootpelvis碰撞体之间的约束,线性约束全部设置为free

如果不做以上几点你就会发现起身以后位置的异常,是因为pelvis碰撞体如果最为最上层碰撞体必然会导致的异常位置缘故


进入布娃娃以后我们也需要看一下动画蓝图中的内容

image-20201030111405881

在主动画视图里的最后节点混合了布娃娃状态机

image-20201030111447376

比较简单,2个状态机切换而已

刚进入布娃娃的时候使用动画Flail动画来过度

image-20201030111604063

离开布娃娃时会使用离开布娃娃瞬间保存的快照动作来过度,很巧妙

刷新布娃娃状态

image-20201030111139863

image-20201030111151057

图片上的注释已经说的比较详细了,用的方法比较传统,这个线速度保存着是为了在结束布娃娃状态的时候在特定时候需要继续使用

结束布娃娃状态

image-20201030111753682

需要稍微注意的是这里有一个方法GetGetUpAnimation来得到具体的起身蒙太奇动画,考虑到的主要就是动作叠加问题,其实动画序列来自于同一个,只是动画通知内容不一样

image-20201030112204582

动画通知调用了接口设置角色的状态为GettingUp


到这里,整个布娃娃和起身逻辑基本上完成了,但是实现的时候还会发现一个问题,就是起身以后会异常抖动

原因是这套系统需要配合站立/下蹲的过度切换,如果不参用这个套路或者把起身动画里的下蹲权重=1的曲线BasePose_CLF删掉或设置为0都可以让角色直接成为站立状态,不需要下蹲姿势的过度,不过这个效果稍微差劲一点,看下图对比

录制_2020_10_30_11_28_27_728

录制_2020_10_30_11_29_12_605

站立/下蹲切换

image-20201030113156852

下蹲在Baselayer层内也有类似站姿的2个状态机,实现内容也大同小异不过多讲述了

Cycles内6方向混合,States内停止/移动切换,转身

重点看一下MainGrounded状态机内的姿势切换状态机

image-20201030113355979

拿一张脑图来说明一下

image-20201030115438341

两个过渡状态机添加了通知StopTransition

另外,目前阶段的切换站姿会导致视角抖动,因为UE4本身Crouch的瞬间会把胶囊体的大小缩放为CrouchHalfHeight的高度,解决方法是把相机独立出去,即不挂载在角色身上,后续分析