UE4动画 高级运动系统 AdvancedLocomotionSystemV 解析

AdvancedLocomotionSystemV解析

以角色的动画蓝图为表现形式,通过计算大量的游戏数据,来使角色的运动呈现较好的效果。同时以摄像机的动画、背景音乐进一步优化表现形式。在以上基础之上,提供了大量的调试方法,较好的扩展形式,足够的注释信息,清晰的蓝图布局结构。

这个系统的架构如下图,动画蓝图是系统的重点

在这里插入图片描述

我分析动画蓝图的方法:1.了解它的基本结构,知道出它可能用到的数据;2.通过动画曲线与Pawn详细了解数据来源与作用。知道结构与数据后就比较容易扩展了

动画图表的组成与结构

动画系统将整个动作分成六部分的组合(布娃娃模式除外,这个模式特殊处理)

分别为:

  • 基础姿势:蹲下或站立
  • 叠加层:壮汉模式,空手,拿手枪,拿箱子,拿桶等等
  • 基础层:收玩家输入所影响的状态,蹲,走,跑,跳,旋转等等
  • 瞄准偏移:头与脊柱的向上下左右看
  • 手IK:在部分情况下手上会持有道具
  • 脚IK:脚在地面时大部分状态情况均需要IK

使用多种姿势的组合结构很清晰,十分有利于扩展,混合顺序按如下过程进行

基础姿势

只提供了蹲下或站立的基础姿势,是叠加层与基础层混合的基础,必须有一个基础姿势才能合理的叠加

基础层

基础层主要决定运动的不同姿态,这里使用自顶向下的方法分析(整体到细节)

地面与空中状态切换

在空中拥有起跳并下落状态与直接下落状态,当存在起跳输入时使用起跳并下落,否则是直接下落

直接下落状态 动画影响因素有:下落速度(这里分了三档决定下落姿态,分两档决定落地瞬间姿态),加速度(决定身体的倾斜),与地面的距离(决定是否要切换到落地姿态)

起跳并下落状态 分为三种状态:起跳,下落,落地。起跳动画分4种(左脚或右脚起跳,使用状态机分开;原地或运动中起跳,使用混合插值),空中下落(只分两档,低速或高速),落地(同直接下落状态)。整个过程也会根据加速度决定身体倾斜

在落地瞬间到在地面站稳之间需要一个过渡,需要从落地动画混合到地面动画,存在两种状态。当玩家不存在移动输入,则进行简单的混合即可,当存在移动输入时,则需要使用叠加动画来适应各种转向动作

地面状态 使用地面状态机保存的动画

地面的状态切换

存在两种基础状态,蹲下或站立,以及一种特殊状态,翻滚。其中翻滚拥有最高的优先级,同时只存在站立时的翻滚动作,这里蹲下翻滚略有生硬。蹲下站立可自由切换,并存在对应动画用来平滑过渡。对于蹲下或站立的移动使用对应的状态机实现。

蹲下时状态切换

分为五个状态:不移动,不转向移动,停止移动,左转,右转

一般情况下人物的旋转是通过蒙太奇完成,但是在瞄准状态下需要更加小幅度且平稳的旋转,使用特地提供了另外的左右转动画,以及对应的状态机

由于静止与结束移动时的腿脚部差异较大,使用额外提供一个停止移动的过渡状态(这里只是简单的混合过渡)

静止时使用一个姿势即可,移动时过程复杂,使用一个6向移动状态机实现

蹲下时运动的状态切换

先看站立时六向运动的状态切换之后再回到这里。原理完全相同

蹲着(左脚在前右脚在后的蹲法)与站着有个很大的区别在于,身体略微向左转了一点点,使用如果向人的正左边运动,身体已经向左转的超过了90度,是不自然的,所以向正左边运动时,倒着运动会更好,向正右边运动时腿依旧是向前的。其它的原理与状态切换等,均与站立相同。

站立时状态切换

与蹲下时状态切换一样分为5个状态,原理也基本相同

对于运动与运动停止状态,有细节上的差异

站立时运动停止的状态切换

在停止运动的具体实现上有差异,简单的使用混合过渡会产生滑步的后果,在蹲下时由于两只脚距离差距不大,看起来并不明显,但是在站立时会产生较大误差。为了使状态自然,作者将停止移动时,角色移动状态分为4种,由两种因素决定:左脚或右脚在空中大幅运动,另一只脚在地面或另一只脚小幅度运动。

