学习笔记,仅供参考!
在游戏动画中,角色的碰撞胶囊体(或其他形状)通常由控制器驱动通过场景。然后来自该胶囊体的数据用于驱动动画。例如,如果胶囊体在向前移动,系统就会知道在角色上播放一个跑步或行走的动画,让角色看起来是在靠自己的力量移动。但这种类型的运动并不始终适用于所有情况。在某些情况下,让复杂的动画实际驱动碰撞胶囊体(而非相反)是有道理的。这正是 根运动(Root Motion) 处理对游戏而言至关重要的原因之所在。
例如,假设玩家发起一次特殊攻击,在这种攻击中,模型已预先设定好向前冲的动作。如果所有的角色动作都是基于玩家胶囊体的,这样的动画会导致角色迈出胶囊体,从而在事实上失去碰撞。一旦动画播放结束,玩家就会滑回其碰撞位置(也就是胶囊体的位置)。这就会产生问题,因为胶囊体通常用作所有计算的中心。胶囊体外的角色将越过几何体,不会对其环境做出适当的反应。另外,在动画结束时滑回他们的胶囊体也并不现实。
对于那些刚刚接触这个概念的人来说,仅仅阅读说明未必能显然地明白合适根运动(Root Motion)的重要性。下面有一个角色正在执行一个预设定攻击动作,在这个攻击中,他们向前猛冲并砸下锤子。请注意,角色向前移动的动画不是在游戏中处理的 - 而是由动画艺术家以这种方式创建的。
其实通俗点讲就是动画驱动网格体向前运动,而胶囊体是游戏控制的,并没有向前运动,这样就导致网格体又回到了胶囊体的位置,动画并没有控制角色实例胶囊体的移动。
什么是根运动?
简单地说,根运动(Root Motion)是基于骨架根骨骼动画的角色运动。游戏中的大多数动画都是通过循环处理的,角色的根在循环中保持固定。然而,实际情况却并非始终如此,正如我们在上例中看到的那样。为了处理这个问题,我们需要将根的运动从角色中抽离,并将其应用到角色的胶囊体中。这就是UE4中根运动(Root Motion)的本质。
为了正确地使用根运动(Root Motion),必须注意角色的根骨骼(Root Bone)应该位于原点(0,0,0,无旋转),因为这样能使系统将物理移动(胶囊体)从动画移动(角色)中分离出来。
动画的根运动(Root Motion)可以在播放过程中可视化。只需打开任何根骨骼移动的动画,在视口中选择 显示 > 骨骼(Show > Bones) 即可。如果尚未在动画属性中选择 启用根运动(Enable Root Motion) ,当角色的根移动时,你会看到一条红线。这说明了动画的根运动(Root Motion)。
启用根运动(Root Motion)后,这条红线将消失。而角色将移动到位。这是因为,角色的根将不再从原始位置移动。在这个图像中,我们在角色上启用了根运动(Root Motion)。请注意,我们与上面的图像处于同一帧,但是角色的位置没有改变。
那么,这意味着什么?既然系统已经考虑到了角色动画的根运动(Root Motion),那么它就可以将同样的运动重新应用到角色的碰撞胶囊体。这意味着,它仍然可以完全按照动画师的期望运动,但它也可以对游戏中的碰撞以及其他物理和游戏进程事件做出正确的反应
启用根运动
你可以在 动画编辑器(Animation Editor) 中的 资源详细信息(Asset Details) 面板中为你的动画序列启用根运动(Root Motion)。
根运动(Root Motion)根据动画序列(Animation Sequence)处理,可以在动画序列(Animation Sequence)的 资源详细信息(Asset Details) 面板中开启和关闭。对于网络游戏,根运动(Root Motion)需要使用动画蒙太奇(Animation Montage),请参见下面的 仅来自蒙太奇的根运动。
在定义是否在动画序列(Animation Sequence)中启用根运动(Root Motion)时,你仍然需要确定如何在 动画蓝图中处理该序列。有几种不同的方法可以处理动画蓝图(Animation Blueprints)中的根运动(Root Motion)。你可以通过 动画蓝图编辑器(Anim Blueprint Editor) 的 详细信息(Details) 面板中的 根运动模式(Root Motion Mode) 下拉菜单定义方式。
来自每一项目的根运动
当这个选项被设置为根运动模式(Root Motion Mode)时,则会提取每个帮助构建最终角色姿势的动画资源(AnimSequence、Blendspace、AnimMontage等)的根运动(如果它已被设置为包含根运动(Root Motion))。每一部分的提取根运动(Root Motion)均根据构成该姿态之源资源的权重进行混合。
例如:
在上图中, Jog_Loop_Fwd_RM 和 Jog_Loop_Right_RM 的根运动(Root Motion)将以0.5的权重混合起来。在这种情况下,生成的动画是一个角色在地图上沿对角线向前和向右运行。
仅来自蒙太奇的根运动
该方法适用于网络游戏,这也是其功能受限的原因。由于 来自每一项目的根运动 被设计为不受限制,因此建议仅在不在网络上复制动画的游戏中使用此方法。
动作中的根运动
下面是不处理根运动(Root Motion)所导致问题的细分,以及根运动(Root Motion)对动画的益处。
无根运动
如果没有根运动(Root Motion),攻击动画(例如下面的这个)会将角色从他们的胶囊体中拉出。你可能还会注意到难看的弹回胶囊体位置。这是因为一旦动画播放完毕,角色控制器就会将角色拉回其原始位置。
为何胶囊体分离不良
在这种情况下,位移回弹问题不是唯一要克服的问题。由于角色正在离开碰撞形状,它将穿过世界场景对象,并打破整体的连续性。在此示例中,我们可以看到角色的攻击使他们首先穿过墙壁,然后又跳回。
利用根运动解决问题
一旦你的动画设置为利用根运动(Root Motion),那么动画师设置的运动将暂时成为胶囊体的驱动力。这让我们可以从动画的终点继续播放。可以看到,当我们第二次触发攻击时,我们从新的位置出发。当然,我们先转过身来,这样就不会偏离镜头。
根运动和物理状态
随着胶囊体的出现,这意味着物理碰撞仍然可以使用,并且我们解决了角色穿过墙壁的问题,同时也缓解了角色需要位移回弹到胶囊体位置的问题。在下图中,动画使用根运动(Root Motion),它同时带上了胶囊体,导致角色与墙壁相撞,而不是穿过墙壁。
你会注意到它不是很完美,因为角色的屈身动画会导致它有点穿过墙壁。然而,这可以很容易地通过处理墙壁或角色上的碰撞体积来管理。重要的是,胶囊体能跟上运动,防止角色一路穿过墙壁并在之后不得不弹回。
在根运动(Root Motion)期间,角色的物理状态将被加以考虑。例如,如果角色物理状态是行走或掉落,则忽略根运动(Root Motion)的Z轴,并应用重力。角色将掉落,下坡或上楼梯。如果角色物理状态是飞行,则应用完整的根运动(Root Motion),并忽略重力。