作者:Miles Macklin & Matthias Muller
单位:NVIDIA
时间:2016
前言
本文要解决的主要问题是PBD中的刚度系数的迭代次数依赖问题。具体来说,仿真效果依赖于时间步长,或者说迭代次数。这会在以下两个方面造成问题:
- 参数(也就是刚度系数)与迭代次数有关。而且刚度系数是全局的,假如场景内同时出现多种材料(比如刚体和软体混合),就很难调整参数。
- 迭代次数的影响是非线性的,很难去手动调整参数。(迪士尼定律:参数与最终效果最好成线性关系,以利于艺术家去调整)
为了解决该问题,本文提出了一种新的约束公式。该约束公式与弹性势能的概念对应。公式的推导基于隐式时间积分和总拉格朗日乘数。
背景
让我们先回顾一下PBD:
PBD针对每个粒子,移动其位置以满足粒子间约束。下面的施公式给出了每个粒子应该移动的方向和距离。这有些类似梯度下降法。移动的方向为约束的梯度方向
而其中s控制了应该移动的步长
除了s以外,k是刚度系数,为用户给定的参数,M则是粒子质量所决定的一个系数。k在0到1之间取值。
下标i代表第i次迭代,j代表第j个约束。这个公式对每个粒子都成立,所以我们就不标注粒子的下标了。
关键问题就在于这个kj。我们看到k具有下标j。这代表它和迭代次数是有关的。但是用户控制的参数与迭代次数有关,这就造成了很难给定合适的参数。
XPBD正是为此而提出的新算法。它的算法流程如下:
公式(17)为
公式(18)为
我们对比PBD,发现其算法只是在一个方面进行了修改:也就是公式(18)。这就是XPBD的核心所在。
刚度系数k不见了,取而代之的是新的系数 α j ~ \tilde{\alpha_j} αj~。
这个新的系数 α j ~ \tilde{\alpha_j} αj~是融入到之前的缩放因子s当中的。
很显然,当 α j ~ = 0 \tilde{\alpha_j}=0 αj~=0的时候,XPBD的公式18就退化回了PBD的s公式。
这个 α j ~ \tilde{\alpha_j} αj~叫做柔度系数。它实际上就是刚度系数的倒数(注意是整个矩阵的倒数,也就是矩阵的逆,不是单个值取倒数)。它和刚度系数一样,代表约束的强弱。如果是柔度为0,代表约束必须被满足。而柔度大则代表这个约束比较弱。
除了 α j ~ = 0 \tilde{\alpha_j}=0 αj~=0以外,我们还发现公式(18)中有一个新的变量 λ i j \lambda_ij λij。这是一个标量,需要在迭代循环中也一起存储并且更新。这就是XPBD的额外开销。我们看算法流程中的步骤9就是更新 λ i j \lambda_ij λij。它代表的是总拉格朗日乘数法中的乘数。下标ij代表它对应第i次迭代的第j个约束。
结果
1 简单谐振
首先对比精确解与数值解以衡量该方法的精度。
下图展示的是不同迭代次数的PBD方法与XPBD方法与精确解的对比。
所模拟的是弹簧的简单谐振运动。只使用了距离约束。静息距离为x=1,初始距离x0=1.5,质量mass=1,柔度alpha设为0.001。
显然XPBD的结果(绿色曲线)和精确解(蓝色曲线)吻合得很好。而PBD吻合较差。无论XPBD所采用的迭代次数是多少,结果总是这样的。而PBD结果则显然与迭代次数有关。
2 铰链
本算例用于与牛顿求解器进行对比。
用20个粒子组成一个铰链。然后令它自由下落。下图是不同时刻的铰链位置图(所有时刻都被画出来了)。左图是牛顿求解器,右图是XPBD。 mass=1.0,
α
=
1
0
−
8
\alpha=10^{-8}
α=10−8 XPBD迭代次数50
下图是铰链顶部粒子所受约束力的曲线对比图。横坐标为帧数。
3 悬臂梁
此算例与FEM进行对比。
为了与FEM进行对比,首先要把不同的参数进行统一。于是定义柔度矩阵为刚度矩阵的逆。其中lambda和mu是两个拉梅参数
FEM采用Saint Venant-Kirchoff公式。杨氏模量E取
1
0
5
10^5
105,泊松比0.3,时间步长0.008s。仍然采用第50帧结果。XPBD迭代次数50。
从视觉效果上几乎无差别。左图为FEM。右图为XPBD,迭代次数20。仿真结果为第50帧。
下图曲线对比的是悬臂梁例子FEM(牛顿求解器)与XPBD的约束h^2的曲线。
布料
下图为PBD(上排)与XPBD(下排)对比。从左到右迭代次数依次为20 40 80 160。
该布料采用64x64个粒子。约束共计24K个,均为距离约束。
PBD刚度系数为0.01。可以认为alpha=0的情况对应k=1的情况。
上图中PBD结果会随着迭代次数增加而变硬阻尼变大,但XPBD不受影响。
实验还对比了两者的耗时。对比发现XPBD只比PBD慢了不到2%。其主要效果在于仿真效果不受迭代次数的影响。
气球
气球内部采用体积约束,外部类似于可拉伸、弯曲、剪切的布料。
下图为XPBD效果