对于有一只脚在地面的两种状态,只需要锁住这一只脚,此时另一只脚在空间上还未超过当前脚,另一只脚继续向静止状态混合,直到跟上锁住的脚即可。

对于一只脚在小幅度运动的两种状态,此时另一只脚必然在空间上超过当前脚,那么需要由另一只脚先落地,然后当前脚再跟上。处理方法是将在空中大幅运动的脚,混合到这只脚落地的状态,并将其锁住,小幅运动的脚继续向静止状态混合,直到跟上锁住的脚即可。

站立时运动的状态切换

相比于蹲下时的简单6向运动,这里添加了从走与跑之间的起手式,向前走与向后走之间的起手式,使过渡更平滑

各种不同的起手式均由4个动画显示,不同起手式状态的差异只影响动画开始播放的时间。

对于多次向前与向后走之间的切换,有额外优化,当发生尝试向前,但立即取消并向后运动时,向前的起手式可直接过渡到向后的起手式,而不是向前起手式到站立再到向后起手式。当然,左前与右后、右前与左后的状态切换也使用这个方法进行起手式

具体的向各个方向怎么走与跑则需要看下一部分

站立时六向运动的状态切换

为了提供向360°各个不同的方向移动,作者提供了6种状态,先说一下为什么是6种状态

本质上来说,人的腿只能向前或向后走,向左或向右走很不自然,这一点完全可以站起来试一下。以向左为例,如果希望真正的向左移动,唯一的方法是将下半身向左旋转(可以理解为先向左转,再将上半身向右转)。但是人的上/下半身旋转的角度是有限的,可以认为是90°左右,那么向左后方移动该怎么办呢。自己试一下很快就能发现,只需要向后跑,并旋转对应的角度即可。另外通过自己的试验也能发现,虽然向前与向左运动腿都是向前运动的姿势,但是细节上差距还是有些大的,所以对向左运动额外添加一个姿势,向右运动同理,后偏左、后偏右与向后运动也有不小差异,再额外添加两个姿势,由此构成了6种运动状态。

为了命名与布局的优美,作者将左与右分别命名为左前与右前,并形成一个正六边形的布局(这个作者挺在意格式的)。

6种状态有了,接下来是6种状态的切换,由于左前与左后,右前与右后的变化很大,不能简单地使用混合空间,但是我们又需要混合空间的效果,所以作者的这个部分实际上就是手动实现了一个二维的混合空间,同时在左前与左后的切换处添加了特殊的混合效果。另外作者看似使用4个参数,本质上是两个-1到1的参数,原理上是二维混合空间的简化版。

最后,这个自定义的混合空间已经写死了是6种状态,可是希望向前运动继续分为两种状态(正常跑与冲刺跑),所以对于向前的运动状态,在开始这个混合空间之前先进行混合。

叠加层

叠加层主要是角色的个性化的姿势,总计13种叠加姿势

简单的姿势

Default默认 / Masculine壮汉 / Feminine女性 / Injured受伤 / HandsTied手被绑 / Barrel桶

基础动作:站立1(idle),站立2(稍息/准备移动),蹲下

叠加动作:呼吸

复杂的姿势

一到三种基本状态,三种时:放松、准备、瞄准,两种时:默认、瞄准,一种时:默认。不同姿势的每一种状态会有一定差别。

一种必备动作(呼吸)

三种特殊动作(上矮墙、翻滚、爬起),完成这些动作是需要播放蒙太奇的,为了实现蒙太奇的复用,我们将相似的叠加姿势使用同一个蒙太奇。但这些姿势虽然相似,却任然有差异,为了应对不同叠加姿势播放相同的蒙太奇产生的变形,我们对不同叠加姿势设计了一个单独的姿势,在这个姿势之上叠加蒙太奇,会导致变形最小。对于差异较大的姿势,直接使用不同的蒙太奇即可。注意:没有为上高墙蒙太奇设置对应的姿势

接下来对不同姿势的基本状态展开介绍,首先声明,分的姿势越多,效果越好,但是有些姿势之间差异不大,可以省略

Rifle步枪

放松 空中 / 蹲 / 站立 / 走 / 跑 / 冲刺
空中:起跳或落地 / 在空中
跑:向前跑 / 其它方向
冲刺:起步冲刺 / 稳定冲刺

准备 蹲 / 站立 / 走或跑

