例如,随时间变化物体的速度为v(t),求行走距离x的控制方程为,代表每个瞬间的速度。如果,速度是根据时间t成比例变化,比例系数为,就会得出,两边积分,则得出 ,我们称之为解析解。然而CG物理模拟中多使用的是非线性微分方程,这时候就需用近似解来求,可以表示为 ,此时 ,因此只需知道初始位置x(0),就可以一步步计算出某时刻位置。
值得一提的是,现实世界是一个,在连续时间的t内,由时间增幅 的离散值所组成的集合,所以用计算机模拟现实事物时,也需要转换成离散量计算。另外,变形的时候使用上例所说的离散方式,求非线性微分方程的近似解的这种方法,我们称为数值计算,这也是物理模拟的核心(core)技术。
总结来说,CG模拟物理现象的流程是:
1.找到能描述这一现象的控制方程刚体模拟例: 牛顿摆的波传导模拟[1]
相反,像布,橡胶,水等易变形的物体受力变形时,发生形变的是物体内部所有的点。这时候,求解非线性微分方程的同时,还要考虑到与其他物体的碰撞,以及本身复杂的形状产生的影响等问题。为了解决这些问题,求得近似解,便产生了一些专门从事数值分析方向的研究。通过数值分析,如把物体表示成四面体或者粒子簇(cluster)组成的集合,就可以较容易的计算物体的变形了。我们称形变体中像橡胶,布这样变形后能恢复原状的物体称为弹性体。弹性体模拟是角色动化中经常使用的技术。如我们使用CG技术生成人或动物的动画时,为了模拟现实,就需要考虑肌肉的变形,动物的皮毛,人的头发以及衣服的随风摆动等物体的实时变形。这在游戏中也会有非常炫酷的表现。
弹性体模拟一例: 压扁后又恢复原状的鸭子模型[2]
而水和空气这样,无法保持原来形状的,内部组成分子可以自由运动的物体我们称为流体。流体又分为水和油这样的液体,以及空气这样 的气体。这两种形态在处理的时候可以使用相同的控制方程表示,它们间的区别就是,液体有明确的边界(水有水面),而气体没有。上至江流湖泊,下至角色沾水,喝饮料,洒水等生活场景都会涉及到液体。气体的话,则表现为烟,火焰,蒸汽,以及风吹动旗子,衣服,叶子飘落,汽车扬起的灰尘等现象,这些在模拟现实场景的时候都要考虑在内。而这种操作也被我们称为流体模拟。
流体模拟: 左. 水波模拟[3] 右. 烟模拟[4]
今后,我将分别为大家讲解这几种模拟的具体表现,及其算法和代码实现。由于比较熟悉弹性体和流体模拟,所以会侧重讲解这方面知识。
Reference
, , , Meshless deformations based on shape matching". In SIGGRAPH ’05: ACM SIGGRAPH 2005
[2]. Tianxiang Zhang, Sheng Li, Guoping Wang, Dinesh Manocha, Hanqiu Sun. "Quadratic Contact Energy Model for Multi-impact Simulation". Pacific Graphics 2015, 2015
[3]. S. Jeschke and C. "Water Wave Animation via Wavefront Parameter Interpolation". Wojtan ACM Transactions on Graphics (presented at SIGGRAPH 2015)
[4]. Xinxin Zhang, Robert Bridson, Chen Greif. "Restoring the missing vorticity in advection-projection fluid solvers". ACM Transactions on Graphics (TOG) - Proceedings of ACM SIGGRAPH 2015 TOG Homepage archive