软件学报
JOURNAL OF SOFTWARE
1999年 第6期 第10卷 Vol.10 No.6 1999



烟雾的快速模拟
童若锋　陈凌钧　汪国昭
　　摘要　文章提出利用粒子系统和浓度场相结合的方法来模拟烟雾的运动与扩散.在粒子属性中加入一浓度函数,通过粒子作用半径及浓度函数的变化模拟烟雾的扩散,还通过粒子的运动及分裂反映风力场的作用.与原有的粒子系统相比,不仅增加了对烟雾扩散的描述,还可以用少量的粒子生成连续的浓度场,在很大程度上提高了计算速度.同时文章还给出了一种快速的烟雾绘制方法.
　　关键词　动态模拟,粒子系统,浓度场,光线投射.
　　中图法分类号　TP391
　
A Method for Quick Smog Simulation
TONG Ruo-feng1,2 CHEN Ling-jun3 WANG Guo-zhao3
1 (Artificial Intelligence Institute Zhejiang University Hangzhou 310027)
2(State Key Laboratory of CAD & CG Zhejiang University Hangzhou 310027)
3(Department of Applied Mathematics Zhejiang University Hangzhou 310027)
　　Abstract　 In this paper, a method of combining particle system with density fields is presented to simulate smog movement and diffusion . By attaching a density function to the particle attributes, smog diffusion is simulated through the variance of particle effect radius and density functions, effect of turbulence is imitated through particle movement and fragmentation. Compared with the traditional particle system, this method can describe smog diffusion and produce continuous density fields with less particles, the computation is thus greatly speeded up. A quick algorithm for smog rendering is also presented for real-time simulation.
　　Key words　Dynamic simulation, particle system, density field, ray casting.
　　近年来,自然景观的模拟成为计算机图形学的热点之一,其中烟雾等气态流体的动态模拟由于其广泛的应用前景吸引了众多图形学研究者的关注.它还可以应用于影视广告,产生各种效果,节省大量的人力物力;还可以应用于飞行模拟,不但节省开支,而且为飞行员的安全带来一定的保障.然而,烟雾的气态特性使得对其进行真实的模拟具有较大的难度:
　　(1) 在显示方面,由于烟雾不存在明显的边界及法向,从而无法用传统的方法进行绘制,而光线在烟雾中的散射与衰减为真实感的显示带来了更大的难度.
　　(2) 在运动控制方面,气态物质的易流动及扩散特性也使在计算机动画中常用的运动控制方法无法得以实施.
　　在以往对烟雾的研究中,Nishita,Klassen等人在绘制时考虑了光线在云雾中的衰减、反射、散射等因素,获得了较大成功［1,2］;在烟雾的模型方面,Peitgen等人采用分形方法对云雾等进行模拟［3,4］,Sakas运用谱分析［5］,而Ebert等人则采用基于气流场的密度函数［6］.这些方法都有其各自的优越性,但也存在着不足.分形方法很难根据物理意义(如风力场等)对烟雾进行运动控制,基本上只适用于对云等远景的模拟.密度函数的方法在控制烟雾的运动时,将烟雾的密度定义为气流场的函数来反映气流场的变动,函数由人工给定,不能非常真实地反映气流的物理意义.另外，还有一种烟雾模型是粒子系统［7,8］,用大量形状简单的微小粒子作为基本元素来表示烟雾,通过对粒子运动的描述来控制烟雾的运动,这一方法能够较为真实地反映气流对烟雾的作用,但计算量大,要生成具有一定连续性的烟雾浓度需要庞大的粒子数目.1993年,Stam和Fiume给粒子定义了浓度函数,在较大程度上加快了计算速度,但在风力场对定义了浓度函数的粒子如何作用以及如何较好地用浓度场的变动反映烟雾的扩散方面未能深入研究［9］.
　　本文提出了一个粒子系统和浓度场相结合的烟雾模型,着重研究了粒子在风力作用下如何运动分裂以及如何真实地描述烟雾的扩散,并给出了一个快速绘制算法.本文第1节介绍了粒子系统与浓度场相结合的烟雾模型.第2节根据扩散方程给出了描述粒子浓度函数变化的方法.第3节描述粒子在风力场下分裂时如何保持浓度守衡.第4节给出了一个快速的烟雾绘制方法.
1　粒子系统与浓度场相结合的烟雾模型
　　烟雾的运动主要可分为烟雾自身的扩散和烟雾在气流下的运动(包括由比重引起的烟雾的上升)两个方面.因此,一个好的烟雾模型首先应能满足以下要求:(1) 能真实描述气流对烟雾的作用;(2) 能真实描述烟雾的扩散过程;(3) 能满足真实感绘制的需要.
　　 在满足上述几点的基础上,速度的快慢也是评价模型好坏的一个标准.如前所述,分形及浓度场模型在速度和真实感绘制方面效果较好,但较难真实模拟烟雾的运动,而粒子系统则正好相反.因此，本文提出了一个粒子系统和浓度场相结合的烟雾模型,先由粒子的运动及变化将烟雾的扩散及气流的作用表现出来,再由粒子的分布及其浓度属性得到当前的总浓度场分布,以满足真实感绘制的需要.为克服传统粒子系统中计算量大的缺陷,我们为每个粒子定义作用半径及浓度函数,从而用少量的粒子就可以得到较为连续的浓度分布.这样,在我们的系统中,粒子的主要属性有:粒子的位置P、粒子的速度V、粒子的加速度A、粒子的作用范围(由作用半径R表示)、粒子的浓度函数f(r,t)（具体实现时只存放浓度系数k）.
　　粒子的位置、速度和加速度用于反映气流的作用.将时间轴从t0开始,以间隔Δt作均匀分割,tj=t0+j.Δt,设已知粒子I在时刻tj的位置为,速度为,所处位置的加速度为Aj,根据位移、速度、加速度间的关系,在tj+1时，粒子I的速度及位置为
(1)
(2)