瞄准 提供两个上到下任意瞄准方向的叠加动画,需要基础姿势
站立:原地站立瞄准 / 运动中瞄准
蹲下:瞄准

Pistol1H单手手枪

放松 蹲 / 站立 / 走或跑 / 冲刺

其它同Rifle

Pistol2H双手手枪

同Pistol 1H

Bow弓

放松 蹲 / 站立 / 走 / 跑 / 冲刺

其它同Rifle

Torch火炬

默认 蹲 / 站立 / 走或跑或冲刺

瞄准 同Rifle

Binoculars望远镜

默认 蹲 / 站立 / 走或跑 / 冲刺

瞄准 同Rifle

Box箱

默认 蹲 / 站立 / 走或跑或冲刺

组合前三个部分(LayerBlending)

在理解它的混合方式之前,先假设我们需要播放一个手指舞的蒙太奇,动画是使手掌合拢再张开

由于动画蓝图不支持单独对某几个骨骼做动画,我们只能做一个全身的动画,并让其中与手相关的几个骨骼运动,其它骨骼不动,在需要时播放这个蒙太奇即可。但是显然这样不对(其它骨骼的位置被定死了),此时需要将蒙太奇其它骨骼忽略,只保留手部骨骼变化,UE4提供了保留部分骨骼变化的功能:骨骼的分层混合

这里是使用蒙太奇举例,但是运动状态的混合也是一样的情况,我们对头使用基础姿势,手使用叠加层,脚使用基础层等等,按骨骼分层混合即可解决这个问题,同时可以通过骨骼的分层混合参数确定骨骼层的混合比例。但随之而来的是另一个问题,某个骨骼层内部什么时候使用基础姿势,什么时候使用叠加姿势,这需要使用混合叠加动画进行选择。

ALSV将角色分为8个骨骼层,每个层的混合系数,由对应的值控制。8层分别为腿,骨盆,脊柱,头,左臂,右臂,左手,右手。其中左手与右手的姿势只与叠加层有关,所以没有使用混合与叠加动画(基础层与基础姿势不涉及手的动作)。

为什么每一层的叠加动画上都提供了插槽?首先基础姿势非常简单,不需要蒙太奇,基础层是用来处理基础的运动状态的,它的蒙太奇应该是争对全身而不是某些骨骼的,而在创建基础层的过程中已经提供了插槽。只有叠加层上才会出现某个骨骼上单独存在的蒙太奇,提供在这里比较直观简单。(写在创建叠加层的过程中更可读,但更麻烦)

最后,ALSV在三个动画混合完成之后额外提供了一个虚拟骨骼的分层混合,显然虚拟骨骼是无法显示的,因此这个地方混合的唯一目的只是为了提供一个插槽。在叠加层的插槽中,虽然每一个骨骼层都提供了插槽,但是由于每一层之间的混合方式是可变的。所以如果在这些插槽中使用了曲线,那么由于层与层之间的混合,可能会导致曲线结果变化。为解决这个问题,作者直接在所有骨骼层的混合完成之后,额外对叠加层添加一个插槽,修改叠加层曲线使用这个插槽即可。

组合瞄准偏移(AimOffset)

瞄准偏移的混合有两种方法,第一种是用户手动控制的瞄准偏移,另一种是始终偏移向运动方向。选择使用哪一种模式,是由RotationMode确定的。通过将瞄准偏移叠加到前三部分混合成的基础姿势上,就完成了当前部分的混合,这一部分的混合比例,也可由参数确定。

以上部分控制的均是对头部的修改变换,但是拿着物品,例如举枪瞄准时,身体会跟着头一起转动,所以作者添加了一个脊柱的旋转。

手动偏移模式

一般情况下向左或向右看可以根据瞄准方向的角度选择特定帧即可,但存在一个特殊情况不能直接设置,上下看不存在这个问题,直接设置即可

例如从左后方看向右后方时,头不能直接转过去,而应该先从左看向前,再看向右,所以需要3个状态(左,前,右),左不能直接切换为右,必须先由前状态过渡。从右后看向左后同理

并且,为了效果逼真,从左后突然看向右后与从左后看向前方再看向右后,虽然头的运动路径相同但在表现上应该是有差异的,前者需要突出快速运动的效果。为实现突然转向的效果,作者额外添加了一个过渡状态(快速向前看状态),此时从左后方看向右后方的路径变为左后-快速向前-右后

运动方向模式

