UE5.8 Motion Warping 专题系列

UE5.8 Motion Warping 专题(二):Root Motion 基础,先明白它到底改了什么

用普通移动、in-place 动画、root motion 动画对比讲清 Motion Warping 的输入输出,解释动画根骨、Montage root motion、CharacterMovement 转换和为什么无根运动动画很难对齐。

总览

很多 Motion Warping 问题,其实不是 Warping 配错了,而是 root motion 心智模型没建立。先把三种移动分清楚:in-place 动画只是角色原地摆腿,真正移动来自 CharacterMovement;root motion 动画把位移写在根骨上,动画自己推动角色;Motion Warping 是对这段根骨位移做局部重定向。

UE5.8 Motion Warping 专题(二):Root Motion 基础,先明白它到底改了什么 配图
Motion Warping 位于动画 root motion 被提取之后、转成角色移动之前。

三种移动方式

方式 位移来源 适合场景 Motion Warping 是否合适
CharacterMovement 速度、加速度、输入、导航 日常走跑跳 通常不需要
In-place 动画 动画原地播放,胶囊移动 标准 Locomotion 不适合直接对齐
Root Motion 动画根骨提供位移和旋转 翻越、处决、攻击踏步 最适合

Motion Warping 最喜欢“有意图的 root motion”:动画师已经做出一个漂亮的动作,只是目标距离每次略有差异。它不适合把一个完全原地动画硬拉成两米冲刺,那样会像滑行。

执行位置

UMotionWarpingCharacterAdapter 会绑定到 CharacterMovement 的 root motion 处理路径。角色播放 Montage 后,动画系统提取出 local root motion delta;Motion Warping 在这一步拿到 FTransform InRootMotion,让 Active Modifier 修改它,然后 CharacterMovement 再把结果转成世界运动。

Montage extracts local root motion
  -> MotionWarpingComponent.ProcessRootMotionPreConvertToWorld
  -> Active RootMotionModifier.ProcessRootMotion
  -> CharacterMovement converts to world movement
  -> actor transform changes

怎么检查动画能不能用

在动画编辑器里打开 Root Motion 预览。角色根骨应该沿动作方向移动,例如翻越时根骨从墙前移动到墙后,攻击踏步时根骨往敌人方向推进。如果根骨不动,Motion Warping 只能靠添加位移去补,调参空间会小很多。

再看窗口内的原始位移:如果窗口只有 5 帧却要补 150cm,速度会爆;如果窗口覆盖整段动作,连起手和收招都被拉,动作会漂。好的窗口通常覆盖“角色主动靠近/跨越”的中段。

使用案例:攻击踏步

假设攻击动画原始 root motion 往前 120cm。实际敌人距离在 90cm 到 150cm 内波动,Motion Warping 很适合;如果敌人在 350cm 外,应该先用普通移动接近,再播放攻击 Montage,而不是让 Warping 硬拖 350cm。

使用案例:攀爬落点

攀爬动画常常有两个关键点:手抓边缘和脚落平台。Motion Warping 只能对齐你指定的目标,复杂动作可以拆两个窗口:第一段对齐手部抓点,第二段对齐落脚点。不要指望一个全程窗口同时解决所有身体部位。

常见坑

  • Montage 和 AnimSequence 的 root motion 设置不一致,预览里能动,运行时不动。
  • 动画根骨方向和角色 Forward 不一致,Warp Rotation 看起来像绕圈。
  • 胶囊原点、Mesh 偏移、脚底位置混为一谈。
  • 用 Motion Warping 代替导航接近,导致远距离突然冲刺。
  • 把脚贴地问题交给 Motion Warping,实际上更适合 IK 或 Foot Placement。

源码依据

UMotionWarpingUtilities::ExtractRootMotionFromAnimation 可以从动画范围提取 root motion。ProcessRootMotionPreConvertToWorld 的名字已经说明它发生在 local root motion 转 world 之前。FMotionWarpingUpdateContext 带着 Animation、PreviousPosition、CurrentPosition、Weight、PlayRate 和 DeltaSeconds,让 Modifier 知道当前处理的是哪段动画。

源码路径索引

  • MotionWarping/Public/MotionWarpingComponent.h
  • MotionWarping/Private/MotionWarpingComponent.cpp
  • MotionWarping/Public/MotionWarpingCharacterAdapter.h
  • MotionWarping/Public/RootMotionModifier.h