　　粒子的作用范围和浓度函数则用来控制烟雾的扩散及总体烟雾浓度的生成:
(3)

其中t为时刻,ρ(X,t)为空间中t时刻总的烟雾浓度,X为空间位置;n为系统中生命粒子的数目,ρi(X,t)=fi(r,t)为t时刻粒子I产生的浓度,r为空间点到粒子I的中心点的距离.
　　烟雾总体浓度场的变化主要有气流场的影响和烟雾本身的扩散两方面的原因.这虽然可由一个总体的微分方程表示出来,但由于这一方程计算量大,且在系统中有烟源时更为复杂.因此,我们将其分开考虑（这也正是我们采用粒子系统的一个原因）:气流场使粒子产生运动,并使作用范围较大的粒子分裂为几个作用范围较小的粒子;烟雾的扩散则通过粒子作用半径及浓度函数的变化来实现.
2　烟雾的扩散
当不考虑气流场的作用时,单个粒子中烟雾浓度的扩散是各向同性的,根据Nernst实验定律,可用如下热传导方程表示烟雾的扩散［10］:
(4)

其中a2为扩散系数,g(x,y,z,t)为烟源产生的浓度,φ（x,y,z）为t0时刻浓度的初始条件.在我们的方法中,烟雾的产生由粒子的生成来描述,式(4)仅用来模拟粒子生成后其浓度的变化,因此g(x,y,z,t)=0.此时,式(4)的解为
(5)

其中

　　下面我们来确定每个粒子生成时的初始浓度φ(x,y,z).一个粒子生成后其总浓度保持不变,不妨设其为1,而粒子的作用范围由于扩散而越来越大,因此有
(6)

其中φR(x,y,z)为
(7)

将(6)(7)两式代入式(5),有
(8)

