《武汉工程大学学报》 2018年05期
559-564
出版日期:2018-12-27
ISSN:1674-2869
CN:42-1779/TQ
基于投影网格算法的海面波浪模拟
随着计算机图形学与虚拟现实技术的飞速发展,三维海面波浪场景模拟技术越来越多地应用到各种领域,例如游戏开发、影视业等,研究具有真实感的海洋波浪模型已迫在眉睫。不少国内外学者对此进行了研究。海面建模方面,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.1 海面网格建模在进行大规模海洋波浪模拟时需要记录大量的数据,所以在进行海面模拟时常常采用网格的方法。在采用网格来进行海面的建模时,需要考虑海洋的广阔性和其实时动态性。主要影响海浪绘制的实时性与真实感的因素的有网格建模的网格模型和网络拓扑结构。若网格与网格之间的间距过于致密,会增加计算机的计算量,影响实时性,而若网格与网格的距离过于稀疏,就会影响模拟场景的真实感。据此,对原始的投影网格做出了一些调整,使得在视点离水面近的时候对投影网格进行简化,减少采样点的数量,以此来避免由于采样点过于密集而导致的走样,从而使渲染出来的海面网格更加平滑,与此同时还减少了计算量,在效率上得到了提升。由于用投影网格的算法生成一个无穷大的海洋平面对于计算机资源的耗费十分庞大,所以,需要把完整的海洋平面分割成若干个有限面积的高度场,再利用快速傅里叶变化的周期性实现拼接,从而得到一个无穷大的海洋平面。根据FFT算法可以快速叠加的特性,使用FFT建模。1.1.1 FFT海面高度场的生成 根据FFT的海浪理论可知,快速傅里叶变化生成的海浪模型是由大量的不同的矢量波叠加而成,决定了波的传播是角频率和振幅。本文采用周期为64×64的二维FFT计算,代表世界坐标系下实际长宽都为64 m的海洋模型的高度场。具体流程如图2所示。1.1.2 限制采样频率的投影网格改进 利用投影网格来生成海面的一大特点就是不需要调整网格的数量,因为它是固定不变的。这对于处理大范围的视野时较好,但是一旦观察者的视野集中在一小块区域时,由于网格数量不变并且区域面积变小,会导致采样过于密集,从而出现网格畸变问题。总的来说,海洋表面的高度场产生算法只能产生固定频率的高度场数据,当视野过于狭小时,会导致走样。针对这种情况,对原有的算法进行改进,当采样频率达到一定阈值时,对采样点数量进行限制,从而避免走样。换句话说,就是视点离水面较远时可以把采样保持在比较高的频率,而当视点离水面过近的时候就需要简化投影网格,使其采样的频率变小。这种改进方法不仅能解决走样问题,同时还能降低计算量,提高计算效率。改进算法步骤如下:1)设定投影网格的最高采样频率作为阈值。根据FFT的理论,二维FFT的周期为M,N,网格长宽分别为[Lx,Lz],其采样点的频率为[Fwidth=M/Lx,Flength=M/Lz]。2)利用[Mprojector]矩阵将视平面的四个顶点投影出来。3)计算得到采样的实际频率。采用采样点的数量M、N除以其网格在世界坐标系下的实际的长度[SAB,SAD],如式(1)。[fwidth=M/SAB,flength=N/SAD] (1)[A’A=BB’=ABAB(A’B’-AB2) A’=A-A’A,B’=B+BB’] (2)4)对投影网格进行调整需要将投影网格的实际采样频率和最高采样频率相比较,使实际采样频率不超过最高采样频率。如果实际采样频率[fwidth]小于最高采样频率[Fwidth],那么原来的投影网格就不需要改变,保持原样即可。反之,如果实际采样频率[fwidth]大于最高采样频率[Fwidth],需要修改网格的横向的采样点数量,使[M=Fwidth×SAB],减少采样点,从而改变投影网格的频率。对投影网格的采样频率限制之后,当视野向水面移动时,采样点数量减少,网格精度降低,直到[fwidth