划分区域异速云的实时绘制算法改进探索
2019-01-24吴国倩郭慧玲陶建新
唐 勇,吴国倩,郭慧玲,3,陶建新,4
1(燕山大学 信息科学与工程学院,河北 秦皇岛 066004)2(河北省计算机虚拟技术与系统集成重点实验室,河北 秦皇岛 066004)3(河北环境工程学院 信息工程系,河北 秦皇岛 066102)4(燕山大学 信息技术中心,河北 秦皇岛 066004)
1 引 言
天空是自然景观的重要组成部分,其中云又是不可或缺的.在虚拟环境中绘制逼真的云能够提升视觉效果,增强用户的沉浸感.由于云复杂的物理结构,导致其拥有复杂多变的热力学特征以及丰富的光学特性,使得模拟云成为计算机图形学的一大研究热点与难点.
近些年来,国内外许多研究人员致力于模拟真实且实时的云.在建模方面,2003年,M.J.Harris使用精准的物理模型并结合GPU很好地模拟了动态云[1],大量的计算使得其并不适用于大规模的云绘制,此外在云外形的控制上有所欠缺.2004年,Wang提出了一种可控的云建模方法[2],很好地解决了云模型难以控制的问题.2010年,Eric M.Upchurch采用三维细胞自动机为模拟空间,应用从真实图像中捕获的云纹理[3],由于这种方法在绘制时不会进行真正的照明技术,因此真实感受到了很大的限制.2013年,唐勇[4]等人利用物理的建模方法生成了动态的云,但类型单一.2014年,北海道大学Y Dobashi提出一种通过照片控制生成云的形状以及颜色的方法[5],由于照片中云形状的单一性,决定了生成的云的单一性,并且由于输入信息是二维的,所以用户只能在特定的视点观看.2015年,Prashant Goswami采用物理方法,通过云间的压力、粘度等参数计算直观地控制云的整个生命周期[6],大量的计算使得该方法不得不减少对云的细节绘制,降低了云的视觉效果.2016年,上海交通大学的Akila Elhaddad引入L-J势能函数从微观的角度来简化云粒子运动的物理过程[7],通过调节云粒子的距离来实现云间的相互运动,但是粒子运动时距离过大或过小都会出现混乱的状态.在光照方面,2008年,Bouthors等人采用BRDF方法求解含有面片的云表面光照[8],但不能进行动态的模拟.
目前的云模拟算法中,主要集中于优化单一绘制方法改进云的绘制效果,但对于不同高度的形态各异云的特征表现不够理想.因此,本文提出一种划分云层的策略,根据不同的海拔高度条件,调整模拟方法,绘制出不同类型的云的细节特征;另外,在不改变云整体运动趋势的前提下,构建一个与云的位置、视点距离等相关的速度函数,加在原有的速度场上来增强云层的飘动效果,避免同步移动的现象,以达到更真实的模拟效果.
2 分区域构建云模型
为了能够模拟出不同海拔高度下,不同类型云之间的特征差异,本文通过云层划分的方法,在纵向上按照云模型的需求划分为不同层次、不同类型的云,极大地提高了云的真实感.
2.1 云层区域划分
云是一种极具不规则性以及不确定性的物质,通过单一的数学模型很难对其复杂外部形状进行建模.为了使整个云层能够同时实现真实感的模拟,在实际绘制中,本文根据气象学规律,以2500米为高度线,将云层划分为低层云、中高层云,并且在不同的区域使用相适应的方法构建云模型.
2.2 构建云模型
粒子系统自身多变的特性使得可以生成不同形态的云.本文在粒子系统的基础上,引入Perlin噪声,利用两种方法分别在不同区域内建立云模型.具体的建模过程如图1所示.
图1 构建云模型的流程图Fig.1 A flow chart for building a cloud model
1)根据海拔高度得到区域值X,确定云层所属云层区
2)其次,根据云层区域的不同,选择相适应的绘制方法:
a.一方面,设定云粒子的速度、质量、颜色、生命值,并添加RGBA形式的纹理,随机生成纹理的透明度;另一方面,对该区域施加一个新的速度场.
b.绘制3DPerlin噪声云,插值平滑,扩展噪声.
3)判断绘制的云是否到达绘制边界.如果达到边界,则在边界处对云进行消散处理;如果尚未达到边界则循环执行步骤1)、2)、3).
2.3 3DPerlin插值平滑
单纯使用粒子系统生成的云团,在天空中显得突兀,为了消除这种现象,引入Perlin噪声构造三维云,增加云的层次感,增强真实感.
Perlin噪声也可以说是梯度噪声[9],这意味着需要在空间中相邻间隔点之间插值以达到平滑的效果.设定点P(x,y,z)为空间中要绘制的某一点,给定点P四周的网格点处的噪声值,通过计算每个网格点的梯度向量和给定点到网格点向量的点积,并利用函数对它们进行三次插值后得到最终结果.具体的插值方法如下:
第一次插值:
nx00=n000(1-f(u))+n100f(u)
(1)
nx10=n010(1-f(u))+n110f(u)
(2)
nx01=n001(1-f(u))+n101f(u)
(3)
nx11=n011(1-f(u))+n111f(u)
(4)
第二次插值,将公式(1)(2)所得结果进行插值,得到公式(5);将公式(3)(4)所得结果进行插值,得到公式(6):
nxy0=nx00(1-f(v))+nx10f(v)
(5)
nxy1=nx01(1-f(v))+nx11f(v)
(6)
第三次插值,同理得到公式(7):
nxyz=nxy0(1-f(w))+nxy1f(w)
(7)
其中,u=x-i,v=y-j,w=z-k,分别为点P(x,y,z)在X、Y、Z轴方向距离正方体的距离,(i,j,k)为点P所在立方体的左下角顶点坐标,n010、n010、n001、n011、n100、n110、n101、n111分别是离P点八个最近的网格点处的伪随机梯度向量和点P到网格点向量的点积,f()为f(t)=6t5-15t4+10t3,nxyz为最后结果.
通过划分云层区域的方法可避免使用同一种方法难以准确表达不同类型云的特征的问题,很好的展现云的多态性.
3 异速云的实现
天空中云彩飘动极大的增强了场景的真实感.目前对于云彩飘动的模拟研究多集中于飘动现象本身,而鲜有对云飘动过程中云的相对位置变化做出探究.为了能够更真实地模拟云彩飘动的效果,改进云速度单一的问题,本文通过在原有速度场基础上增加一个可变的速度场来消除这种现象.
(8)
通过对云的速度进行修改,能够有效地解决低云层整体飘动的问题,实现云的异速飘动.
4 光照的计算
虚拟场景中云的真实感离不开光照.云是一种大气效果,由于严格按照大气散射方法来模拟,计算量极大,渲染效率比较低[10],因此本文采用简化的光照模型,只考虑天空环境光和太阳的定向光对云的光照影响.
4.1 环境光的近似计算
Camb=(AV*CV0+(1-AV)*CV1)*(AT*CT0+(1-AT)*CT1)
(9)
4.2 太阳定向光的近似计算
为了能够实现黎明和黄昏的转变,模拟时令云团面对太阳的区域接受较多的定向光,而背离太阳的区域则接受较少的定向光.对于云团中的任意一点,首先,计算出太阳到云团中心的矢量和顶点到云团中心的矢量,再计算出这两个向量的点积.同样通过选取指定的颜色值,利用插值的方法决定当前时间的方向颜色值,具体计算公式为:
Cdir=mappingfunc(Vvc·Vcs)
*(AT*CT0+(1-AT)*CT1)
(10)
4.3 最终颜色的计算
一方面,根据颜色混合原理可知,云团中每个粒子最终的颜色值都是由环境光和太阳光颜色值累加得到,另一方面为了模拟云的耗散效果,在原有光的基础上增加了Alpha值来控制粒子的透明度.如此最终的效果如公式(11)所表现的.其中Ctexture为云纹理的颜色.
C=(Camb+Cdir)*Ctexture*Alpha
(11)
把光照分为天空环境光和太阳光两种,利用插值的方法简化运算,极大地减少了计算量,有效的保证了绘制大规模云的实时性.
5 实验结果与分析
实验基于Windows操作系统,使用Unity3d建立了云的模拟仿真平台.硬件环境为:Intel(R)Core(TM)i7 CPU 4790 3.60GHz,8G RAM,显卡为ATI AMD Radeon R7 200 Series.
图2为使用单一方法同使用两种方法绘制的云的对比,展示了黄昏时刻云的俯视图.其中图2(a)为仅有Perlin噪声模拟的云,图2(b)为仅有粒子系统模拟的云,图2(c)同时使用粒子系统和Perlin噪声绘制不同类型云的场景效果,可以看出同时使用两种方法能更好的展示天空中云的多样性.
图2 使用单一方法同使用两种方法的绘制的云的对比Fig.2 Use a single method to compare the cloud with two methods of drawing
由于空中任意两朵云的空间位置都不同,会受到不同大小、方向的风力影响,在空中飘动时相对位置会发生变化.图3为处于不同空间位置的云随时间推移其空间位置变化的情况,实现了不同空间位置的云异速飘动的效果.
图3 随时间推移云的相对位置变化(仰视图)Fig.3 Relative position change of the cloud over time(bottom view)
图4中黑色箭头表现出由于太阳位置的不同,定向光的方向也不同,导致了云明暗位置的不同,分别展现了云在早晨、中午、傍晚、子夜四个不同时刻的光照下,呈现出不同色彩的效果.
图4 不同时刻绘制的云Fig.4 Clouds drawn at different times
图5为本文方法同文献[4]、文献[5]、文献[7]实现效果的对比.其中,图5(a)为文献[4]生成的云,该方法生成的云类型单一;图5(b)为文献[5]生成的积云,该方法只能在竖直方向上控制云的生成过程,不能展示出多种云的特性和细节;图5(c)为文献[7]生成的云层,由于系统本身的缺陷,导致云层易出现混乱;图5(d)为本文方法生成的云,不仅能够实现中低云层的真实绘制,而且较高云层也能拥有很好的视觉效果.
为验证划分区域绘制云方法的可行性、实时性和有效性,表1通过几组实验同文献[4,7]进行对比,可见文献[4]在网格分辨率为64*64*64,云团数为1时帧率仅有33-35帧/秒,文献[7]在最佳性能时,帧率只有9帧/秒,而本文算法绘制云的帧率普遍达到60帧/秒以上,能够很好的满足实时性的要求.
图5 文献[4]、文献[5]、文献[7]及本文中生成的云Fig.5 Clouds generated in literature [4]、[5]、 [7]and this paper
表1 本文同文献[4,7]的数据对比
Table 1 Comparison between ours and [4,7]
实验图模拟方法粒子总数网格分辨率模拟域帧率(fps)图3 粒子、128.9K-77图4 Perlin噪声208.1K-较大65图5c 声52.9K-90图5a([4]) 网格-64∗64∗64小33-35图5c左([7])粒子48.8K-较大9
6 结 论
在虚拟环境下云模拟仿真过程中,针对同一场景下不同高度的云不能同时实现较好模拟效果的问题,提出了一种划分云层区域的实时仿真方法,在不同的云层区域采用不同的模拟方法;通过在云层区域增加一个可控的新速度场,避免了同步移动的问题,提高了仿真的真实性;同时利用简单的光照模型实现了一天内随着时间的变化,云色彩的逐步变化.最后,本文将云模拟嵌入三维场景,通过几组实验验证及与相关文献工作的对比分析表明,所提出的方法能够实现多态云在虚拟环境下的实时仿真.今后我们将研究云在不同天气状况下的模拟问题,使云更加真实.