从
开始看
在跑步动画中进行脚落地,摄像机摇动,和左右脚区分,这个weight——gait曲线用于区分动画,使用见下面
针对小跑和快跑,使用当前的相对加速正前方分量x值【0-1】来进行混合
制动时的最大减速度
UnrotateVector将世界坐标系变成局部坐标系,再来一次 RotateVector 将 会把局部坐标系变成世界坐标系。
UnRotateVector作用是让Vector A绕着原点逆时针旋转 B。
RotateVector作用是让Vector A绕着原点顺时针旋转 B。
【AdvancedLocomotionSystemV】使用 UnrotateVector 和 UnrotateVector 增加向量值的原因_Tanzq的博客-CSDN博客
得到基于当前角色旋转值的相对加速度【所以后面要UnRotateVector,因为是当前旋转的相对值】,并将其归一化到-1到1,以表示最大制动减速度和最大加速度
前进和后退,跑步和走路的所有混合动画,LR指定左右,F前进,B后退,指定Stride步幅和walkrun 走路跑步混合值,standing play Rate立姿状态下动画速度。这里为各个姿势都设立了同步组。
计算WalkRunBlend,简单的0和1判断
计算步幅大小
计算步幅混合。该值在混合空间中用于缩放步幅(脚移动的距离),以便角色可以以不同的移动速度行走或跑步。它还允许行走或跑步步态动画独立混合,同时仍将动画速度与移动速度相匹配,防止角色需要播放半行走+半跑步混合。曲线用于将步幅量映射到速度以实现最大控制。
strideBlendNWalk和strideBlendNRun是两个曲线
walk
run,依据速度进行两个曲线的插值
这里使用get anim curve clamped自定义的宏,获取weight_gait曲线值,
walk是1,run是2, sprint是3,这里加上了-1的偏移,所以walk用上面n walk 的曲线,run和sprint用run的曲线
后续通过下蹲的动画中CLF曲线去混合跑步走路/下蹲状态的步幅,下蹲状态下步幅为walk的大小
计算立姿状态下动画速率,通过将角色的速度除以每个步态的动画速度来计算播放速率。lerpd alpha由存在于每个anim中的“weight_gait”动画曲线确定,因此播放速率始终与当前混合动画同步。该值还除以步幅和mesh scale,使得随着步幅或比例变小,播放速率增加。
这里speed都是提前定义好的,walk speed为150,run speed为350,animated sprint speed为600,由于sprint的weight值是3,所以偏移为-2
通过将角色的速度除以动画速度来计算蹲起播放速率。该值需要与站立播放速率分开,以改善运动中从蹲下到站立的混合效果。
整体逻辑和计算立姿状态差不多,crouch speed为150
回到
中
混合计算所有移动动画的循环,先将各个姿势保存起来以便重用。针对前进动画先判断是普通forward还是冲刺,然后判断是否应用附加着陆动画中的mask_sprint曲线,不用mask可能会着陆时压迫膝盖导致ik问题,看下来是着陆时先播放普通forward动画,再过渡到现在的动画
接着计算方向
该状态机基于运动方向和“HipOrientation\u Bias”曲线将方向循环混合在一起,以便在切换方向或更改hip旋转时实现更好的混合。
定义了一个方向枚举-前后左右,和六个移动方向,左前、前、右前、左后、后、右后
这里动画中使用了
过渡规则共享(transition rule sharing) 以提高效率,
即将一个过度规则设置(提升)为可共享的,那么当遇到了相同的过度规则,我们只需要设置为这个过渡规则的引用就可以了,同时更改其中一个引用规则,其它使用该共享规则的地方也会同步更新了。每种规则是一种颜色的箭头。详见大神:
[玩转UE4/UE5动画系统>基础篇] 之 过渡规则共享(Transition Rule Sharing)-提升效率的小技巧_开发游戏的老王-CSDN博客
还使用了过渡渐入渐出共享,使用的changedirection blend profile中将下肢的权重设为2,比上肢优先级更高
这里黄色dir==right,绿色为dir == forward, 红色为dir = backward, 紫色为dir == left,同一大方向的左右转换还是比较简单的。同一侧方向的前后也通过forward和backward进行切换,而同一竖直方向上,左右无法直接切换,左前无法直接切换到右前,有中间一个过渡,而左前可以将方向标记为右直接切换到右后,改变竖直方向和水平方向。
↑粉色
条件只在前进和后退的左右状态下使用,这里用到了曲线Feet_Crossing,该曲线标识角色两腿是否交叉,==0为不交叉的状态,hiporientation_bias为臀部朝向曲线,小于-0.5朝左,大于0.5朝右,所以这里会同时根据dir值或者 脚步交叉+臀部方向去判断前后,同理
靛蓝色节点也是如此,在左侧动画下,双脚未交叉,臀向右,为后退,臀向左,为前进,在右侧动画下,双腿未交叉,臀向左为后退,臀向右为前进。这里白色的条件为非共享规则:双腿非交叉,臀部曲线绝对值在0.5内,当前动画混合权重为1,测了下不知道怎么触发这个规则。
进入具体的动画节点,MoveF为例:
这里使用了自定义结构体velocity blend 【F,B,L,R】四个方向的分量,去混合各个方向的动画,然后为Yaw Offset曲线设置当前角色的Yaw值,这个yaw值根据角色当前速度方向与控制方向的差值,在曲线中拿到。
这里的yaw值用于附加计算角色旋转插值速度【Update Grouded Rotation】,Smooth Character Rotation 用于平滑的旋转角色,Target Interp Speed是当前旋转到当前目标旋转的插值速度,Actor Interp Speed是当前角色旋转到目标旋转值的插值速度。这个Yaw Offset用于控制角色实现更真实自然的转动
这个velocity blend是这样计算的,取方向的单位向量【unrotate取当前旋转值的相对值】,将x方向映射到f和b分量上,将y方向映射到l和r分量上,通过这个变量计算去使用multiblend节点进行混合以实现比混合空间更好的方向混合效果。
这个函数则是去计算上文中提交的movement dir和yaw值。设置yaw offset。这些值会影响动画图形中的“YawOffset”曲线,并用于偏移角色旋转以实现更自然的移动。曲线允许对每个移动方向的偏移行为进行精细控制。
这里前进后退方向和左右方向的yaw 曲线值不尽相同,左为fb,右为lr。通过计算控制器与角色的yaw差值,在曲线中选择对应yawoffet值去设置曲线值。
接着计算movement dir,该值表示角色在“Cir