Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

迭代求解器

在构建完所有约束(接触、摩擦、关节)之后,我们得到一个巨大的、耦合的线性互补问题(LCP):

并附带 的各种限制(如非负性)。对于一个有成百上千个接触点的复杂场景,一次性精确求解这个巨大的方程组(这被称为直接法)在计算上是不可行的。迭代求解器 (Iterative Solvers) 提供了一种高效得多的替代方案。它不追求一步到位找到精确解,而是通过多次(例如10-20次)简单、快速的迭代,逐步逼近最终的正确解。这种方法的思想简单、实现鲁棒,并且能够自然地处理不等式约束,是所有现代实时物理引擎的核心。

1. 为什么需要迭代?耦合问题

想象一个三个箱子堆叠的场景:A 在 B 上,B 在 C 上。B 的稳定不仅依赖于 C 给它的支撑力,也依赖于 A 施加给它的压力。C 的稳定则依赖于 A 和 B 共同的压力。所有这些约束都是耦合 (coupled) 在一起的。单独求解任何一个约束,而不考虑其他约束的影响,是得不到正确结果的。

迭代求解器正是通过“迭代”来解决这个耦合问题。在每一轮迭代中,它都会重新计算每个约束的冲量,而在计算约束 i 时,它会利用到其他约束 j本轮迭代中已经计算出的最新结果。这样,信息(如压力)就可以在约束之间“传播”开来。经过多次迭代,整个系统会逐渐“沉降”到一个满足所有约束的平衡状态。

2. 投影高斯-赛德尔 (PGS) / 顺序脉冲 (SI)

这是迄今为止在游戏物理引擎中最流行、最成功的迭代求解算法。算法按照一个固定的顺序,逐一处理列表中的每一个约束。对于每个约束,它计算并施加一个可以满足该约束的冲量增量 (impulse delta)。使用高斯-赛德尔 (Gauss-Seidel)的经典迭代方法。其核心思想是,在计算第 i 个未知数时,立即使用在本轮迭代中已经计算出的前 个未知数的最新值。意味着当我们求解一个约束的冲量后,我们会立即用这个冲量去更新相关物体的速度。这样,在处理下一个约束时,它就能“看到”前一个约束所产生的效果。

3. 速度迭代求解

下面我们推导一下如果把 的迭代方式转为速度迭代的求解方式。

对于第 个约束力,可以表示成

我们根据 进行展开,

使用GS方程的迭代方式,我们根据 来设置 迭代公式

的第 次迭代,方程变成

引入迭代的变化量 ,

将下面的等式代入迭代的方程中,

把等式转为 迭代的等式,

前面我们知道

使用 的GS定义 代入上面,可以得到

我们发现此时 的等式可以利用上面的等式中 进行整理

这个 带来的速度改变为