【UE】混合程序动画

混合程序动画

github.com/EanoJiang/HybridAnim

Part01 头部朝向目标点

1.控制点测试效果

1785121076488

1785133740309

关于aim节点:

  • Primary (Aim)
    • Axis : 指向目标的轴,头部朝向一般是向前
    • Target :目标位置
  • Secondary (Up)
    • Axis : 用来定义“向上”的轴,确保骨骼在旋转时不会发生翻转。
    • Target :向上的方向

2.在Level中头部朝向目标

1785204793822

角色蓝图

tick:

1785204821473

ControlRig

LookAtTarget要设置为public,就可以在动画蓝图中暴露出来

1785205001875

从世界坐标转换为Rig坐标

1785204963708

动画蓝图

Initial:得到角色蓝图实例

1785204867597

update:从蓝图传递参数

1785204892739

传入参数到ControlRig

1785205102325

效果:

1785205426215

3.利用Level Sequence创建Left-Right look动画

录制教程:

1785210130700

4.加入到动画蓝图

对动画序列的Additive设置如下:局部空间 以中间帧15帧为基准

1785220831189

ControlRig中设置LeftRightLookBlend曲线值映射:[-90,90]->[-0.5,0.5]

因为曲线的默认值是0,为了不让默认时刻身体朝向正中间,曲线必须映射为[-0.5,0.5]

1785221737718

1785231564347

1785231580591

Spring Interpolate 是 Control Rig 中一个**基于物理弹簧模拟的平滑插值节点,离目标越远,逼近速度越快;越近则越慢

**

  • Strength:弹簧的刚度决定了它向目标方向的拉力大小。该数值表示在无阻尼条件下弹簧的振荡频率。
  • CriticalDamping:弹簧的阻尼系数
    • = 1.0 → 临界阻尼:最快回到目标且无振荡(推荐默认)
    • < 1.0 → 欠阻尼:会产生来回振荡(弹性晃动效果)
    • > 1.0 → 过阻尼:更慢但更稳定地逼近

动画蓝图添加叠加层Additive,叠加层动画播放进度用LeftRightLookBlend曲线控制,由于前面曲线映射为[-0.5,0.5],因此这里需要加上0.5再传入ExplicitTime

1785402433802

效果:

1785225908161

5.限制头部旋转量在90度以内

头部旋转量 = aim后的Rotation - 头部初始Rotation

注:四元数Quat不能相减,四元数A和B的旋转差 实际上是 A 乘 B 的"逆"
——如果想要四元数的旋转差用"-"来运算,可以考虑重载运算符

1785232876551

Part02 与其他动作混合(抓取、攻击、环境交互)

创建动画

1785311619261

fk和ik的切换
1785311973708
1785312002955
勾上即切换到ik

目标位置偏移

1785394704759

1785394578316

原理:实际抓取的位置 - 动画资产中抓取的位置 = 产生的偏移量
目标位置= 偏移量 × HandGrab曲线值 + 手部自身的位置

控制点

1785394747389

1785394737146

蒙太奇的动画曲线HandGrab

1785395041551

效果:

1785395145399

抓取场景中实际的物体位置

1785402382665

把原来测试用的控制点换成实际要抓取物体位置

1785402505930

1785402628541

效果:

1785404829785

一些潜在问题以及应用场景

1.目标位置距离角色太远

有时候,当目标位置距离角色太远时,角色的身体可能会为了够到目标而发生轻微扭曲或倾斜,看起来会有些不自然,甚至显得有点傻。因此可以通过一些方式解决这个问题。

例如,可以设定一个目标距离范围:如果目标离玩家过远,可以在 Control Rig 中移动角色的骨盆,让身体向前倾,或者仅将身体向前移动,同时保持双脚留在原地。也可以通过第三人称角色蓝图直接让角色走进范围后再拾取。

不过,更合理的方案通常是只允许角色抓取处于可及范围内的物体,而不是让角色尝试抓取明显过远、不适合抓取的目标。角色不应该被允许去够那些距离过远的物体。

