游戏中常见 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),用余弦定理一次算出,无迭代。
整体流程
整个流程可以概括为:已知三角形三条边的长度,求中间那个角的弯曲角度。
通俗讲:手臂就是一个三角形,肩膀和手腕是固定的两个端点,肘关节是中间那个折弯的点。只要知道肩到手的直线距离,加上大臂、小臂的长度,就能用余弦定理算出肘要弯多少度。
详细步骤
- 已知三个骨骼:Root(根)、Joint(中间关节)、End(末端)
- 已知两段长度
L1(Root→Joint)、L2(Joint→End) - 已知目标位置
Target,计算 Root→Target 的距离D - 用余弦定理算出 Joint 处的弯曲角度:
\\cos\\theta = \\frac{L_1\^2 + L_2\^2 - D\^2}{2 L_1 L_2}
- 用一个 Pole Vector(极向量 / 朝向参考点) 决定关节朝哪一边弯(膝盖朝前还是朝后)
优缺点
| 优点 | 缺点 |
|---|---|
| 解析解,一次算出,性能极高 | 只能处理两段骨骼 |
| 无迭代、无收敛问题 | 链长超过两段就不适用 |
| 实现简单 | Pole Vector 不稳定时膝盖会"反折" |
核心 :UE 中的
FAnimNode_TwoBoneIK就是这个算法。几乎所有"脚踩地面"、"手扶物体"的需求都用它。
2.2 CCD IK(Cyclic Coordinate Descent,循环坐标下降)
应用场景:链条较长且对精度要求不高的场合
- 尾巴、触手、绳子末端
- 机械臂
算法本质:迭代法。
整体流程
通俗讲:每个关节都"自己努力一下",让末端朝目标贴近一点点,反复轮询直到差不多就行。
详细步骤
- 从末端骨骼向根骨骼方向遍历每一根骨骼
- 对每一根骨骼,把它旋转一个角度,使得"末端骨骼当前位置"对齐到"目标位置"
- 一轮遍历完算一次迭代
- 不收敛则继续下一轮,直到末端足够接近目标,或达到最大迭代次数
优缺点
| 优点 | 缺点 |
|---|---|
| 实现简单 | 收敛速度不稳定,复杂姿态可能抖动 |
| 对任意链长都适用 | 越靠近末端的骨骼旋转幅度越大,看起来不自然("近端僵硬"问题) |
| 容易加角度约束 | 迭代次数高时性能开销不小 |
核心 :UE 自带
FAnimNode_CCDIK。
2.3 FABRIK(Forward And Backward Reaching Inverse Kinematics)【核心】

应用场景:
- 长骨链、脊柱
- 蛇形生物、多段触手
- UE 中相当主流的长链 IK 方案
算法本质 :迭代法,但本质是位置约束求解,不是基于角度。
整体流程
把骨骼链当成一串等长的珠子,先抓住末端拉到目标位置,整串被拖走;再抓住根骨拉回原位,整串又被拽回去。来回拉几次,整串就自然弯到目标姿态了。
每轮迭代分为两个 Pass:
详细步骤
Backward Pass(从末端往根走):
- 把末端骨骼的位置直接设为 Target
- 从末端往根遍历,每一根骨骼"向上拉"前一根,使两者距离保持等于原始骨长
Forward Pass(从根往末端走):
- 把根骨骼位置拉回原始位置(保证根不漂走)
- 从根往末端遍历,每一根骨骼"向下拉"后一根,距离仍然保持等于原始骨长
反复执行两个 Pass,直到末端足够接近 Target。
优缺点
| 优点 | 缺点 |
|---|---|
| 收敛速度比 CCD 快很多 | 原版只解位置不解旋转 |
| 不基于角度,没有万向锁问题 | 骨骼的 twist(轴向扭转)需要额外处理 |
| 形变看起来比 CCD 自然得多 | |
| 容易支持多末端、多分支(人形两手两脚都是 effector) |
核心 :UE 自带
FAnimNode_Fabrik,是目前游戏里长链 IK 的主力方案。
三、按应用场景分类
3.1 Foot IK(脚部 IK)【核心】
应用场景:角色站斜坡、踩台阶、脚不要陷进地里也不要悬空。
算法本质 :Two-Bone IK + 射线检测 的组合。
整体流程
通俗讲:在动画播放完后,往脚下打一条射线,看看地面到底在哪里。然后告诉 Two-Bone IK:"把脚挪到地面上去",并且让脚掌按地面的角度倾斜一下。
详细步骤
- 从骨盆或脚的位置向下做一条 LineTrace(射线检测)打到地面
- 拿到地面命中点的高度和地面法线
- 比较"动画里脚的位置"和"地面命中点"的高度差
- 用这个高度差驱动 Two-Bone IK,把脚 IK 到正确位置
- 用地面法线旋转脚掌骨骼,使脚贴合斜面
- 反向调整骨盆高度(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 算法选型原则
- 能用解析解就别用迭代:手脚永远优先 Two-Bone IK
- 长链优先 FABRIK:CCD 仅在需要严格角度约束时考虑
- 全身交互上 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 节点名更重要。