基于投影网格算法的海面波浪模拟
2018-10-24彭晶,陆晓,李晖
彭 晶,陆 晓,李 晖
武汉工程大学计算机科学与工程学院,湖北 武汉 430205
随着计算机图形学与虚拟现实技术的飞速发展,三维海面波浪场景模拟技术越来越多地应用到各种领域,例如游戏开发、影视业等,研究具有真实感的海洋波浪模型已迫在眉睫。不少国内外学者对此进行了研究。海面建模方面,Johanson[1]首次提出投影网格的算法,投影网格算法是一种依赖于观察者的视觉习惯的算法,离观察者远的网格比较稀疏;反之,则比较细密。王强[2]在三维海面可视化仿真技术研究与实现中采用多级细节层次(Levels of Detail,LOD)网格实现无穷大的海面,利用快速傅里叶变换的周期性得到了海浪高度场。王艳芬等[3]在一种优化的投影网格海面实时绘制方法中提出了屏幕空间的网格自适应方法,模拟了精细化的海面。顾大权等[4]在基于网格投影的Phillips谱真实感海浪仿真模拟一文中构建了一种基于投影网格上的Phillips谱海浪。总的来说,LOD网格算法可以减少海面三角面片的数量,达到感官上的良好效果,是现在研究的热门话题。海面高度场建模方面,各研究人员关注的重点各异,有的追求真实感,有的追求时效性,其关注的重点不同所以采用的算法也都各有千秋。Fournier 和 Reeves[5]使用 Gerstner 模型简单的来描绘水波表面,但是这种方法的计算效率低而且模拟的水面不够逼真。Tessendorf[6]采用快速傅里叶变换(fast Fourier transform,FFT)反演海浪谱,快速生成海面高度场,提升了模拟效果的真实感。熊艳飞等[7]在基于海浪谱模型和FFT的海面建模一文中针对海面波浪的随机性和复杂性等仿真难点问题,从海洋学的观测和研究成果出发,使用风浪、涌浪和震荡波(choppy波)共同构成海浪谱,提出一种逼真度高且计算量小的基于海浪谱模型和FFT的海面建模方法。Kass等[8]通过求解简化Navier-Stokes的方程的解来模拟水波。Peachey[9]采用Sin函数和Cos函数进行叠加的方法来模拟海面的波浪轮廓。陈丽宁等[10]在使用波数谱绘制海浪波幅畸变的矫正中提出了运用快速傅里叶逆变换形式Gerstner波解决绘制海浪中出现的波幅畸变问题。庄建东等[11]在三维海浪造型研究中,选择了Pierson-Moskowite模型为基础,采用了波的波长和波速建立了海浪高度场。陈祥望等[12]在基于图像的水波动动画建模和实时模拟中运用海浪谱统计学模型的水波生成法和FFT技术实时生成了海浪高度场。温东阳[13]在随机粗糙海面的模拟与仿真中针对海浪运动的随机性采用了分形和蒙特卡罗的方法对随机海面进行模拟。此外,也有学者倾向于更加大型更具有交互性的海洋模拟研究[14-15],其对计算机性能要求更高。
随着计算机三维图像技术的日渐成熟,国内外学者都深深体会到真实感三维自然景物模拟的重要性。国内外学者及机构对于三维仿真领域在海面建模和海面高度场建模等方面已有了深入的研究,但是仍存在一些问题,例如注重渲染却忽略时效性,注重实时性而忽略了视觉上的感官需求,所以本文就实时性与渲染方面做出改进,达到二者的兼顾。
1 基于投影网格的波浪生成算法
研究了投影网格算法基本原理,并在此基础上进行了改进,优化了算法效率。此外,将纹理动画与Normal Mapping技术相结合,提高了三维海洋模拟的真实感。海面波浪模拟系统模块划分如图1所示。
图1 海面波浪模拟系统Fig.1 Simulation system of sea surface waves
1.1 海面网格建模
在进行大规模海洋波浪模拟时需要记录大量的数据,所以在进行海面模拟时常常采用网格的方法。在采用网格来进行海面的建模时,需要考虑海洋的广阔性和其实时动态性。主要影响海浪绘制的实时性与真实感的因素的有网格建模的网格模型和网络拓扑结构。若网格与网格之间的间距过于致密,会增加计算机的计算量,影响实时性,而若网格与网格的距离过于稀疏,就会影响模拟场景的真实感。据此,对原始的投影网格做出了一些调整,使得在视点离水面近的时候对投影网格进行简化,减少采样点的数量,以此来避免由于采样点过于密集而导致的走样,从而使渲染出来的海面网格更加平滑,与此同时还减少了计算量,在效率上得到了提升。
由于用投影网格的算法生成一个无穷大的海洋平面对于计算机资源的耗费十分庞大,所以,需要把完整的海洋平面分割成若干个有限面积的高度场,再利用快速傅里叶变化的周期性实现拼接,从而得到一个无穷大的海洋平面。根据FFT算法可以快速叠加的特性,使用FFT建模。
1.1.1 FFT海面高度场的生成 根据FFT的海浪理论可知,快速傅里叶变化生成的海浪模型是由大量的不同的矢量波叠加而成,决定了波的传播是角频率和振幅。本文采用周期为64×64的二维FFT计算,代表世界坐标系下实际长宽都为64 m的海洋模型的高度场。具体流程如图2所示。
图2 计算FFT海面高度场的流程图Fig.2 Flowchart of calculating FFT sea surface height field
1.1.2 限制采样频率的投影网格改进 利用投影网格来生成海面的一大特点就是不需要调整网格的数量,因为它是固定不变的。这对于处理大范围的视野时较好,但是一旦观察者的视野集中在一小块区域时,由于网格数量不变并且区域面积变小,会导致采样过于密集,从而出现网格畸变问题。
总的来说,海洋表面的高度场产生算法只能产生固定频率的高度场数据,当视野过于狭小时,会导致走样。针对这种情况,对原有的算法进行改进,当采样频率达到一定阈值时,对采样点数量进行限制,从而避免走样。换句话说,就是视点离水面较远时可以把采样保持在比较高的频率,而当视点离水面过近的时候就需要简化投影网格,使其采样的频率变小。这种改进方法不仅能解决走样问题,同时还能降低计算量,提高计算效率。改进算法步骤如下:
1)设定投影网格的最高采样频率作为阈值。根据FFT的理论,二维FFT的周期为M,N,网格长宽分别为 Lx,Lz,其采样点的频率为Fwidth=M/Lx,Flength=M/Lz。
2)利用 Mprojector矩阵将视平面的四个顶点投影出来。
3)计算得到采样的实际频率。采用采样点的数量M、N除以其网格在世界坐标系下的实际的长度 SAB,SAD,如式(1)。
4)对投影网格进行调整需要将投影网格的实际采样频率和最高采样频率相比较,使实际采样频率不超过最高采样频率。如果实际采样频率fwidth小于最高采样频率Fwidth,那么原来的投影网格就不需要改变,保持原样即可。反之,如果实际采样频率 fwidth大于最高采样频率Fwidth,需要修改网格的横向的采样点数量,使 M=Fwidth×SAB,减少采样点,从而改变投影网格的频率。对投影网格的采样频率限制之后,当视野向水面移动时,采样点数量减少,网格精度降低,直到 fwidth<Fwidth,采集到不高于最高采样点的值,投影网格保持不变。
同理,对于投影网格的纵向采样频率 flength也采用相同步骤。改进后的算法通过减少采样点实现限制采样频率,可以得到更好的渲染效率。
1.2 纹理映射
在大规模三维场景仿真中,目前的技术还不能直接模拟海面上每一个水粒子的运动,所以,纹理映射技术被引入到三维场景中,给三维场景添加真实感。纹理贴图技术直接关系到三维海面波浪场景的视觉效果,是绘制真实感场景的重要步骤。
纹理贴图[16]可以分为一维纹理、二维纹理、三维纹理。其中二维纹理贴图是最常用的,其原理是将二维纹理映射到三维物体的表面,以此获得具有纹理贴图之后的三维场景,增加模拟的真实感。将二维纹理函数定义在(u,v)平面上,表现形式如下:
此处使用球面的纹理映射,其参数方程如下:
对于球面上的任意一点(x,y,z),求解参数(u,v),表达式如下:
1.2.1 Normal Mapping 直接通过FFT算法得到的海面过于光滑,与现实生活中的海面有一些差距,显得不够真实。真实的水面一般都会有一些波纹和跳动的细节,但是由于计算机资源是有限的,对于网格的精度是有限制的,所以只能模拟一些波长较长的波,在水面模拟中比较常用Normal Mapping仿真水纹的方式以增强细节。本文运用此技术绘制海面,增加海面模拟的真实感。
Normal Mapping技术[17]主要是通过运用纹理去改变物体的法向,其主要目的是体现出物体表面粗糙的纹理细节,而物体表面的几何纹理是不变的,因此只需改变光照模型计算中的法向即可。为了计算物体表面上的每一个点的法向量,那么就需要一些额外的信息去表示物体表面的粗糙程度,采用高度图算法就可实现储存物体表面的凹凸信息,物体表面上的每一个点的法向量由该点的两个切向量得到。
Normal Mapping需将计算得到每个点的法向量存储为一张纹理贴图。向量(0,0,1)被转化为RGB 颜色(127,127,255),因此蓝色是Normal Map的主色调。
Normal Map在仿真水纹时是利用纹理格式的RGB三通道得到一个三维的扰动值。可以将物体表面的每一个点转化为一个单位长度向量,其中的每一个变量都可以传化成RGB值。
1.2.2 基于纹理动画的NormalMapping算法改进 用Normal Mapping算法可以增添海洋模型的纹理细节,但其模拟的纹理是相对固定的。纹理动画是基于静态网格的纹理采样坐标运动,按照设定好的时间间隔连续切换纹理,从而带给观察者一种运动的感觉。将纹理动画与Normal Mapping算法相结合,使得纹理在水面上的位置不断变化,给人感觉就像是水面上的高频波纹在不停地运动。采取三次采样的方法,避免出现重复采样带来的重复感觉。这种方法的思想主要是使水面的纹理随着时间的变化而变化,即用变化的纹理坐标对Normal Map进行采样,来提高水面的真实感。主要思想的伪代码如下:
在上述伪代码中,在进行顶点渲染时选择了3个采样点,选取采样点的标准是3个不同的时间和参数;此外在进行纹理贴图渲染时也进行3次采样,并混合3个法向量,用其进行光照计算,这样会在视觉感官上更加真实。
2 结果与讨论
图3中展示的是模拟场景中的海面波浪。场景中的海面波浪主要是由限制采样频率的投影网格和FFT算法相结合产生的效果。下面分别介绍限制采样频率的投影网格和基于纹理动画的Normal Mapping改进结果。
图3 三维海面场景图Fig.3 3D image of sea surface scene
2.1 限制采样频率的投影网格
海洋表面的高度场生成算法只能是产生有限精度的高度场数据,如果视野过于狭小,就会产生网格采样密度过高而导致走样,如图4(a)所示。所以本文做了相关改进,通过限制采样频率的方式,在当视点离水面较近时,采用简化版的海面网格,避免了海面网格走样,如图4(b)所示。
2.2 基于纹理动画的Normal Mapping改进
真实的水面一般都会有一些波纹和跳动的细节,直接通过FFT算法得到的海面缺少这些细节,会显得不够真实。Normal Mapping在仿真水纹时是利用纹理格式的RGB三通道得到一个三维的扰动值,可以将物体表面的每一个点转化为一个单位长度向量,其中的每一个变量都可以传化成RGB值。
将其应用到海面波浪模型上,可以更直观的看到区别。图5(a)是FFT直接生成的海面,整体比较平滑,缺少细节。引入Normal Mapping生成的海面可以看到丰富的波纹,更加接近真实的海面,如图5(b)所示。
图4 海面网格图:(a)不限制采样频率,(b)限制采样频率Fig.4 Diagram of sea surface grid:(a)unlimited sampling frequency ,(b)limited sampling frequency
图5 海面波浪模拟图:(a)未引入Normal Mapping,(b)引入Normal MappingFig.5 Simulation diagram of sea surface waves:(a)without Normal Mapping,(b)with Normal Mapping
一般的Normal Mapping算法生成的水纹不会随着时间的变化而变化,是静止的。引入纹理动画,用变化的纹理坐标对Normal Mapping进行采样,并采取三次采样来避免出现重复采样的情况,从而实现了波动效果的海面,提高了水面的真实感。
引入纹理动画之后,看平静的海面也可以看到其海面纹理的变化,体现海水波动的视觉感受,不同时间点,同一个区域的海面也会有其微小的变化,如图6展示了1 s、2 s、3 s、4 s时的海面变化。
图6 引入纹理动画后的动态海面模拟图:(a) 1 s,(b) 2 s,(c) 3 s,(d) 4 sFig.6 Simulation diagram of dynamic sea surface with texture animation:(a) 1 s,(b) 2 s,(c) 3 s,(d) 4 s
2.3 算法效率
实验结果考虑了在海面渲染过程中的帧率比较,主要考虑的是在限制采样频率的投影网格与没有限制的网格之间的比较,还有在没有限制网格投影通过FFT生成的高度场帧率与改进后的比较。比较结果如表1所示。
表1 实验结果帧率比较Tab.1 Frame rate comparison of experimental results Hz
从表1中可看出经过限制采样频率的投影网格的频率帧率远高于未经限制的投影网格,改进之后的计算效率更好,结合FFT算法之后海浪模拟的计算效率也使改进网格的效率更高一些。综上所述,改进后的算法在计算速度上占有一定的优势。
3 结 语
以上对海面网格模型进行了研究,在原有的基础上提出了改进的投影网格算法,对采样频率进行了限制,避免了视野狭窄时采样密度过高导致的走样情况,也大量减少了三角面片数量,提高了计算速率,同时结合FFT算法,提高了模拟实时性。此外还对纹理贴图进行了改进,将纹理动画与Normal Mapping算法相结合,不仅提高了海面细节,还增加了海面的动态效果。笔者研究的海面波浪模型还有一些局限,在细节上海面泡沫、碎浪皆未能体现,另外,在计算效率方面还可以做进一步的改进,比如将一部分计算量分配给GPU,从而减少CPU的负担等,可以进一步的探索。