《武汉工程大学学报》  2018年01期 87-92   出版日期:2018-02-25   ISSN:1674-2869   CN:42-1779/TQ
基于粒子系统的3D动态火焰模拟


虚拟现实技术[1]是利用计算机的图形功能模拟世界上的各种真实物体、自然场景及光照产生的各种特效,甚至可以将想象中的世界真实地模拟出来,给人们的视觉带来不一样的冲击效果。近年来随着计算机图形学技术的发展,对自然景物的模拟逐渐成为一个研究热点,如对火焰、喷泉、云雾、闪电、雪花、浪花等自然景物[2]的模拟。这些模拟在军事科技、影视设计、航空航天等领域中发挥了重要作用。 由于自然景物拥有丰富的纹理和不规则的几何外形,以及自然因素对它的影响,如风力、气流等,因此其运动轨迹是不能确定的。传统数学工具无法对该类物体外在表现形式进行正确地描述,所以自然景物的模拟相对困难。因此,如何利用虚拟现实技术使这些景物在计算机屏幕上呈现更加真实的效果,成为许多研究者不断努力奋斗的课题。无规则模糊物体模拟技术,在学者们多年的探索和研究下,取得了一定程度的成就,而在多种模拟方法中,粒子系统又具有明显的优势。粒子系统的起源,可追溯到1983年,Reeves[3]提出的粒子系统的概念。系统中每个粒子都有属于自身的一组属性,例如粒子的位置、形状、加速度、颜色、生命周期、衰减速度等。这些属性随着时间不断地进行更新,从而使整体的外观变化以及运动状态,相对于传统的模拟方法更具有真实感。该系统尤其突出的一个优点,就是利用简单的图元去模拟一些很复杂的物体,同时又不失模拟物体的真实性和实时性。这是单纯的使用传统方法和数学工具所无法比拟的,因此,粒子系统逐渐成为国内外众多学者的研究重点。本文将结合粒子系统和OpenGL[4-6],同时引入风场,对火焰模拟进行改进和创新。1 火焰系统中生存运动场的构建基于传统的粒子系统的火焰模拟图形已经不能满足如今社会计算机图形领域的需求,且其真实性和实时性都不能在日常应用中充分体现,因此需要进一步的改进。本文主要探讨如何增强火焰的真实性和实时性,改进方法如下:1)在传统的粒子系统火焰模拟中引入重力和空气浮力,实现火焰的动态效果,体现火焰实时性特性;2)在传统的粒子系统火焰模拟中增加三维场景,展现火焰的真实性。改进的火焰模拟流程如图1所示。1.1 重力的引入重力在动态火焰模拟中起到了重要的作用。采用Gyarmathy模型[7],通过人工引入的重力场模拟重力的作用。该模型的优点在于:插值操作可在自由粒子间和连续介质两种极端情况下进行,其表达式为:[M=MctMfmMct+Mfm,E=EctEfmEct+Efm] (1) 其中, [Mct=4πr0ρmDm(yvs-yv∞)], [Ect=12Mctcpv(T0+T∞)+4πr0km(T0-T∞)],[Mfm=4πr0αevρvsRvT02πRvT0-αv∞ρv∞RvT∞2πRvT∞],[Efm=4πr20ρv∞RvT∞(cpv-Rv2)2πRvT∞-ρg∞RgT∞(cpg-Rv2)2πRgT∞×][(T0-T1)+Mfm(cpv-Rv2)T0]。从式(1)中可以看出,温度对粒子的受力有很大的影响,这里采取介于[T0]和[T∞]之间的温度: [Tm=13(2T0+T∞)] (2)粒子在发射和碰撞过程中会产生瞬间的内部热量,方程表示如下:[ρ1c1 T t=k1r2 rr2 T r+P] (3) 其中,[P=ρ(r,t)]为颗粒的辐射传热,[ρ]表示颗粒密度,[c]表示热容,[k]表示热导。1.2 风场的引入1.2.1 全域风场 全域风场的风源可设为无限大,其模型可随时间的变化而随机变化,风源与火焰之间的距离对风速变化没有影响。全域风场模型中任何时刻的风速都可表示为平均风速和一个随机数之和,该随机数是由Perlin噪音函数产生的随机数,其表达式为: [tG(t)=v(t)+vp(t)] (4)其中[v(t)]是平均风速,定义如下: [v(t)=v0(t)sin(wt+β)] (5)[vp(t)]是一个采用Perlin噪音函数产生的随机数,其表达式为:[vp(t)=αPerlinNoise(t)] (6)[αPerlinNoise(t)]是一个以时间t为变量的Perlin噪音函数。通过改变[v0(t),w,β,α]这些常量就可以产生不同的风速。1.2.2 火焰模拟中的Perlin噪音 Perlin噪音[8]是一个随机数生成器,在火焰模拟中,Perlin函数用一个整数作为参数,并返回一个基于参数的随机数。同样的参数传递两次,对于普通的随机函数来说,两次传递相同的参数可能会产生不同的结果,而Perlin函数不同,它会产生相同的随机数。如图2所示,在X轴上,对每一个值赋予[0,1]的随机噪声值。通过每个离散的噪声值进行平滑插值操作后,可得到一个平滑的连续函数。将火焰模拟中不同频率和振幅的平滑函数叠加在一起,按式(7)可构造出若干新的噪声函数[Noisei(x)]:[Ffrequency=2iAamplitude=Pipersistence] (7)构造模拟火焰的Perlin噪声函数方法如下:1)构造一个1个单位长度的噪声生成器,[(float)rand()/RAND_MAX];2)对任一点[(x,z)],假设其落在4个相邻噪声控制点[(x0,z0)、(x0,z1)、(x1,z0)]和[(x1,z1)]所围城的区域内。计算每个控制点到点[(x,z)]的向量与该控制点梯度的点积,得到它们对点[(x,z)]处噪声的影响值。1.2.3 计算风力 风场模型[9]确定后,为了模拟出火焰摇曳的效果,必须计算出作用在火焰上的风力,作用在火焰上的风力由拖曳力和升浮力组成,其表达式为:[Fd(α)=12ρairvα2SCD(α)Fl(α)=12ρairvα2SCL(α)] (8) 其中,[CL(α),CD(α)]分别是攻角为[α]时的升浮力和拖曳力系数,[ρa]为空气密度,其值为[2.37×10-3g/m3,v]是建立的风场模型得到的风速,[S]表示迎风面积。它们在垂直方向上的作用力为: [Fy=Fd(α)sinα+Fl(α)cosα] (9)2 火焰及其场景建模2.1 火焰建模 粒子系统控制机将火焰粒子从发射孔不断发射出来进行动态模拟,每个火焰粒子在生成时都有自己的初始化属性。随着时间的推移,火焰粒子必然经过“生成”、“运动”和“消亡”三个阶段[10]。火焰粒子系统的实现过程如下:1)产生一定数量的新结构化粒子加入系统;2)赋予每一个新的结构化粒子一定的初始属性;3)对整个系统进行更新,删除随着衰减速率生命周期为0的粒子;4)根据粒子的运动规律对结构化粒子进行变换及改变属性;5)绘制并显示由已有生命的结构化粒子组成的图形。其流程如图3所示。2.2 纹理映射 在大规模的三维场景仿真中,目前的技术不能直接模拟每一个火焰粒子的运动过程,所以纹理映射技术[11]被引入到三维场景中,给三维场景添加真实感。在现实生活中,这些大大小小均比较接近于真实事物的贴图都是基于物体纹理识别得到的。纹理贴图技术直接关系到三维场景的真实效果,是体现真实感场景的重要步骤。纹理贴图包括一维纹理、二维纹理、三维纹理三种体现形式,它们的纹理是根据其变量的定义不同而划分。其中二维纹理贴图是最常用的方法,之后将二维纹理映射到三维场景的表面,这样就获得了具有纹理贴图的三维场景,增加了其真实感。假设二维纹理函数定义在[(s,r)]平面上,一般认为二维纹理函数的定义域是单位方正的,表现形式如下:[g(s,r)=0,s 8,r 81,s 8,r 8][(0s1,0r1)] (10)采用球面纹理映射[12],具体参数方程如下:[x=cos2πscos2πry=sin2πssin2πrz=sin2πr][(0s1,0r1)] (11)对于球面上的任意一点[(x,y,z)],求解参数[(s,r)],表达式如下:[(s,r)=(0,0)[(1-1-(x2+y2)x2+y2)x,(1-1-(x2+y2)x2+y2)y]if(x,y)=(0,0)other] (12)在OpenGL中纹理映射的流程如图4所示。3 结果与讨论3.1 实现效果通过前几节的描述,粒子系统基本上达到了预期的效果,可以较为逼真地模拟火焰效果,并添加一些简单的三维模拟场景。在该场景中,可实现漫游效果。此外,还增加了按键功能,使火焰呈现出不同的变化,如增加风向,调整重力加速度的数值;插入不同的位图转换成不同的纹理,改变颜色分量(R,G,B)的数值,使得火焰呈现不同的形态。最终生成的火焰如图5所示。图5中的火焰场景,纹理贴图使火焰拥有立体效果,在X轴上添加的重力加速度使火焰体现出摇曳的效果。3.2 火焰实现结果分析3.2.1 重力对火焰的影响 通过式(1)和[mfm=4πr0αevρvsRvθ02πRvθ0-αconρv∞Rvθ∞2πRvθ∞]可知随着温度[θ0]的上升,粒子的质量m会减少,粒子的能量E会损耗。而由于公式[ρlcl θ t=klr2 rr2 θ r+P]的作用,粒子在发生碰撞时间距会变大,因此火焰粒子的扩散量将会增大,扩散量的增大会影响视线范围内的粒子数目,如图6所示。同时,为了使所观察到的图像具有3D立体效果,利用glEnable()和glDisable()绘制场景图,并启用三维纹理GL_TEXTURE_3D作为参数设置3D背景图,对普通的模拟火焰进行纹理渲染,如图7所示。对温度为0 ℃(即无温度参数的引入)和330 ℃两个不同温度值时的火焰形态进行分析,同时引入纹理渲染增加可观度,如图8所示。3.2.2 风力对火焰的影响 当火焰粒子所示风力产生了[α=2]的振动频率时,可以将[Fy]在[α=2]处对[α]进行一阶泰勒展开式[13] : [Fy(α)=Fy(0)+ Fy αα=2?α+Δ(α2)] (13)其中,[Fy(0)]是不随时间变化的,在动态相应分析中可以忽略不计,[Δ(α2)]表示高阶项,也可以忽略,则:[Fy(α)≈ Fy αα=2?α=12ρairve2S?dCFydαα=2?yve] (14)由式(9)可得: [dCFydαα=2=dCLdα+CDα=2] (15)将式子(15)带入式子(14)中,可得到最终空气动力表达式[14]: [Fy=12ρairve2S(dCLdα+CD)α=2?yve] (16)[Fy]在[α=2]处的风速和风力变化如图9所示。由图9(a)和图9(b)可得结论:Perlin噪声函数利用噪声生成器[(float)rand()/RAND_MAX]引入的参数增加了实验随机性和自然模拟性,因此,由[vp(t)=αPerlinNoise(t)]知随着时间t的增加,风速不断增大,而从式(8)中可得出拖曳力[Fd]和升浮力[Fl]也不断增大。图9(b)反映了升浮力增加的速率远高于拖曳力增加的速率。因此,渲染时间t不能过长,否则将会使火焰动态效果失真。由此可知,火焰在模拟过程中,总是呈上升状态,焰身在拖曳力[Fd]和升浮力[Fl]的共同作用下向某一方向偏移,这一现象真实模拟出风对火焰的影响。图10为无风力作用和时间t=4 s时的风力作用的对比图,风场的引入使火焰在场景中产生一定的偏移,风速、拖曳力以及升浮力随渲染时间的推移而改变。因此,入眼的火焰摆动频率和方向都将有所不同,如图10所示。4  结 语以上主要对传统的粒子系统绘制火焰进行了改进,并解决了粒子系统实时性和逼真性的问题。同时,在了解模拟景物的自然特性及其相关自然因素后,利用简单的几何图元对整个系统进行了数学建模,对每个粒子进行了纹理贴图及渲染处理。在解决系统实时性等问题方面,选择了四角面片[15]绘制粒子的方法与动态生成视点替用特效技术,这样不仅可降低系统计算量,还可提高实时性。通过引入风力和重力场模型,进一步增强动态火焰的逼真性。重力场可动态展现火焰粒子消亡的规律;风力场则可模拟出火焰粒子的运动情况。这不仅使火焰粒子的运动更加灵活,也更体现火焰的真实效果。