【CG物理模拟系列】开篇:介绍(上)

本科时候学过游戏制作,经常使用过unity,cocos2d,unreal等游戏引擎,也学过一些计算机图形学知识(模型处理方向)。那时候觉得游戏制作还蛮简单的,只要有精美贴图,好模型,加上一些剧情,以及写写简单的算法就可以很快做出一款好游戏。然而某天玩 家用机游戏 的时候,忽然发现,有些游戏场景中发丝的飘动,衣服的随风摆动等效果竟然做的和真的一样,就一直好奇其实现原理。后来读了Master,进了Physic-based Simulation研究室,才慢慢了解其实现技术。现在,我把这一年多学的东西,看的论文,实现的代码,总结成一系列教程,与大家分享交流。

作为入门第一讲,概念的东西比较多,今后会慢慢深入讲解算法及实现代码,首先先了解一下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物理模拟并不单指上述那样简单的例子,现实中,我们应用最多的是刚体模拟。这里所说的刚体是指在一定受力下不会变形的物体,如金属,木材,硬化塑料之类。
不会变形的好处就是,只用一个向量和一个旋转行列(或者四元数)就可以表示物体的移动。但如果场景中不止一个物体,就要考虑他们之间的碰撞了。碰撞处理也是刚体模拟的主要研究内容。

【CG物理模拟系列】开篇:介绍(上)_第1张图片

刚体模拟例: 牛顿摆的波传导模拟[1]

相反,像布,橡胶,水等易变形的物体受力变形时,发生形变的是物体内部所有的点。这时候,求解非线性微分方程的同时,还要考虑到与其他物体的碰撞,以及本身复杂的形状产生的影响等问题。为了解决这些问题,求得近似解,便产生了一些专门从事数值分析方向的研究。通过数值分析,如把物体表示成四面体或者粒子簇(cluster)组成的集合,就可以较容易的计算物体的变形了。我们称形变体中像橡胶,布这样变形后能恢复原状的物体称为弹性体。弹性体模拟是角色动化中经常使用的技术。如我们使用CG技术生成人或动物的动画时,为了模拟现实,就需要考虑肌肉的变形,动物的皮毛,人的头发以及衣服的随风摆动等物体的实时变形。这在游戏中也会有非常炫酷的表现。

【CG物理模拟系列】开篇:介绍(上)_第2张图片

 弹性体模拟一例: 压扁后又恢复原状的鸭子模型[2]

而水和空气这样,无法保持原来形状的,内部组成分子可以自由运动的物体我们称为流体。流体又分为水和油这样的液体,以及空气这样 的气体。这两种形态在处理的时候可以使用相同的控制方程表示,它们间的区别就是,液体有明确的边界(水有水面),而气体没有。上至江流湖泊,下至角色沾水,喝饮料,洒水等生活场景都会涉及到液体。气体的话,则表现为烟,火焰,蒸汽,以及风吹动旗子,衣服,叶子飘落,汽车扬起的灰尘等现象,这些在模拟现实场景的时候都要考虑在内。而这种操作也被我们称为流体模拟。

【CG物理模拟系列】开篇:介绍(上)_第3张图片     

流体模拟: 左. 水波模拟[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

你可能感兴趣的:(CG物理模拟系列)