整个结构可以看成两种Pose,一种Pose是Layer Blending 加上瞄准偏移加上手和脚的IK,一种Pose是Ragdoll,根据MovementState选择,如果是MovementState是Ragdoll选择Ragdoll Pose,其他状态都选择第一种Pose。
MovementState状态枚举
Layer Blending 包含了Grounded(地面),In Air(包括跳跃与降落),Mantling(攀爬)的MovementState的Pose
LayerBlending分成BaseLayer,OverlayLayer,BasePoses和LayerBlending层
BaseLayer 实现Grounded,InAir,Mantling的基础动作
OverlayLayer 是动作叠加如男女站姿不同,受伤,手背绑住,持枪,持弓箭,举着火炬等等动作
BasePoses 是站立ALS_N_Pose或下蹲ALS_CLF_Pose的混合
LayerBlending 是将前三个Layer分部位进行混合
第一层:MainMovementStates 是Grounded和InAir状态转换
第二层:MainGroundedStates 是Gronded状态下站立与蹲下和滚动滚动的状态转换
第三层:(N) - Neutral Standing States 是Grouded状态下站立的移动Pose,(CLF) - Crouching Left Forward States 是Grounded状态下蹲下的移动Pose
整体的结构分为三层,第一层是第二层输出的MainGroundedStates和InAir之间的转换,第二层是(N) Locomotion States与(CLF) Locomotion States之间转换,第三层就是输出(N) Locomotion States,(CLF) Locomotion States
这一部分是地面部分Pose
(N) Locomotion Cycles:八方位的移动
(N) Locomotion Detail:行走奔跑冲刺转换
(N) Locomotion States:等待和移动的状态转换
(CLF) Locomotion Cycles:相当于蹲下状态的(N) Locomotion Cycles
(CLF) Locomotion States:相当于蹲下状态的Locomotion States
为什么没有(CLF) Locomotion Detail,是因为蹲下没有奔跑冲刺等动作
前,后,左前,右前,左后,右后六方向的行走奔跑混合空间和冲刺Pose传入(N) CycleBlending层进行方向的处理
1)Linked Anim Layer:(N)CycleBlending
根据Gait枚举选择是否冲刺,Mask_Sprint这个曲线在ALS_N_Land_Heavy,ALS_N_Land_Heavy_Additive, ALS_N_Land_Light ,ALS_N_Land_Light_Additive这四个落地动画里。其实是因为落地与冲刺混合膝盖被过度压缩了,所以用Mask_Sprint和F Input做混合。
一般根据MovementDirection切换状态。在MoveLB和MoveLF,MoveRB和MoveRF是会根据HipOrientation_Bias和Feet_Crossing切换。
HipOrientation_Bias是臀部朝向的。HipOrientation_Bias<-0.5是hip left , HipOrientation_Bias>0.5是hip right。HipOrientation_Bias曲线在ALS_Props_Bow_Poses,ALS_Props_M4A1_Poses,ALS_Props_Pistol_1H_Poses,ALS_Props_Pistol_2H_Poses,ALS_Props_Torch_Poses动画里。
Feet_Crossing值是脚的交叉。1是交叉,0是不交叉。Feet_Crossing曲线在ALS_CLF_Walk_L,ALS_CLF_Walk_R,ALS_CRF_Walk_L,ALS_CRF_Walk_R,ALS_N_Run_LB,ALS_N_Run_RB,ALS_N_Walk_LB,ALS_N_Walk_LF,ALS_N_Walk_RB,ALS_N_Walk_RF动画里。
2)
这个是根据Diagonal Scale Amount值ik_foot_root骨骼的一个缩放,这是因为Ik,脚的对角移动位置可能不够。
3)
ALS_N_Lean是混合了前后左右倾斜的BlendSpace,通过之前计算的加速度旋转值混合。
Calculate Relative Acceleration Amount是求的当前加速度相对于actor方向上的值,并把范围限定在-1到1。Relative Acceleration Amount X是前后方向的值, Relative Acceleration Amount Y是左右方向值。
(N) Locomotion Detail:行走奔跑冲刺转换
(N) Locomotion States:等待和移动的状态转换
MainGroundedStates :Gronded状态下站立与蹲下和滚动滚动的状态转换
MainMovementStates:Grounded和InAir状态转换
Mantling:
Mantling是使用播放Montage的方式,Montage的Slot是BaseLayer
在ALS_Base_CharacterBP里Mantle Start函数调用
Two Bone IK (Bone:hand_l)
IKBone:被控制的骨骼 hand_l
Effector :使用vb rhs_ik_hand_l的位置作为骨骼末端位置,IKBone达到这个位置
Joint :是关节位置,IK通过Effector位置与IKBone hand_l的父骨骼lowerArm_L的父骨骼upperArm_L算出了所在的高度位置,但是在这个高度上有无数个方向,所以要通过Joint位置来确定lowerArm_L应该到达的最终位置。
通过Layering_Arm_L作为权重对0-Enable_HandIK_L的范围取值来设置Enable_HandIK_L。Enable_HandIK_R 同理。
通过修改ik_foot_l、ik_foot_r、vb ik_foot_l_offset、vb ik_foot_r_offset、pelvis、vb ik_knee_target_l、vb_ik_knee_target_r这些骨骼的位置然后应用two bone ik节点设置ik
Foot Effector:
IKFoot Floor Location是计算当前foot骨骼正常应该在的位置。使用射线检测,找到当前foot所在平面的位置和法线。加上IK_TraceDistanceAboveFoot作为Start值,减去IK_TraceDistanceBelowFoot作为End值,这个因为脚可能在地面上方或下方。
地面减去脚的距离,这个位置插值后以世界坐标系加在vb ik_foot_l_offset、vb ik_foot_r_offset骨骼上设置Effector位置
取地面的Roll角和Pitch角,该值插值后就是vb ik_foot_l_offset、vb ik_foot_r_offset的Rotation
Pelvis :
Foot Offset Target 是地面减去脚的距离,取其中更小的距离做骨盆偏移。插值后以世界坐标系加在pelvis骨骼上
参考:
https://zhuanlan.zhihu.com/p/101477611
https://zhuanlan.zhihu.com/p/41425611