前言
之前研究一AdvancedLocomotionV4的8方向运动,就是旋转模式中的LookingDirection与Aiming方式。AdvancedLocomotionV4没有直接使用BlendSpace对8方向动作进行融合,而是手动构建了自定义的融合方式,本质上是将一个4方向运动动画融合成8方向。
PS4 的血源诅咒在8方向运动上做的不是很好,如果尝试做出360度锁定运动就会硌脚的现象。其原因是没有前后运动切换过度动画。这里我们看一下AdvancedLocomotionV4的实现方式
AnimGraph部分
前后运动切换
首先看状态机(N)Lococmotion Cycles
中间有6个BlendSpace输入到Cycle Blendering动画层中,而这些BlendSpace分别为对应方向的WalkPose、RunPose与Walk、Run的融合。(自己制作的话记得给AnimSequence添加同步组)
在Cycle Blendering动画层则会对输入的动画进行Cache Pose。并在(N)Direction State状态机中使用。
上图为(N)Direction State状态机,可以看出一共6个状态,但其中LF、LB与RF、RB可以分别认为是分别将L与R拆分为前后两个部分。下图展示了LF与LB
其中F与B互相切换除了被MovementDirection枚举控制外,还受到Feet_Crossing与HipOrientation_Bias曲线的控制。Feet_Crossing让角色不会在两脚交叉或是两脚前后重合时进行前后切换。HipOrientation_Bias曲线我并没有找到,但从字面意思猜应该是当处于指定骨盆偏移方向时限制状态切换。
具体为:
在满足MovementDirection的情况下,还需要满足:
XF=>XB:
GetCurveValue(HipOrientation_Bias)>0.5 && GetCurveValue(Feet_Crossing) ==0
=True
XB=>XF,条件有2。
|GetCurveValue(HipOrientation_Bias)| < 0.5 &&
StateWeiget(MoveLB)==1 &&
GetCurveValue(Feet_Crossing) ==0
=True
GetCurveValue(HipOrientation_Bias)<-0.5 && GetCurveValue(Feet_Crossing) ==0
=True
有了同步组以及切换条件之后,前后切换就相当自然了。当然这自然也需要角色类中的进行Rotation的平滑计算。如果旋转过快,还是会出现不自然的情况。
状态机对应的事件
这里的每个状态还绑定了对应的AnimNotify,名称为AnimNotify_Hip XX系列。在EventGraph里可以看到,这些AnimNotify用于设置TrackedHipsDirection的值。
对角动画融合
AdvancedLocomotionV4在这个状态机中使用了对角融合方式。以下是LF的融合图,看得出它是通过VelocityBlend结构体(将Velocity的x、y的正数与负数拆成4个部分)对F、B、LF、FR4个动画进行融合。
如果看过所有状态就会发现,4个动画的关系是 当前状态方向、两个临近状态方向与对角方向。这么的做的目的应该是考虑切换至紧邻状态的同时兼顾反方向运动状态。
AnimationBlueprint中的数据计算部分
主要的数据计算位于UpdateGraphe的UpdateRotationValues中。首先调用Calculate Movement Direction。之后还会计算LYaw、FYaw、BYaw、RYaw的值。这些值之后会被用来设置YawOffset曲线。你可以在(N)Direction State状态机的各个状态中找到看到对应的使用。
Calculate Movement Direction
首先判断RotationMode,VelocityDirection一直为Forward,其他模式则会调用CalculateQuadrant函数,通过当前的MovementDirection、V当前Velocity的旋转值与AimingRotation(ContorlRotation)的差值以及FR、FL、BR、BL-Threshold进行计算(用于确定4个方向范围,4个参数的默认值为70、-70、110、-110)
-70~70为Forward,70~110为Right,-70~-110为Left,剩下的为Back。