BlueRoseNote/03-UnrealEngine/Animation/AdvancedLocomotionV4学习笔记(4)——8方向运动.md
2023-06-29 11:55:02 +08:00

69 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: AdvancedLocomotionV4学习笔记4——8方向运动
date: 2022-08-24 09:39:43
excerpt: 摘要
tags:
rating: ⭐
---
# 前言
之前研究一AdvancedLocomotionV4的8方向运动就是旋转模式中的LookingDirection与Aiming方式。AdvancedLocomotionV4没有直接使用BlendSpace对8方向动作进行融合而是手动构建了自定义的融合方式本质上是将一个4方向运动动画融合成8方向。
PS4 的血源诅咒在8方向运动上做的不是很好如果尝试做出360度锁定运动就会硌脚的现象。其原因是没有前后运动切换过度动画。这里我们看一下AdvancedLocomotionV4的实现方式
# AnimGraph部分
## 前后运动切换
首先看状态机(N)Lococmotion Cycles
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/AdvancedLocomotionV4/LocomotionCycle.png)
中间有6个BlendSpace输入到Cycle Blendering动画层中而这些BlendSpace分别为对应方向的WalkPose、RunPose与Walk、Run的融合。自己制作的话记得给AnimSequence添加同步组
在Cycle Blendering动画层则会对输入的动画进行Cache Pose。并在(N)Direction State状态机中使用。
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/AdvancedLocomotionV4/MovementDirction.png)
上图为(N)Direction State状态机可以看出一共6个状态但其中LF、LB与RF、RB可以分别认为是分别将L与R拆分为前后两个部分。下图展示了LF与LB
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/AdvancedLocomotionV4/LF.gif)
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/AdvancedLocomotionV4/LB.gif)
其中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个动画进行融合。
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/AdvancedLocomotionV4/AnimBlend.png)
如果看过所有状态就会发现4个动画的关系是 当前状态方向、两个临近状态方向与对角方向。这么的做的目的应该是考虑切换至紧邻状态的同时兼顾反方向运动状态。
# AnimationBlueprint中的数据计算部分
主要的数据计算位于UpdateGraphe的UpdateRotationValues中。首先调用Calculate Movement Direction。之后还会计算LYaw、FYaw、BYaw、RYaw的值。这些值之后会被用来设置YawOffset曲线。你可以在(N)Direction State状态机的各个状态中找到看到对应的使用。
## Calculate Movement Direction
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/AdvancedLocomotionV4/CalculateMovementDirection.png)
首先判断RotationModeVelocityDirection一直为Forward其他模式则会调用CalculateQuadrant函数通过当前的MovementDirection、V当前Velocity的旋转值与AimingRotationContorlRotation的差值以及FR、FL、BR、BL-Threshold进行计算用于确定4个方向范围4个参数的默认值为70、-70、110、-110
-70~70为Forward70~110为Right-70~-110为Left剩下的为Back。
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/AdvancedLocomotionV4/CalculateQuadrant.png)