UE 常见IK算法

游戏中常见 IK 类型与算法详解

本文系统梳理游戏开发中常见的 IK(逆向运动学)类型及其底层算法,从最简单的 Two-Bone IK 到 UE5 的 Full-Body IK,按"链长分类 → 应用场景分类 → 现代化方案"三个维度展开,并附选型对比表与实战经验。


一、整体概览

1.1 什么是 IK

IK(Inverse Kinematics,逆向运动学) 解决的核心问题是:

已知骨骼链末端(End Effector)想要到达的目标位置,反推中间各骨骼应该如何旋转。

与之相对的是 FK(Forward Kinematics,正向运动学):从根骨骼开始,逐级旋转,最终决定末端位置。

  • 美术 K 出来的动画基本都是 FK
  • IK 通常用于"动画与环境交互"的场合,例如脚踩斜坡、手扶物体、头部看向目标

1.2 通俗类比

  • FK:你先决定肩膀转多少度、肘关节转多少度、手腕转多少度,最后看手到了哪里
  • IK:你先告诉手要去摸那个杯子,算法替你决定肩、肘、腕分别该怎么转

1.3 文章结构

本文按以下三个维度展开:

维度 包含算法
按链长分类 Two-Bone IK、CCD IK、FABRIK
按应用场景分类 Foot IK、Hand IK、LookAt IK
现代化方案 Full-Body IK(FBIK)、Jacobian-based IK

二、按骨骼链长度分类

2.1 Two-Bone IK(双骨 IK)------ 最常见 【核心】

应用场景:

  • 手臂(肩-肘-腕)
  • 腿部(髋-膝-踝)
  • 任何"两段一关节"的结构

算法本质:解析解(Analytic Solution),用余弦定理一次算出,无迭代。

整体流程

整个流程可以概括为:已知三角形三条边的长度,求中间那个角的弯曲角度。

通俗讲:手臂就是一个三角形,肩膀和手腕是固定的两个端点,肘关节是中间那个折弯的点。只要知道肩到手的直线距离,加上大臂、小臂的长度,就能用余弦定理算出肘要弯多少度。

详细步骤
  1. 已知三个骨骼:Root(根)、Joint(中间关节)、End(末端)
  2. 已知两段长度 L1(Root→Joint)、L2(Joint→End)
  3. 已知目标位置 Target,计算 Root→Target 的距离 D
  4. 用余弦定理算出 Joint 处的弯曲角度:

\\cos\\theta = \\frac{L_1\^2 + L_2\^2 - D\^2}{2 L_1 L_2}

  1. 用一个 Pole Vector(极向量 / 朝向参考点) 决定关节朝哪一边弯(膝盖朝前还是朝后)
优缺点
优点 缺点
解析解,一次算出,性能极高 只能处理两段骨骼
无迭代、无收敛问题 链长超过两段就不适用
实现简单 Pole Vector 不稳定时膝盖会"反折"

核心 :UE 中的 FAnimNode_TwoBoneIK 就是这个算法。几乎所有"脚踩地面"、"手扶物体"的需求都用它。


2.2 CCD IK(Cyclic Coordinate Descent,循环坐标下降)

应用场景:链条较长且对精度要求不高的场合

  • 尾巴、触手、绳子末端
  • 机械臂

算法本质:迭代法。

整体流程

通俗讲:每个关节都"自己努力一下",让末端朝目标贴近一点点,反复轮询直到差不多就行。

详细步骤
  1. 从末端骨骼向根骨骼方向遍历每一根骨骼
  2. 对每一根骨骼,把它旋转一个角度,使得"末端骨骼当前位置"对齐到"目标位置"
  3. 一轮遍历完算一次迭代
  4. 不收敛则继续下一轮,直到末端足够接近目标,或达到最大迭代次数
优缺点
优点 缺点
实现简单 收敛速度不稳定,复杂姿态可能抖动
对任意链长都适用 越靠近末端的骨骼旋转幅度越大,看起来不自然("近端僵硬"问题)
容易加角度约束 迭代次数高时性能开销不小

核心 :UE 自带 FAnimNode_CCDIK。


2.3 FABRIK(Forward And Backward Reaching Inverse Kinematics)【核心】


应用场景:

  • 长骨链、脊柱
  • 蛇形生物、多段触手
  • UE 中相当主流的长链 IK 方案

算法本质 :迭代法,但本质是位置约束求解,不是基于角度。

整体流程

把骨骼链当成一串等长的珠子,先抓住末端拉到目标位置,整串被拖走;再抓住根骨拉回原位,整串又被拽回去。来回拉几次,整串就自然弯到目标姿态了。

