基于OpenGL的海面波浪模拟研究

2018-10-18 06:14
无线电通信技术 2018年6期
关键词:视点海面纹理

陆 晓

(浙江理工大学 信息学院,浙江 杭州 310000)

0 引言

三维海面波浪场景模拟[1]是一种运用计算机图形学的理论与方法对海面场景进行模拟仿真的技术。海面波浪模拟的研究重点是海面网格的形成、海面高度场的生成以及海面光照的模拟,通过对这三者的结合来模拟具有良好真实感的海面。

如今的三维海面场景建模技术已经不单单是只是存在于科学家的研究之中,而是早已走进了大众的视野。在现实生活中,三维海面场景的应用领域十分广泛:在三维游戏开发、影视动画设计以及虚拟社区等领域,它的应用都十分普遍。在三维游戏开发中,开发者通过建立逼真的海面波浪模型增强了游戏画面的真实感;在影视动画设计方面,三维海面波浪建模技术的引入为观影者带来更好的观影感受;在虚拟社区中,极其逼真的海面波浪场景更是为用户带来了无与伦比的亲切感。

目前在视景仿真的运用中,主要采取的建立海面场景的建模方式有很多。其中主要的建模方式有: Gerstner模型[2]、FFT模型[3]、流体力学模型[4]以及Perlin[5]噪声模型等模型。其中Kass[6]等人通过求解简化Navier-Stokes的方程的解来模拟水波;Peachey[7]采用Sin函数和Cos函数进行叠加的方法来模拟海面的波浪轮廓;Tessendorf[8]模拟海洋的方法是采用快速傅里叶变换(FFT)算法来实现高度场。海面网格创建也是一大热点,包括LOD[9]网格算法、多级LOD网格[10]、屏幕空间的网格自适应方法[11],以及基于投影网格的Phillips谱海浪[12]等算法。其中Johanson[13]采用投影网格的算法。网格投影算法是根据观察者的视觉习惯的一种算法,离观察者远的网格比较稀疏;反之,则比较致密。王艳芬[14]等人在一种优化的投影网格海面实时绘制方法中提出了屏幕空间的网格自适应方法模拟精细化的海面。

1 限制采样频率的投影网格改进

1.1 投影网格采样过密的缺点

利用投影网格来生成海面的一大特点就是不需要调整网格的数量,因为它是固定不变的,不是动态变化的,这对于处理大范围的视野时是比较好的,但是如果一旦观察者的视野集中在一小块区域时,就会出现采样过于密集,而导致走样。图1生动地展示了大范围的视野以及小范围的视野。

图1 观测点不同时采集的不同精度的投影网格

总的来说,海洋表面的高度场产生算法只能是产生有限精度的高度场数据,所以,如果视野过于狭小,就会产生网格采样密度过高而导致走样,所以要对这种情况进行改进,得到一个相对较好的采样精度。

1.2 改进算法

因为视点会随着观察者的观测点的改变而改变,所以需要限制投影网格的精度,就需要对原来的投影网格算法做一些修正。换句话说,就是视点离水面较远时,可以把采样保持在比较高的精度,而当视点离水面过近的时候就需要简化投影网格,使其采样的精度变小。所以,提出如下改进算法:

① 首先确定投影网格的最高的采样频率。根据FFT的理论,二维的FFT的周期为M,N,代表网格长宽的是Lx,Lz,因此它的采样点的频率为:

Fwidth=M/Lx,Flength=M/Lz。

(1)

② 再利用Mprojector矩阵将视平面的4个顶点投影出来,如图2所示。

图2 调整投影网格的算法

③ 需要通过计算去得到采样的实际频率,采用采样点的数量M,N除以其网格在世界坐标系下的实际的长度SAB,SAD,得到下式:

fwidth=M/SAB,flength=N/SAD。

(2)

④ 最后,需要对投影网格进行调整,需要使投影网格的实际采样频率和最高频率F相等。首先需要把实际的采样频率与设定的理想的F值相比较,假如fwidthFwidth,就说明采用的频率已经高于最高的采用频率了,就需要将原来的投影网格AB点对称地扩展成为A'B',使得网格的采用频率和最高点的采用频率相等,即Fwidth=M/SA'B',具体算法如下:

(3)

同理,对于投影网格的纵向采样频率flength也是采用相同的工作原理。

上述是对限制投影网格采样精度的算法步骤,其中第4步,可以采取一种代替的算法去代替他,得到的算法有更好的渲染效率,具体改变是这样的,改变网格的实际大小,利用减少采样点的方法来达到限制采样精度的效果。换句话说,就是当fwidth>Fwidth时,通过修改网格的横向的采样点数量,由公式表达就是M=Fwidth*SAB,具体如图3所示。

图3 减少采样点后的图示

采用对投影网格的采样精度限制之后,当视野向水面移动之后,采样点的数量或减少,网格精度降低,知道达到式子fwidth

