简介
一个模拟变形物体最简单额方法就是将其表示为弹簧质点系统(Mass Spring Systems),因为方法简单,这个框架对于学习物理模拟和时间积分的各种技术都比较理想。一个弹簧质点包含了一系列由多个弹簧连接起来的质点,这样的系统的物理属性非常直接,模拟程序也很容易编写。
但是简单是有代价了:
1.物体的行为依赖于弹簧系统的设置方法;
2.很难通过调整弹簧系数来得到想要的结果;
3.弹簧质点网格不能直接获取体效果。
在很多的应用中这些缺点可以忽略,在这种场合下,弹簧质点网格是最好的选择,因为够快够简单。
今天首先说明一下Mass Spring Systems的理论基础,然后来实现绳子的real-time模拟。
物理模型
假设有N个质点,质量为mi,位置为xi,速度为vi , 1<i<N.
这些质点由一组弹簧S连接,弹簧参数为(i, j, lo, ks, kd). i,j 为连接的弹簧质点,lo为弹簧完全放松时的长度,ks为弹簧弹性系数,kd为阻尼系数,由胡科定律知弹簧施加在两顶点上的力可以表示为:
由受力守恒知 fi+fj = 0. fi和fj的大小和弹簧伸长成正比关系。
对于阻尼的计算,
大小和速度成正比,并且符合力守恒,则对于一个质点,其受力方程为:
模拟
在模拟算法中,牛顿第二定律是关键,f = ma。在已知质量和外力的情况下,通过 a=f/m 可以得到加速度,将二阶常微分方程写成两个一阶方程:
可以得到解析解:
初始状态为 v(to) = vo, x(to)=xo.
积分将时间t内所有的变化加和,模拟的过程就是从 to 开始不断地计算 x(t) 和 v(t),然后更新质点的位置。
最简单的数值解法就是利用有限的差分近似微分:
其中delta t 是为时间步长,t为帧号,带入之前的公式得:
这个就是显式的欧拉解法,下一时刻的状态完全由当前状态决定。
整个过程的伪代码如下:
// initialization forall particles i initialize xi , vi and mi endfor // simulation loop loop forall particles i fi ← fg + fcoll + ∑ f(xi , vi , x j , v j ) endfor forall particles i vi ← vi +