目前流体模拟中常用的2种方法,分别代表了从2种不同的方面来解释Navier-Stokes的流体方程Eulerian从空间固定点观察该点的值得变化,这就是Navier-Stokes方程中第一项是速度V(x,y,z,t)关于时间的偏导数的物理意义,也就是当取定向量或者数量场的空间一点坐标后,固定观察该点得数量或者向量值得变化。Lagrangian方法则将液体看作是跟随着流动的Particle,也因此对于一个Particle来说任何物理量不再是关于时间t的偏导数而是关于时间的全导数以速度场为例,速度关于时间地变化不再是Vt(x,y,z,t),而是Vt(x(t),y(t),z(t),t)很显然这时候Particle的速度和运动轨迹行成了一个微分方程组
X(t)' = Vt(x(t),y(t),z(t),z)的x分量;
Y(t)' = Vt(x(t),y(t),z(t),z)的y分量;
Z(t)' = Vt(x(t),y(t),z(t),z)的z分量;
这时候速度关于时间的全导数(也就是物理意义上的该Particle的加速度)就是Navier-Stokes方程的第一二项之和,如果根据求导链式法则展开DVt(x(t),y(t),z(t),t)/Dt可以看到正好等于这2项,因次实际上Eulerian和Lagrangian只是从不同的物理角度来看Navier-Stokes方程而已。
从2种方法的数值求解来看个人认为Eulerian比较容易理解,但是数值求解过于复杂需要使用中心差分来离散化公式中出现的梯度,而且最后为了求解个点处的压强,使得压强的梯度和速度的偏导数(2者都使用差分来离散化)满足关系外还有满足stokes公式所代表的液体不可压缩性,因此最后会搞出来一个很大的线性方程组,该方程组得大小取决于grid的数量,要求解这么大的方程组,需要很大的开销,因此这种方法只可能适合离线模拟,虽然真实性和精度都会比较高。
基于SPH的方法,个人认为这种方法比较聪明的一点再于,使用离散的Particle在场中的值来,插值出所有场中的该物理量的大小,因此该方法天生是解析型的,所以不用使用中心差分等离散化方法来计算偏导数,并且由于Particle质量和个数一定因此本身就具有质量守恒的特点,此外由于各点压强使用理想气体的状态方程来计算因此只和该点得密度温度有关,所余不需要求解上面的那种线性方程组,但是这样的损失就是不能保证不可压缩性了,不过在一般视觉模拟钟是观察不出来的,而且该方法非常易于实现,比较麻烦的是最后要使用一些方法 从粒子场中抽取出面的信息,比如marching cube等等。
很想做一下SPH的方法不过现在都变很懒了,基本就不想coding了,等过断时间调整一下希望能够还有力气能做一下