最简单的实现方法是在第三人称角色中,在角色前方设置一个碰撞盒(Box Collision)或碰撞球(Sphere Collision),用于检测哪些物体处于角色的抓取范围内。当玩家尝试抓取时,例如按下鼠标左键,可以获取这个碰撞体内所有重叠的 Actor,并检查这些对象是否带有“可拾取(Pickable)”之类的标签,或者是否属于角色能够拾取的对象类型。

除了重叠检测外,还应当进行距离检查。可以检测目标与角色、角色头部,或者角色手臂之间的距离,确认目标确实位于合理的抓取范围内。因为即使某个物体与碰撞体发生了重叠,它也不一定真的处于你期望的可抓取位置。

此外,还可以进行一次射线检测(Line Trace),确认角色能够“看到”想要拾取的物体。理论上,一个物体可能位于角色的可抓取范围内,也可能与碰撞体重叠,但它可能在一面墙的后面。此时角色实际上无法直接接触该物体,因此需要确保角色与目标之间没有墙体或其他障碍物阻挡。

这些都是可以在蓝图中完成的基础判断逻辑。通过距离、碰撞重叠和视线检测,可以避免角色对不合理的位置执行抓取动画。

这类动画本质上是一种动态调整动画。它可以用于拾取物体,也可以用于让角色朝某个目标出拳。无论是抓取还是攻击,基本都可以使用相同的逻辑。

2.目标位置适应角色移动速度

Part01 + Part 02 两种程序动画混合

1785405407662

lookblend的附加动画要在HandGrab蒙太奇插槽的后面,否则会被蒙太奇覆盖

然后HeadAim的权重用HandGrab曲线来控制,可以乘一个float来调节这个比重

1785405495868

效果:

1785405748779

Part03 动态程序化下蹲

创建下蹲动画(不带Pelvis位移,Pelvis位移应该由ControlRig实时控制)

1785464059796

动画序列CrouchBlendAnim设置,基础Pose为第0帧

1785828716636

ControlRig

1785831073748

计算目标PelvisZOffset和CrouchCurve曲线的重映射值

1785831096091

1785833186374

1785833194570

FullBodyIK添加foot_l,foot_r,pelvis以及对应Target,设置CrouchBlendCurve

1785831197098

动画蓝图

1785831297089

效果:

1785833323576

Part04 动态放缩动画速度

只加快每只脚摆动踩地的速度

1785898927581

1785899030019

动画蓝图中暴露相应SequencePlayer的PlayRate参数传入CurveValue即可

注意事项

这是动画缩放的一个应用案例,还可以用于其他场景,例如放缩攻击动画的播放速度。

不过需要注意,这种基于“双脚是否同时离地”进行判断的方法并不适用于走路动画。

跑步动作中会出现两只脚同时离开地面的腾空阶段,因此可以利用双脚同时离地的时间段作为判断或驱动条件;而走路的定义是始终至少有一只脚接触地面,并且在步态转换时通常还会出现双脚同时接触地面的阶段:双脚落地后,其中一只脚抬起,随后再次回到双脚接触地面的状态。也就是说,走路没有双脚同时离地的阶段,而跑步中双脚离地的重叠区间正是这种方法能够生效的原因。

Part05 程序化状态过渡

动画序列

1785912018154

ControlRig

1786087462118

保存当前新的Pose和Bone

1786087470079

过渡阶段
1.pelvis的子骨骼旋转

1786087502094
2.一次放置一只脚

1786087511907

不在过渡的时候保存OldFoot

1786087524798

一步步移动pelvis重心

1786087531871

动画蓝图

1785921483677

状态机

1785921489871

1785921508304

1785921515913

状态转换逻辑

1785921535134

1785921542579

1785921553546

Blend Logic选用Custom,然后编辑如下:

1786089762923

加上所有anim的效果:

1786334271927

防止因为过渡时间不够导致的最终Pose跳变

1786331901086

让pelvis重心偏移程度取决于双脚之间的距离

1786332389697

1786332406041

Part04 帧动画和程序移动系统

1786345310063

posted @ 2026-07-30 17:49  EanoJiang  阅读(173)  评论(0)    收藏  举报