谢永华,李 平,寇小勇
(南京信息工程大学 计算机与软件学院,南京 210044)
云的实时模拟是计算机图形学领域的研究热点和难题.近年来,随着计算机技术的飞速发展,云的建模理论及其真实感图形生成方法的研究已成为可视化技术研究的重要方向之一,在虚拟战场、图形可视化、飞行模拟和计算机游戏中有着极其重要的应用前景[1].由于云本身具有不规则的模糊边界,整体具有不光滑性,以及运动的多变性,所有这些特征使得它们很难被计算机模拟,因此人们也不能够用准确的模型去描述它.
在计算机上进行云模拟时,真实云的自身特性和变化规律是最主要的模拟结果.云模拟过程主要包括建模和渲染两个方面.在建模方面,为了得到逼真的效果,研究学者们提出很多种建模方法,并取得了丰富的研究成果,主要分为两类:一种是启发式建模,如文献[2]采用隐函数定义云的密度场,以及添加过程噪声来使结果更具有真实感;文献[3]提出了一种新的云建模方法—分形粒子法,在分形粒子法中,采用了基于结构自相似性的简化算法,同时添加阴影效果以增强三维云模型;文献[4]则是通过在网格上以低分辨率来求解动态云的方程组获得其速度场,再通过速度场漂移噪声纹理的方法来增加云的表面细节.这些方法利用程序化纹理或纹理化几何表面作为云建模基元,并未能直接研究云形成背后的物理模型.另一种是物理式的建模.如Seok Yoon Kang和Ki-Il Kim等人[5]提出的L-system方法来构建多样三维云,L-system通过系统递归的方式提供了较低的复杂度和可扩展性,在绘制和渲染中起到更好的平衡作用.Duarte,Rui P.M.提出了一种基于SkewT/LogP图的实时云仿真方法来克服云形状与动态性能问题[6].唐勇等人[7]提出,在三维网格中赋予云等相关物理属性,利用N-S方程描述云的运动,加入粘性项和漩涡性,能够更真实表现云的湍流效果.这些方法在算法或者模拟空间上与真实云场景的形成过程存在一定的差异.
在渲染方面,研究者们探讨了光线传播过程,提出较多简化的云渲染模型.Haoran Guo等人[8]通过以人眼为视点,引入了两步骤散射模型来模拟大气中云实际的光强;Kaijiya等人[9]利用多重正向散射计算每个粒子的入射颜色,并且利用一阶散射确定观察者的入射颜色;Dobashi和Nishita等人[10]提出了由闪电照射的云和大气粒子引起的散射效应来创建云场景,可以有效增强结果的真实感;Ksenia Mukhina和Alexey Bezgodov[11]采用Perez方法以及一天中的时间来计算整个天空的颜色,可获得平滑过渡自然的天空.这些方法在绘制方面需要进一步加速仿真速度,以及控制云粒子量来提高计算量.
针对以上问题,本文对于云形成、运动到消失的渐变过程这一动态特性效果不显著的情况下,根据粒子位置、云团中不透明度值变换,添加云消散函数来逼真模拟云消失效果.为了在渲染上降低计算量,提出利用LOD抽稀采样操作,降低内存的消耗、提高绘制速度.实验结果体现了本文方法的可行性.
粒子系统思想是把物体作为大量不规则粒子,且随机分布.每个粒子都有自己的属性,有外型、空间坐标、运动速度等,通过随机函数来展示物体的运动情况.对于云团中心密度浓厚,边界稀疏的特点,建立云团模型,假设云团中心坐标为(ai,bi,ci),云团半径为R,云团粒子位置分布如式(1)所示:
Cloudi.X=a+Random(i)*R*sin(φ)*cos(φ)
Cloudi.Y=b+Random(i)*R*cos(φ)
Cloudi.Z=c+Random(i)*R*sin(φ)*sin(φ)
(1)
其中:φ为云团中心到云位置粒子矢量与云团所在局部坐标系中y轴的夹角,φ为与x轴的夹角,Random(i)为随机分布函数,由此来模拟不同形状的云团.
单个粒子经历产生,发展,消亡三个阶段,但是粒子在消亡过程的同时又有新的粒子产生,不断进行粒子更迭的操作,建模过程是云团生成过程,并没有云团生成之后逐渐消失的过程[12].为此,本文在消亡过程中添加消散函数,让云团消失过程贴近自然.
Nnum=Nframe+rand()*Nmax
(2)
(3)
通常情况下,粒子的生成是由随机函数实现的,这些由随机函数实现的每一帧粒子数,如式(2)所示,Nnum是每帧中生成的粒子数,Nframe是上一帧中生成的粒子数,Nmax为粒子变化的最大值,最大值可以让云团量进行快速增长趋势,随机数rand()范围为(0,1).那么对于粒子的产生是否为云粒子,我们做了如下判断:将随机产生的粒子与云团中心坐标进行距离比较,随机生成的粒子Ps的坐标设为(x,y,z),将Ps的坐标带入球的方程中,只要小于等于半径则包含在球内,即为云粒子;否则,将随机生成的粒子ps删除,如式(3)所示.
通过云的物理组成原理可知,云团由无数的水滴和冰晶组成.在粒子系统中,每个水滴和冰晶都可以被看做是粒子,所以在产生云粒子的同时,需要对这些粒子的相关属性进行相应的初始化,最后根据WRF数据来填充三维云.
本文在模拟真实感三维云消散过程,若数目较少则不能实现真实感,反之则会使系统的处理时间增多,不能满足实时性.因此要保证足够的云团量,也就是粒子系统总数目.云团数量表示如下:
当时间t=0到t=tv时,此时每帧的云团量表示是式(2),那么云团达到饱和状态时的云团量为Ns,如式(4)所示:
Ns=Nframe+Nmax
(4)
对于云团成形后,它的云团量就是一个缓慢增长的趋势,所以每帧粒子变化值由Nmax变为Nmin.当时间t=tv+i到t=te,云团量如式(5)所示:
Nsnum=Nframe+rand()*Nmin
(5)
其中:Nsnum是达到云团饱和状态下之后进行的缓慢变换过程,Nmin为每帧粒子变化的最小值,tv是云团达到饱和状态的时间,te则是云团子生成到消散的总时间.
为了提高云团绘制速率,粒子体积的选择则会显得尤为重要.当观察点距离云团中心较远时,视点对云团反应不够灵敏,此时需要体积较大的粒子,相反,则需要体积较小的粒子.
如图1所示,横轴为云团自生成之后的时间变化,纵轴为云团量变化多少.在时间为0到tv之间,是云团生成过程;在时间tv和tv+i之间,是云团量达到饱和状态情况下的微小变化;在时间tv和tv+i之间,则是表现云团消散的过程.
图1 云团量变化趋势Fig.1 Trend of cloud number change
云团密度分布大都是中间浓厚且不透明度值大,边缘稀薄且不透明度值小.所以云团消散过程是从不透明度值小的地方开始,逐渐转向不透明度值大的地方.由于在云团消散的同时,依旧存在新旧粒子更替变化,所以云团的消散函数如式(6)所示:
Nsnum=Nfext+rand(a)*Nmin-rand(b)*Next
(6)
其中:Nfext是上一帧消散后的粒子数,rand(a)和rand(b)是同一帧产生的两个不同的随机数,范围为(0,1),Next是每一帧消失的最大粒子量.图2依据每一帧的变化,演变云团缓慢的具体变换过程.
图2 云粒子消散过程Fig.2 Cloud particle dissipation process
传统的光线投射算法能够实现优质的图形界面,但是存储数据的方式不是以物理的顺序进行,当存储的数据量很大时会导致内存开销大,因此需要对生成的云粒子进行采样优化,对粒子采样点选取不当会带来云图的网格状现象.
常用的采样方式有传统采样方式和重要性采样方式.传统的均匀采样依赖于更多数据,会导致计算量变大,不能达到大规模实时云渲染;通过引入重要性采样可减少仿真数据,在较短时间内能够达到理想的仿真效果,但在选取采样点时没有体现细节层次感.
图3 三种采样点选取方式Fig.3 Three sampling point selection methods
为此,本文利用等间距抽稀的方法来进行采样点优化,并对采样好的点存储到八叉树中,如图3所示.如图3(c),在没有被大圆圈圈住的一些点中,我们选取带小圆圈的点,也就是每隔奇数个点进行选取,即抽稀间距为奇数;在大圆圈里面,我们依旧选取带有小圆圈的点,每隔偶数个点进行采样,即抽稀间距为偶数.本方法中抽稀间距值大小的设定由云团数量来决定.
本文对采样点选取的方式是,在贡献量多的地方表示需要多采样一些点,而贡献量小的地方则相反.使用本文采样点方式,既可以使重要区域达到很好的渲染,也能将边缘区域或是稀少区域看起来更平滑.
光线投射基本思路为:顺着观察点到采样点的方向对图像进行采样,对于出现在光线中的每个云粒子,将它们的颜色值与不透明度值依次进行累加,直至光线穿越整个图像,那么呈现在屏幕上的颜色值就是光线渲染的颜色,如式(7)所示:
(7)
获得采样点之后,本文采用由前向后的图像合成对采样点的像素值进行累加.其中:Cnow表示当前体元的颜色值,αnow表示当前体元的不透明度值,进入当前体元时的颜色值为Cin,不透明度值为αin,穿过体元后的颜色值为Cout,不透明度值为αout.
在渲染三维云时,本文用到了八叉树与LOD方法结合的方式,实现高效绘制云图的效果,具体流程为:
1)把连接观察点和屏幕像素的矢量作为光线投射至云团中的方向;
2)由初始位置和结束位置来计算云团的深度;
3)利用八叉树数据结构对包围盒进行分层,并开始采样点的获取;
4)对于贡献多的区域,本文以等间距抽稀为奇数的标准,进行采样;
5)对于贡献少的区域,本文以等间距抽稀为偶数的标准,进行采样;
6)将获取到的采样点先存储到八叉树结构中;
7)对采样点的像素值和不透明度值进行循环并累加,在累加过程中,若不透明度值大于1,则转至步骤6,否则转至步骤5;
8)对采样点进行判断,不是边界采样点,则转入步骤3;否则结束本次光线的采样,转入步骤6;
9)将当前累计得到的颜色值给屏幕像素,并转入步骤1,进行下一次光线的采样.
本文采用的实验硬件平台为CPU Pentium 2.4GHz,内存512MB,操作系统是windows x7.编程语言为Visual C++和OpenGL.
图4展示了云团生成与消散的过程.图4(a)是基于粒子系统的云团生成情况,图4(b)是本文的在其基础上添加消失函数,也就是云团生成之后,会有一个自然渐变消失的过程.
图4 云团生成与消散Fig.4 Cloud formation and dissipation
由图4(a)和图4(b)可以看出来本文改进的方法能够更好的展示三维云动态过程,能同时动态模拟三维云的生成过程和消散过程.
在三维云的渲染方面,本文通过改进采样点选取方法,采用抽稀算法有效获得采样点.对比以下实验结果,能够看出本文方法模拟的云图效果更逼真.同时,为了体现本文抽稀算法的优越性,表1给出均匀采样[8]、重要性采样[13]以及本文方法的模拟速度对比,图5给出了几种不同的采样方式和本文方法的系统绘制帧率的比较.
表1 几种采样方法对比
Table 1 Comparison of several sampling methods
方法模拟时间模拟速度均匀采样18.410.5重要性采样13.714.2本文方法10.519.6
由表1可得到,在相同的体数据规格400*400*60的情况下,文献[8]和文献[9]的模拟速率相差不大,文献[13]利用重要性采样方式有所提高,本文的采样优化方法能够很好的弥补他们的不足,加快云团系统模拟的速率.从图5折线图看出,相对于另外三种方法,本文提出的方法能够提高系统的绘制帧率,有效的模拟出实时三维云.
图5 绘制帧率比较Fig.5 Draw a frame rate comparison
图6 分别给出了文献[8]、文献[9]、文献[13]以及本文的渲染效果对比图.从实验结果可以看出,图6(a)中在细节层次方面变现的不够清晰;图6(b)中云团会出现部分模糊现象;图6(c)由于采样点不一定,在云团边界有网格状现象.而本文方法由于采用等间距抽稀的方法来进行采样点优化,所以图6(d)的云图边界效果更佳平滑,模拟出来的光照效果真实.
图6 几种方法的三维云图对比Fig.6 Comparison of three-dimensional cloud images of several methods
图7与图8分别给出不同形态的三维云图模拟效果.从实验结果可以看出,本文方法对不同类型的云图均具有很好的适应性.其中:图7(a)和图8(a)中在细节层次方面出现少量锯齿状;图7(b)和图8(b)中云团会出现部分锯齿与模糊现象.而本文方法由于采用等间距抽稀的方法来进行采样点优化,所以在图7(c)和图8(c)中的云图边界效果更佳自然柔和.
本文基于粒子系统的技术建立云的模型,在模拟动态云方面做出改进,反应云的真实特性.通过添加云消失函数、引入改进的八叉树和LOD抽稀技术,实现了三维云从有到无的一个动态渐变过程,提高了三维云模拟的逼真程度.此实验中三维云的仿真可实现实时的真实感效果,实验结果验证所提方法的有效性,是对相关研究有意义的积极探索.在此之前的研究成果中,有些研究是可以提供形象逼真的渲染效果,但是速度不能达到实时交互的要求.但是,有些研究保证速度的同时,又降低了渲染质量.为此,对于怎么样能够很好的在真实感和实时性之间寻求折衷,还需要研究者们进一步探讨.
图7 层云形状对比Fig.7 Stratus cloud shape contrast
图8 积云形状对比Fig.8 Cumulus cloud shape contrast