转自原文地址:https://blog.csdn.net/Knight_Lyh/article/details/50907050
作为入门第一讲,概念的东西比较多,今后会慢慢深入讲解算法及实现代码,首先先了解一下CG物体模拟的定义。
定义
CG物理模拟(Physic Simulation),是指运用物理学,数学,数值操作等知识,在计算机中再生出各种自然现象的技术。
我们所知的3D CG制作大体可以分为: 1)模型制作 2)给模型设定动作 3)添加效果 4)贴图,渲染等几个阶段。
首先,为了有CG动画,我们需要制作3D几何形状,也就是建模。即通过2D设备(如鼠标,数位板)来制作模型。近年来,也有从2D图片直接生成3D模型的技术(自动或者半自动生成多边形面)。同时也有学者在研究使用3D显示器,或3D输入设备来简化模型制作。
渲染是把3D转为2D图形,并从形状,材质,周围的环境来决定各像素的颜色的操作。例如,光源的位置,模型表面的光的反射特性,周围存在物体的阴影和反射色的影响,以及表面存在的灰尘或者微小的凹凸等等。高速化和品质化,是渲染主要的研究课题。
模型动画则是让1)制作的模型运动起来的处理,这就要考虑到模型本身的变形及模型间的碰撞问题了。同时,我们也要考虑到周围环境的影响,如江流湖泊场景中水的流动,火焰的燃烧,烟的飘动等复杂效果。这便是2),3)步要做的工作。很多CG制作工具(如游戏引擎)正是能把上述技术集成起来,以缩减CG制作上的时间。
基本流程
首先,需要使用未知的物理量(位置形状等)和已知的物理量(力,质量),及链接二者的中间量(速度和加速度),来建立物体的运动方程模型。这里,我们多使用微分,积分来表示这些方程,并称之为控制方程。之后解方程即可。
例如,随时间变化物体的速度为v(t),求行走距离x的控制方程为,代表每个瞬间的速度。如果,速度是根据时间t成比例变化,比例系数为,就会得出,两边积分,则得出 ,我们称之为解析解。然而CG物理模拟中多使用的是非线性微分方程,这时候就需用近似解来求,可以表示为 ,此时 ,因此只需知道初始位置x(0),就可以一步步计算出某时刻位置。
值得一提的是,现实世界是一个,在连续时间的t内,由时间增幅 的离散值所组成的集合,所以用计算机模拟现实事物时,也需要转换成离散量计算。另外,变形的时候使用上例所说的离散方式,求非线性微分方程的近似解的这种方法,我们称为数值计算,这也是物理模拟的核心(core)技术。
总结来说,CG模拟物理现象的流程是:
1.找到能描述这一现象的控制方程
2.使用离散量,来离散化位置,时间这样的连续量。
3.通过数值计算方法,求近似解。
CG物理模拟的种类
然而,CG物理模拟并不单指上述那样简单的例子,现实中,我们应用最多的是刚体模拟。这里所说的刚体是指在一定受力下不会变形的物体,如金属,木材,硬化塑料之类。
不会变形的好处就是,只用一个向量和一个旋转行列(或者四元数)就可以表示物体的移动。但如果场景中不止一个物体,就要考虑他们之间的碰撞了。碰撞处理也是刚体模拟的主要研究内容。
刚体模拟例: 牛顿摆的波传导模拟[1]
相反,像布,橡胶,水等易变形的物体受力变形时,发生形变的是物体内部所有的点。这时候,求解非线性微分方程的同时,还要考虑到与其他物体的碰撞,以及本身复杂的形状产生的影响等问题。为了解决这些问题,求得近似解,便产生了一些专门从事数值分析方向的研究。通过数值分析,如把物体表示成四面体或者粒子簇(cluster)组成的集合,就可以较容易的计算物体的变形了。我们称形变体中像橡胶,布这样变形后能恢复原状的物体称为弹性体。弹性体模拟是角色动化中经常使用的技术。如我们使用CG技术生成人或动物的动画时,为了模拟现实,就需要考虑肌肉的变形,动物的皮毛,人的头发以及衣服的随风摆动等物体的实时变形。这在游戏中也会有非常炫酷的表现。
弹性体模拟一例: 压扁后又恢复原状的鸭子模型[2]
而水和空气这样,无法保持原来形状的,内部组成分子可以自由运动的物体我们称为流体。流体又分为水和油这样的液体,以及空气这样 的气体。这两种形态在处理的时候可以使用相同的控制方程表示,它们间的区别就是,液体有明确的边界(水有水面),而气体没有。上至江流湖泊,下至角色沾水,喝饮料,洒水等生活场景都会涉及到液体。气体的话,则表现为烟,火焰,蒸汽,以及风吹动旗子,衣服,叶子飘落,汽车扬起的灰尘等现象,这些在模拟现实场景的时候都要考虑在内。而这种操作也被我们称为流体模拟。
流体模拟: 左. 水波模拟[3] 右. 烟模拟[4]
物理模拟种类总结
刚体模拟
碰撞检测(collision detection)
摩擦(friction)
粒状物体(granular material)
变形体模拟
粘弹性体(viscoelastic body)
布(cloth)
头发,皮毛(hair, fur)
弹性棒(elastic rod)
破坏(fracture)
可展面(developable surface)
肌肉(muscle)
流体模拟
非压缩性流体
气体(烟,云等) (gas)
液体(水等) (liquid)
粘性流体(viscoelastic fluid)
压缩性流体
爆炸(explosion)
冲击波(shock wave)
乱流(turbulent flow)
气泡(bubble)
泡(foam)
波(wave)
热(流体)模拟
火(fire)
冰融化(ice melting)
沸腾(boiling)
植物模拟
腐蚀,风化模拟
其他
磁石,磁性流体
今后,我将分别为大家讲解这几种模拟的具体表现,及其算法和代码实现。由于比较熟悉弹性体和流体模拟,所以会侧重讲解这方面知识。
Reference
[1].Müller M., Heidelberger B., Teschner M., Gross M. "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
---------------------