其中r为空间点到粒子位置的距离.这样,由式(8)即可得到粒子出生后各时刻粒子的浓度,这是一个高斯函数,t-t0越小,分布越集中于r=0附近,随着t-t0的增大,分布越来越平坦.由于高斯函数在整个空间中的值都大于0,这样,在计算空间某一点X的浓度值时,每个粒子对其都有各自的贡献,而那些距X很远的粒子的贡献小得可以忽略.因此,为了减少计算量,我们给每个粒子规定各自的作用范围R,当空间点与粒子位置间的距离r小于R时,浓度为f(r,t);当r>R时,浓度为0.粒子作用范围R的设定方法为:首先给系统设定一浓度阈值ρ0,通过解方程f(R,t)=ρ0,获得粒子的作用范围R.显然,作用范围R将随着时间t的增大而增大,如图1所示.

　　　　　
图1 粒子作用半径的选取
　　由于扩散系数a及时间间隔Δt都已预先给定,因此,我们先计算出粒子在各个年龄时的作用半径,把浓度函数放入各年龄段的浓度表中(每一年龄对应于一条作用半径,各作用半径组成一个作用半径表,每一作用半径对应于一个浓度函数表,浓度函数表中存放作用半径内各采样距离处的浓度值),需要时，通过查表获得.
3　气流场的作用
　　在我们的系统中，由于粒子具有作用范围及浓度函数,因此，气流场不仅使粒子产生运动,还将对粒子的浓度函数产生影响,我们通过粒子的分裂来实现.
　　将系统中所有生命粒子进行分类:设定一阈值R0,粒子的作用半径小于R0的归入W1,大于R0的归入W2.对W1中的粒子,我们认为,气流场只使其产生运动,而没有其他影响;对W2中的粒子,气流场不仅使其产生运动,还将使其产生分裂.
　　具体方法为:先将三维空间进行网格划分,并得到气流场引起的在各网格单元处的加速度.将系统中所有粒子根据其位置放入网格单元,并根据其作用半径确定与周围哪几个网格单元有交.
　　对W1中的粒子I,其下一步的位置由式(1)、式(2)决定,其中加速度A由如下方法得到:
　　设粒子I与网格单元C1,C2,C3,...,Cn有交,粒子位置与各网格单元中心的距离分别为l1,l2,l3,...,ln,气流场在各网格单元形成的加速度为a1,a2,a3,...,an,则粒子的加速度为以距离的倒数为权值的各网格单元的加速度的加权平均:

　　对于W2中的粒子J,气流场将使其分裂为几个作用半径较小的粒子,分别使它们运动.同样地,我们先得到与粒子J相交的网格单元C1,C2,C3,...,Cn及其加速度a1,a2,a3,...,an,并计算出距离l1,l2,l3,...,ln,删去粒子J,同时生成粒子J1,J2,J3,...,Jn,粒子Ji具有与粒子J相同的速度,位置位于与其相对应的网格单元Ci的中心,加速度为Ci处的加速度,其作用半径Ri由如下方法获得:
　　先计算系数,然后从作用半径表中查出与ki最接近的一个作为粒子的作用半径Ri.此时,粒子的浓度函数不再是与其相对应的浓度表,而应再乘上系数kik,以保持粒子分裂前后总浓度的一致(其中k为分裂前的粒子J的浓度系数,我们将系数ki也作为粒子的属性保存下来,粒子出生时的初始浓度系数可设置为1.只有在粒子发生分裂时,其浓度系数才会改变).
　　在粒子的各属性设定之后,即可由式(1)、式(2)得到下一时刻的位置.
4　烟雾的绘制
　　在烟雾的总浓度场生成后,即可根据效果的要求采用不同的方法进行绘制,其中光线投射是较为常用的一种［5］.它可以模拟烟雾对光线的衰减、散射等效果,但这一方法计算量大、速度较慢.为此,我们简化烟雾的光照模型,采用投影法对烟雾进行绘制:
　　(1) 将屏幕作为投影平面,在屏幕各像素点处设置一浓度表并设初值为0.
　　(2) 将系统中的所有粒子按z值排序.
　　(3) 将系统中的粒子按z值从大到小的顺序投影到屏幕(不妨设离屏幕越近，其z值越大),计算出其投影浓度,累加到浓度表中.
　　投影浓度的计算方法为:近似认为烟雾粒子的作用范围在屏幕上的投影为一个圆,圆心为(xp,yp),xp=k(x1-x0)+x0,yp=k(y1-y0)+y0,其中,(x0,y0,z0)为视点坐标,(x1,y1,z1)为烟雾粒子的空间位置,z为屏幕的Z坐标;投影圆的半径为Rp=kR,R为烟雾粒子的作用范围.年龄为tj的粒子在投影圆内一点(x,y)处的投影浓度为
(9)