这个模式很简单,直接将头方向与身体方向重合即可。在旋转头时,作者添加了一个插值,使效果逼真。

组合手IK

在拿取双手共同持有的物品时,左右手的位置存在绑定关系,需要使用虚拟骨骼进行解算IK,一般是根据一只手计算另一只手的位置

组合脚IK

为了避免脚滑动且显得自然,脚的位置需要精确计算,在脚落地时,脚的位置是不能修改的,需要独立于全身的动作,设置对应的骨骼变换。同时由于地面可能并不平整,脚的方向也需要设置骨骼变换。全身骨骼的根节点也需要根据脚的位置进行重新设置。作者在每一只脚上添加了两个插槽,这两个插槽也将随脚IK而变化

动画曲线与动画通知

以上动画图表的各种状态切换,均是由数据驱动的,除了输入数据外,最核心的就在于曲线与动画通知了,这里将列举所有动画中使用到的曲线与动画通知,并简要叙述。

曲线

曲线名称作用
BasePose_CLF混合步幅、基础层地面状态切换、叠加层地面状态切换
BasePose_N叠加层地面状态切换
Dummy
Enable_FootIK_L启用左脚IK变换,根节骨骼变换,使骨骼偏移以适应地形
Enable_FootIK_R同上,但为右脚
Enable_HandIK_L启用左手IK
Enable_HandIK_R启用右手IK
Enable_SpineRotation启用脊柱旋转
Enable_Transition启用身体旋转,停止移动时会设为启用。在叠加层且拿武器时只有启用身体旋转,才会从准备转换到放松状态;只有启用身体旋转才会自动旋转身体
Feet_Crossing记录腿的位置是否支持反转。6向运动中左前到左后、右前到右后变换时会发生姿势的反转,只有腿的位置合适时才能完成反转
Feet_Position记录两只脚的前后关系,决定基础层中起跳的脚、停止运动的脚
FootLock_L启用计算将左脚固定在某个位置所需要的变换
FootLock_R同上,但为右脚
HipOrientation_Bias用于取消6向移动时的转身动作
Layering_Arm_L以下Layering曲线均用于组合前三部分的分层混合
Layering_Arm_L_Add
Layering_Arm_L_LS
Layering_Arm_R
Layering_Arm_R_Add
Layering_Arm_R_LS
Layering_Hand_L
Layering_Hand_R
Layering_Head
Layering_Head_Add
Layering_Legs
Layering_Pelvis
Layering_Spine
Layering_Spine_Add
Mask_AimOffset屏蔽组合瞄准偏移部分
Mask_FootstepSound用于脚步声的动画通知中,参与计算音量大小
Mask_LandPrediction参与落地预测的计算
Mask_Lean
Mask_Sprint屏蔽冲刺动作,在6向运动时用到
RotationAmount用于设置Pawn旋转,且在Bow姿势使用
Weight_Gait走与跑的步态权重,用于计算当前的步幅,决定运动相关动画播放速度,计算运动相关动画混合空间的混合参数,基础层走跑切换的参数,叠加层走跑切换的参数
Weight_InAir
YawOffset用于设置Pawn旋转

剩余3个曲线未找到相关信息

动画通知

通知

CameraShake_Notify:对当前角色的控制者播放摄像机震动,只有一种震动类型

Footstep_AnimNotify:根据运动类型播放脚步声,有4种类型:跨步、走跑、起跳、落地

GroundedEntryState_AnimNotify:设置动画蓝图的运动状态为在翻滚,改变基础层的地面状态为站立,以便播放蒙太奇

通知状态

EarlyBlendOut_NotifyState:Pawn上墙时最后的蒙太奇动作在一些情况会跳过,使蒙太奇播放更加顺滑,情况有:运动状态是在空中、姿态为蹲下、拥有移动输入

MovementAction_NotifyState:设置Pawn的移动行为,有五种状态:正常、上矮墙、上高墙、翻滚、爬起

OverlayOverride_NotifyState:设置动画蓝图的叠加状态,改变叠加层的复杂姿势,有4种状态:正常、上矮墙、翻滚、爬起。注意:没有为上高墙蒙太奇设置对应的姿势

其它

  • 提供了三种蒙太奇,且均是附加于基础层的BaseLayer插槽
  • 其它数据处理部分省略,数据处理的主要目标是使各个状态之间的切换更加顺滑,主要方法是获取角色当前数据,与上一帧数据以及某些射线检测的数据进行插值或比较

