基于位置的动力学

本文最后更新于:2021年4月7日 晚上

算法描述

物体的动力学可由 $N$ 个顶点和 $M$ 个关于顶点位置的约束进行描述.第 $i$ 个顶点的质量、位置、速度分别记作 .第 $j$ 个约束可能为等式或不等式,记作

我们用符号 $\succ$ 来表示 $=$ 或 $\ge$,并且令 ,则第 $j$ 个约束可简记为

基于位置的动力学(Position Based Dynamics)简称为PBD.该算法会先计算出每个顶点的初始预测位置 ,然后尝试移动 使其满足所有约束

PBD的具体算法可由以下伪代码表示.


图1 - PBD 伪代码

求解器

在PBD伪代码中,第8至第10行是求解器的迭代求解.这里的函数

是方程/不等式组

的一个非线性Gauss-Seidel求解器.求解器 会对约束 依次进行一阶线性化求解.每次求解完 ,求解器会当即更新 的值,使之影响对 的求解.下面我们将具体介绍 的求解方法.

如果约束是一个等式,我们希望找到一个 使得 ,其中 .对其进行一阶线性化可得

上述方程的一般会有无穷个解.如果我们将解 限制在

的方向上,即令

我们就可以求出一个特解

$C_{j}$ 的求解方法,就是用 来更新原来的 .因此, 函数可用伪代码表示成


图2 - $\mathrm{projectConstraints}$ 求解器伪代码

特定约束

拉伸

拉伸约束为

其中 $d$ 代表初始长度。计算梯度,可得

于是

SDF碰撞

SDF碰撞约束为

矫正量

例子:球面SDF碰撞

给定半径为 $r$ 的球面,它的SDF碰撞约束为

矫正量

数值微分的计算

我们可以使用四面体技巧对 SDF 数值微分的计算进行优化。设

考虑求和

由此可以得到


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!