图4 采用限制采样点数量之后与不限制采样点时的比较

2 基于纹理动画的法线贴图算法改进

纹理动画也称连续贴图技术,其主要思想是:首先,构造一个矩形,并且为这个矩形创建一个纹理数组,当这个三维物体开始运动时一系列的二维图片作为创建的纹理数组的一个元素,再按其先后顺序放置在数组中;其次,按照设定好的时间间隔连续切换矩形的纹理,当其时间间隔非常小时,并且图片之间的差别也较小,这些连续的图片就可以实现三维模型的运动效果。

直接通过FFT算法得到的海面过于光滑,与现实生活中的海面有一些差距,显得不够真实。真实的水面一般都会有一些波纹和跳动的细节,但是由于计算机资源是有限的,对于网格的精度是有限制的,所以只能模拟一些波长较长的波。所以,Bump Mapping的添加是有必要的,这样就可以增强细节。但是在水面模拟中还是比较常用Normal Mapping仿真水纹的方式去动态获得Bump Mapping的效果。

Normal Mapping在仿真水纹时是利用纹理格式的 RGB 三通道得到一个三维的扰动值,可将物体表面的每一个点转化为一个单位长度向量(Vx,Vy,Vz),其中的每一个变量都可以转化成RGB值。Normal mapping的效果,如图5所示。

一般的Normal mapping算法都是相对固定的,其水纹不会随着时间的变化而变化,看起来并不真实。在此提出能够使海面看起来随时间改变而改变的场景,通过分析 Normal mapping算法的特点,加入纹理动画的效果,实现波动效果的海面。纹理动画是基于静态网格的纹理采样坐标运动,带给观察者一种水面运动的感觉。基于纹理动画的算法使得 Normal Mapping 纹理在水面上的位置不断变化,海面网格的每个顶点的 Normal Mapping 纹理坐标是不停运动的,给人感觉就像是水面上的高频波纹也在不停地运动。本文采取3次采样的方法,避免出现重复采样带来的重复感觉。这种方法主要是使水面的纹理随着时间的变化而变化,即用变化的纹理坐标对Normal Mapping进行采样,来提高水面的真实感。

图5 突出细节对比

3 实验结果及分析

通过投影网格算法生成海面网格;利用FFT算法实现海面高度场,并通过限制采样频率解决了视点在离水面较近时产生的走样问题;利用圆屋顶模型建立球形天空盒,利用基于纹理动画的Normal Mapping算法改进使得水面看起来更加真实。下面从帧率及海面波纹2方面分析:

① 帧率比较。实验结果考虑了在海面渲染过程中的帧率比较,主要考虑的是在限制采样精度的投影网格与没有通过限制的网格之间的比较,还有在没有通过限制网格投影通过FFT生成的高度场帧率与改进后的比较。比较结果如图6所示。

通过改进的投影网格和FFT高度场模拟的海面比传统的投影网格和FFT高度场模拟的海面更好地减轻了计算机资源的压力,提高了帧率。根据视点离海面的远近距离采用了限制采样进度的投影网格算法,当视点远离海面时,提高采样进度;反之,当视点靠近海面时,限制采样频率,解决了传统投影网格法在视点离水面比较近采样时,频率突然增加、导致采样过于密集造成水面网格不平滑的现象,并且减轻计算机的计算压力。

图6 实验结果帧率比较

② 海面波纹。通过FFT产生的海面高度场相对平滑,看起来不真实,通过基于纹理动画的Normal Mapping算法改进使海面看起来更加真实,效果对比如图7和图8所示。改进的思路是基于纹理动画算法使得Normal Mapping纹理在水面上的位置不断变化,给人一种动态的感觉。综述所述,就是对每次随着时间变化的纹理进行采样,产生动画的效果,凸显细节,增加真实感。

图7 FFT直接产生的海面高度场

图8 基于纹理动画的Normal Mapping算法改进

4 结束语

在三维海面波浪场景建模中有两点创新:第一,在传统的投影网格算法中提出了在近视点的时候采用限制采样频率的投影网格算法,通过区分视点离海面的远近做出判断,当视点远离海面时提高采样频率,当视点靠近海面时限制采样频率,通过这种算法减轻了计算机资源压力并提高了计算效率;第二,在渲染海面场景中,在原有的Normal Mapping算法中融入纹理动画的概念,使得海面波浪纹理更加突出,提高了海面波浪浮动的视觉感受,提高了海面模拟的真实感。

猜你喜欢
视点海面纹理
海面床,轻轻摇
第六章 邂逅“胖胖号”
基于BM3D的复杂纹理区域图像去噪
使用纹理叠加添加艺术画特效
TEXTURE ON TEXTURE质地上的纹理
海面上的“一千座埃菲尔铁塔”
环境视点
消除凹凸纹理有妙招!
让你每天一元钱,物超所值——《今日视点—2014精萃》序
两会视点