每轮迭代分为两个 Pass:

详细步骤

Backward Pass(从末端往根走):

  1. 把末端骨骼的位置直接设为 Target
  2. 从末端往根遍历,每一根骨骼"向上拉"前一根,使两者距离保持等于原始骨长

Forward Pass(从根往末端走):

  1. 把根骨骼位置拉回原始位置(保证根不漂走)
  2. 从根往末端遍历,每一根骨骼"向下拉"后一根,距离仍然保持等于原始骨长

反复执行两个 Pass,直到末端足够接近 Target。

优缺点
优点 缺点
收敛速度比 CCD 快很多 原版只解位置不解旋转
不基于角度,没有万向锁问题 骨骼的 twist(轴向扭转)需要额外处理
形变看起来比 CCD 自然得多
容易支持多末端、多分支(人形两手两脚都是 effector)

核心 :UE 自带 FAnimNode_Fabrik,是目前游戏里长链 IK 的主力方案。


三、按应用场景分类

3.1 Foot IK(脚部 IK)【核心】

应用场景:角色站斜坡、踩台阶、脚不要陷进地里也不要悬空。

算法本质 :Two-Bone IK + 射线检测 的组合。

整体流程

通俗讲:在动画播放完后,往脚下打一条射线,看看地面到底在哪里。然后告诉 Two-Bone IK:"把脚挪到地面上去",并且让脚掌按地面的角度倾斜一下。

详细步骤
  1. 从骨盆或脚的位置向下做一条 LineTrace(射线检测)打到地面
  2. 拿到地面命中点的高度和地面法线
  3. 比较"动画里脚的位置"和"地面命中点"的高度差
  4. 用这个高度差驱动 Two-Bone IK,把脚 IK 到正确位置
  5. 用地面法线旋转脚掌骨骼,使脚贴合斜面
  6. 反向调整骨盆高度(Pelvis Adjustment),让较低那条腿不至于过度伸直
实战注意点(合理推论)
  • 项目里大概率会做 Lerp 平滑处理,避免走过台阶时脚位置突变
  • 需要做"是否在地面"的状态判断,腾空时关闭 IK
  • 射线检测的起点和长度要根据角色尺寸调,太短打不到台阶,太长会"踩到"远处的物体

3.2 Hand IK(手部 IK)

应用场景:

  • 双手扶武器(双持枪左手贴握把)
  • 攀爬抓墙、按按钮

算法 :和 Foot IK 类似,Two-Bone IK 把手 IK 到目标点,外加手腕骨骼朝向修正。


3.3 LookAt IK(眼睛 / 头部朝向 IK)

应用场景:

  • 角色眼睛盯着玩家
  • 头部跟随目标转动
  • 敌人看向主角

算法 :本质是给一根或几根骨骼做 LookAt 旋转矩阵计算(不是真正的 IK 求解,但 UE 把 LookAt 节点也归在 IK 类节点里)。

关键约束:

  • 通常会加上朝向角度限制(脖子最多转 80 度之类),防止头转 180 度
  • 多骨骼分配:脖子转一部分、头骨转一部分、眼球转一部分,看起来更自然

四、现代化方案

4.1 Full-Body IK(FBIK,全身 IK)

应用场景:UE5 推荐方案,支持任意骨骼作为 effector,多目标同时求解。

  • 动捕重定向
  • Procedural 动画
  • 攀爬时四肢同时贴墙

算法本质(合理推论,基于 UE 公开资料) :UE5 的 FBIK 底层使用了 Jacobian Transpose / PBD(Position Based Dynamics)类 的迭代求解器,配合骨骼约束(角度限制、Preferred Angle 偏好角度等)。

优缺点
优点 缺点
一次性求解整个骨架 性能开销比单链 IK 大得多
多个 effector 可以同时收敛 迭代次数多
支持各种约束(角度、Pin、Pole) 调参复杂
适合复杂交互

与之配套的是 IK Rig + IK Retargeter,UE5 里用于动画重定向的标准管线。


4.2 Jacobian-based IK(雅可比矩阵法)

应用场景 :学术界、机械臂仿真、高自由度系统;游戏里直接用得少,但是 FBIK 类方案的理论基础。

算法核心思想
  • 把"末端位置对每个关节角度的偏导"组成雅可比矩阵 J
  • 末端位置变化量 ΔX 与关节角度变化量 Δθ 的关系:

\\Delta X = J \\cdot \\Delta \\theta

  • 反过来要从 ΔX 求 Δθ,就需要 J⁻¹ 或伪逆 J⁺
常见变体

由于 J 通常不可逆,业界使用三种变体:

方法 公式 特点
Jacobian Transpose 用 Jᵀ 近似 最简单、稳定但慢
Pseudo Inverse J⁺ = Jᵀ(JJᵀ)⁻¹ 更准但矩阵奇异时不稳定
DLS(阻尼最小二乘) J⁺ ≈ Jᵀ(JJᵀ + λ²I)⁻¹ 业界常用,加阻尼避免奇异
优缺点
优点 缺点
理论严谨 矩阵运算开销大
可处理任意自由度 需要多次迭代
容易加约束 实现复杂

五、选型对比表

算法 链长 性能 自然度 收敛性 实现难度 典型用途
Two-Bone IK 2 段 极快 好 解析解 简单 手脚 IK
CCD IK 任意 中 一般 慢 简单 尾巴、机械臂
FABRIK 任意 较快 好 较快 中等 长骨链、脊柱
LookAt 1-3 段 极快 - 解析解 极简 头部、眼球朝向
Full-Body IK 全身 慢 很好 看求解器 复杂 全身 procedural
Jacobian (DLS) 任意 慢 好 中等 高 学术、高自由度系统

六、实战经验(合理推论)

以下经验基于通用游戏开发实践,并非来自具体某一项目代码:

6.1 算法选型原则

  1. 能用解析解就别用迭代:手脚永远优先 Two-Bone IK
  2. 长链优先 FABRIK:CCD 仅在需要严格角度约束时考虑
  3. 全身交互上 FBIK:但要做好性能预算

6.2 IK 平滑过渡

IK 一定要做 Alpha 混合:从 0 到 1 平滑过渡,不然切换瞬间会"爆姿"。

例如角色起跳的瞬间从"地面 IK 开"切到"地面 IK 关",如果不做 Alpha 渐变,脚会瞬间从 IK 位置跳回动画位置。

6.3 Pole Vector 的稳定性

Pole Vector 的稳定性是个大坑。

如果 Pole 跟着角色乱跳,膝盖会反向弯。通常的做法是:

  • 从动画里采样一个稳定的 Pole 位置
  • 或者用骨盆某根骨骼向前偏移作为 Pole

6.4 Foot IK 的高度突变

Foot IK 最容易出问题的是高度突变。

走过台阶、踩到小石头时,目标高度会瞬间变化,需要:

  • Lerp 平滑过渡
  • 速度限幅(每帧最多升降多少)

6.5 多个 IK 节点的执行顺序

多个 IK 节点的执行顺序会影响最终姿态。UE 里通常的顺序是:

复制代码
FK 动画 → Spine IK → Foot IK → Hand IK → LookAt

原因(合理推论):脊柱先确定身体姿态,再脚踩地面、手扶物体,最后头转向目标。如果反过来,脊柱一动就把前面 IK 好的脚和手又带歪了。


七、总结

类别 推荐方案
两段骨骼 Two-Bone IK(解析解,最快)
长骨链 FABRIK(自然度高、收敛快)
简单尾巴 CCD IK(实现简单)
全身求解 Full-Body IK(UE5 标配)
头部朝向 LookAt + 角度约束

IK 的本质,是用算法去填补"动画"和"环境"之间的鸿沟------动画是离线 K 出来的固定姿态,而环境是实时变化的,IK 就是让角色"实时反应"那个微小但关键的差异。理解每种 IK 的算法本质和适用边界,比记住 UE 节点名更重要。

相关推荐
、达西先生1 个月前
GVHMR_原理与脚滑处理总结小trick
人体姿态估计·ik·gvhmr
夜猫逐梦3 个月前
【UE源码精读-ActionRPG】GAS基础:能力与效果容器
ue·unreal·ue基础
夜猫逐梦3 个月前
【UE源码精读-ActionRPG】伤害管线:从捕获到扣血
ue·unreal·ue基础
夜猫逐梦4 个月前
【UE基础】03.蓝图与编辑器工作流
编辑器·ue·蓝图·ue编辑器
夜猫逐梦4 个月前
【UE基础】02.基类与蓝图子类的分工
ue·蓝图·ue基础
夜猫逐梦4 个月前
【UE基础】01.环境与引擎心智模型
游戏·逆向·ue·unreal·actionrpg
数峦云数字孪生三维可视化4 个月前
数字孪生可视化架构选型:基于UE像素流送与Web引擎的完整决策指南
数字孪生·ue·web3d·技术选型·像素推流
Huanzhi_Lin4 个月前
spine相关概念
spine·slots·ik·animations·bones·skins·skeleton
挨代码4 个月前
UEC++ 数据类型及继承关系
c++·ue
挨代码5 个月前
UE Mobility
ue