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 天前
UE 网络同步之 为什么属性复制比RPC更节省性能
ue·网络同步
晴夏。17 天前
unlua实现原理
游戏·ue5·ue4·lua·ue·unlua
晴夏。18 天前
c++调用lua的方法
c++·游戏引擎·lua·ue
晴夏。18 天前
UE Spawn出来的Actor的生命周期和管理方法
游戏·ue5·ue4·ue
晴夏。18 天前
UE垃圾回收的全方面讲解(通俗易懂)【底层实现、触发方式、引用保持、优化、工具】
ue5·游戏引擎·ue·垃圾回收
晴夏。20 天前
GAS下的网络同步的全面分析【超级全面】
游戏引擎·ue·gas·网络同步
晴夏。24 天前
UE5第三人称模板实现及相关引擎源码分析
unity·ue5·游戏引擎·ue
晴夏。24 天前
UE原生MovementBase实现分析
游戏引擎·ue·3c
晴夏。25 天前
UE原生第三人称相机源码分析
游戏·ue5·ue4·相机·ue·3c