Pawn基类

由于重点是动画系统,所以这一部分主要作用是根据默认参数或输入参数设置运动状态所需要的值

Begin

  • 根据MovementMode表格数据来设置运动模式(运动速度)。
  • 设置初始状态:步态(走、跑、冲),旋转模式(运动方向、视口方向、瞄准方向),视口模式(第一人称、第三人称),叠加模式(如动画图表叠加层所见的13种叠加姿势),姿态(立、蹲)
  • 根据ActorRotation记录初始的的旋转方向:当前方向、上一帧速度方向、上一帧输入方向

Tick

第一步获取并记录当前的运动数据:计算得到的真实加速度、平面上的速度大小、速度方向、移动输入值(0-1)、移动输入所提供的旋转方向、控制器旋转方向、是否在移动、是否有移动输入

第二部根据移动状态分五种情况考虑,有三种情况需要进行设置

  • 地面状态:
    • 根据设置的步态、旋转模式、姿态确定允许的运动姿态(因为某些情况下冲刺姿态是不存在的)
    • 根据允许的运动姿态与当前的运动速度,确定新的运动姿态
    • 根据当前运动姿态,修改当前运动模式
    • 设置Pawn的旋转,根据不同的状态设置为旋转向移动输入方向或控制器旋转方向
  • 空中状态:
    • 设置Pawn的旋转,根据不同的状态设置为旋转向移动输入方向或控制器旋转方向
    • 进行碰撞检测,首先检测前方,若未发生碰撞则直接返回,若发生碰撞,则表示需要攀爬。继续射线检测,检测墙体高度,设置为对应的攀爬姿势并选择蒙太奇进行播放
  • 布娃娃状态:
    • 根据速度设置马达角驱动,保证骨骼不会过度扭曲
    • 启用重力
    • 将当前Actor随Pawn模型的移动而移动

第三步保留当前的速度与旋转值供下一帧计算使用

第四步绘制调试信息:速度箭头、移动输入箭头、旋转方向箭头、Pawn视锥、Pawn胶囊体

Input

  • 移动输入:前后左右
  • 控制器旋转:Pitch、Yaw
  • 跳跃:蹲下时站立、站立时跳起、布娃娃状态时结束布娃娃状态
  • 蹲下键:单击切换蹲下或站立、双击翻滚
  • WalkAction/SpringAction:切换允许的运动姿态,走、跑、冲刺
  • SelectRotationMode/AimAction:修改旋转模式,运动方向、视口方向、瞄准方向
  • CameraAction:修改摄像机位置,第三人称左、第三人称右、第一人称
  • RagdollAction:进去或取消布娃娃状态

Interface

设置游戏状态Character States

  • BPISetOverlayState:设置叠加姿态(总共13种叠加姿态)
  • BPISetViewMode:设置视口模式(第三人称左、第三人称右、第一人称)
  • BPISetGait:设置步态(走、跑、冲刺)
  • BPISetRotationMode:设置旋转模式(运动方向、视口方向、瞄准方向)
  • BPISetMovementAction:设置移动行为(正常、上矮墙、上高墙、翻滚、爬起)
  • BPISetMovementState:设置移动状态(默认、地面、空中、布娃娃、爬墙)

获取角色信息

  • BPIGetEssentialValues:获取基本值(速度、真实加速度、移动输入加速度、是否在移动、是否有移动输入、平面上的速度大小、移动输入值(0-1)、控制器方向、控制器旋转速度
  • BPIGetCurrentStates:获取当前状态(运动模式、运动状态、上一个运动状态、运动行为、旋转模式、步态、基本姿势、视口模式、叠加姿态)

获取摄像机系统信息

  • BPIGet3PTraceParams:为了手动实现弹簧臂效果,需要提供弹簧臂附加点的信息(检测原点、检测半径、检测通道)
  • BPIGet3PPivotTarget:获取枢纽点,绑定某些对象时需要使用
  • BPIGetFPCameraTarget:获取第一人称摄像机插槽
  • BPIGetCameraParameters:获取摄像机参数(第一人称视野角度、第三人称视野角度、是否为右视角)

表格

MovementMode表格提供了3个结构体/运动模式(Normal,Responsive,Sluggish),每个结构体/运动模式记录由三种旋转模式两种姿态组成的6种数据,每个数据记录7种速度(走、跑、冲、加速度、制动速度、摩擦力、旋转速度)

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值