其中r为(x,y)到投影圆心(xp,yp)的距离.
　　对这一积分,我们仍然采用预先计算,然后查表的方法.由于采用投影法已无需计算空间中的总浓度场,因此，我们在作用范围为R的粒子的浓度表中不再存放其浓度函数,而是存放在r从0以一定的间隔变到R时的各浓度值.
　　得到粒子在(x,y)的投影浓度后,即可将系统中所有生命粒子在(x,y)处的投影浓度进行叠加,得到(x,y)处的总浓度.考虑到衰减,累加方法为
(10)

其中ρold为(x,y)处的原有浓度,ρnew为某粒子投影后(x,y)处的新浓度.
　　将tj时刻系统中的所有粒子都作投影后,即可由像素点(x,y)处的浓度得到其颜色(颜色为浓度的函数)来进行绘制.
5　结 论
　　在以往的烟雾模拟中往往忽略了烟雾本身的扩散.而用传统的粒子系统模拟烟雾时,要生成连续的浓度场需要大量的粒子.本文对粒子加入浓度函数这一属性,通过浓度函数的变化较真实地反映了烟雾的扩散,并大大减少了生成连续浓度函数所需的粒子数,从而降低了计算量.本文给出的烟雾绘制的投影法,目前虽然仅局限于单纯的烟雾场景,但由于其显示速度较快,在对烟雾各属性的调试中不失为一种行之有效的方法.我们在SGI(indigo2)工作站上实现了本文的算法,图2和图3为用投影法生成的画面,生成100幅图只需6s,基本达到了实时的要求.

　　　　　　　　　　　　　　
图2 t=30时刻的烟雾画面(投影法生成) 　　图3 t=50时刻的烟雾画面(投影法生成)
致谢　本文的研究工作得到国家自然科学基金资助，此项目编号为19571071.
*　本文研究得到国家自然科学基金、国家教育部博士点基金、浙江省自然科学基金和浙江大学曹光彪基金资助.
作者简介　童若锋,1969年生,博士,副教授,主要研究领域为计算机图形学,计算机辅助设计,图像处理.
　　　　　陈凌钧,1969年生,博士,副教授,主要研究领域为计算机图形学,科学计算可视化.
　　　　　汪国昭,1944年生,教授,博士生导师,主要研究领域为计算机辅助几何设计,计算机图形学,动态模拟,医学图像三维重建.
本文通讯联系人:童若锋，杭州 310027,浙江大学人工智能研究所
作者单位：童若锋（浙江大学人工智能研究所　杭州　310027）
　　　　　童若锋(浙江大学 CAD&CG 国家重点实验室　杭州　310027)
　　　　　陈凌钧　汪国昭(浙江大学应用数学系　杭州　310027)
参考文献
　1 Klassen R V. Modeling the effect of the atmosphere on light. ACM Transactions on Graphics, 1987,6(3):215～237
　2 Nishita T, Miyawaki Y, Nakamae E. A shading model for atmospheric scattering considering luminous intensity distribution of light sources. Computer Graphics, 1987,21(4):303～310
　3 Peitgen H O, Saupe D. The Science of Fractal Images. New York: Springer-Verlag, 1988
　4 齐东旭.分形及其计算生成.北京:科学出版社,1994
(Qi Dong-xu. Fractal and Its Generation. Beijing: Science Press, 1994)
　5 Sakas G. Modeling and animating turbulent gaseous phenomena using spectral synthesis. The Visual Computer, 1993,9(4):200～212
　6 Ebert D S, Parent R E. Rendering and animation of gaseous phenomena by combining fast volume and scanline a-buffer techniques. Computer Graphics, 1990,24(4):357～366
　7 ChiBa N, Muraoka K, Takahashi H et al.Two-dimensional visual simulation of flames, smoke and the spread of fire. The Journal of Visualization and Computer Animation, 1994,5(1):37～53
　8 Sims K. Particle animation and rendering using data parallel computation. Computer Graphics, 1990,24(4):405～413
　9 Stam J, Fiume E. Turbulent wind fields for gaseous phenomena. Computer Graphics, 1993,27(4):369～373
　10 董光昌,陈仲慈等.数学物理方程.杭州:浙江大学出版社,1989
(Dong Guang-chang, Chen Zhong-ci et al. Partial Differential Equations. Hangzhou: Zhejiang University Press, 1989)
本文1998-05-05收到原稿,1998-07-13收到修改稿
