基于FFT法线贴图的海面波浪模拟方法研究

2019-12-23 07:24徐立东包雪怡
计算机时代 2019年12期
关键词:模拟海面波浪

徐立东 包雪怡

摘  要: 采用多分辨率FFT(快速傅里叶变换)波浪方程来计算法线贴图,在低分辨率网格上构建海面高度场,然后使用Cuda架构对波浪方程并行求导算出更高分辨率的法线贴图,用Open GL着色器来渲染海面波动效果,可有效模拟海面。随着法线贴图分辨率的提高,能更加细腻、真实地展现海面波浪的绘制效果。实验结果表明,采用基于FFT法线貼图的海面波浪模拟可视化框架,能够不增加海面网格的几何复杂度、节省计算时间,在一定程度上提升海面细节、增强视觉效果。

关键词: 快速傅里叶变换; 法线贴图; 海面; 波浪; 模拟

中图分类号:TP399          文献标志码:A     文章编号:1006-8228(2019)12-23-05

Research on sea wave simulation method based on FFT normal map

Xu Lidong, Bao Xueyi

(Ocean University of China,College of Information Science and Engineering,Qingdao, Shandong 266100, China)

Abstract: The multi-resolution FFT (Fast Fourier Transform) wave equation is used to calculate the normal map, the sea surface height field is constructed on the low resolution grid, and then the Cuda architecture is used to parallelize the wave equation to calculate the higher resolution normal map. Textures, using Open GL shaders to render sea wave effects, can effectively simulate the sea surface. As the resolution of the normal map is improved, the drawing effect of the sea wave can be more delicately and realistically displayed. The experimental results show that the FFT normal map based sea surface visualization framework can increase no more the geometric complexity of the sea surface mesh, save the computation time, and improve the sea surface detail and enhance the visual effect to some extent.

Key words: Fast Fourier Transform; normal map; sea surface; wave; simulation

0 引言

近年来,“智慧海洋”成为海洋数据信息化发展前沿的研究热点之一。海面可视化是海洋环境虚拟现实可视化中的一个重要的课题,由于海洋环境复杂多变性,海面会受到风力、潮汐、航行中船舶等诸多因素影响,产生不同幅度的海面波动,为了实现海面波浪可视化更加逼真的渲染绘制效果,提高程序的并行性和计算效率,以及提高渲染绘制的实时性成为了国内外学者研究的难点。

在海面建模和渲染方面,早期的方法是采用一张预先计算好的法线贴图映射到海面上,并通过纹理的扰动来得到近似波动的效果,此法是基于二维纹理波技术,不属于基于物理的海面建模。Gerstner wave最初在物理中用于水波的模拟,其形状比较真实,而且计算量不大,被广泛用于计算机图形学中水波的模拟,被作为模拟海面的物理模型。1986年,Fournier和Reeves[1]首次使用此模型模拟海岸线海面波动,生成较为真实的海场景。2001年,Jerry Tessendorf[2] 提出快速傅里叶变换(FFT)能够在适中规模的网格上生成逼真的海面并可达到实时处理的帧率。童若锋等[3]对顶点波、涟漪、紊乱的短峰波等进行分类造型,模拟水波的大致形状。Yann[4]给出了基于三维体元的纳维尔斯托克斯方程(N-S方程)求解方法来模拟海面。徐迎庆[5]等从描述不稳定的Saint-Venant方程组来模拟海浪。2018年,Jeschke S,Sk?ivan T,Müller-Fischer M等[6]使用小波变换对流体变化进行离散化处理,此法拓展传统的FFT波浪模型,能准确地模拟流体和物体之间的相互作用。本文将FFT波浪方程计算法线贴图和纳维尔斯托克斯方程(N-S方程)相结合,构建了一个海面波浪模拟可视化框架。

1 海面波浪模拟

真实的海面模拟效果不仅需要划分海面网格,也需要逼真的海面波浪模型及真实感绘制,本文所用的渲染技术是可编程着色技术(shader),对N-S流体动力学方程的求解和FFT变换均在CUDA上进行,渲染工作均由Open GL着色器编写。

1.1 轻微波浪模型

对于海面波浪模拟的简单方法是将其看作一组正弦曲线的叠加:

[H(x,z,t)=(Ai×sin(Di.x,z)×ωi+t×?i)]  ⑴

其中,Ai是每个波浪的振幅,Di是一个二维向量指向波峰传播方向,[ωi]= 2π/L(这里,L为每个波浪的波长)。

此模型模拟的波浪浪尖圆滑,适合于平静海面。为了模拟波峰尖锐的波浪,可在波的传播方向增加位移,得到Gerstner wave波动函数,Gerstner wave表示为:

[X=X+(Qi Ai×X×cos(ωi(x?,z)+ψi t))Y=(Ai×sin(ωi Di?(x,z)+ψi t))]   ⑵

在三角函数中添加一个π/2的相位偏移,Gerstner wave可表示成如下形式:

[X=X-(Qi Ai×X×cos(ωi?(x,z)+ψi t))Y=(Ai×sin(ωi Di?(x,z)+ψi t))]   ⑶

可得,Gerstner wave的每个波浪的振幅是常数 ,Gerstner wave是随时间t变化的三角函数波形模拟波浪运动。海洋统计学中,波浪的振幅常看作是一个随时间变化的高度函数h(x,t),X是一个二维坐标(x,z)。将式⑶中与时间t的部分去掉,使用h(x,t)替换常数 可得:

[Y=h(x,t)×cos(ωi Di?(x,z))]        ⑷

在式⑷中增加一個虚部函数,设波浪波长为L,可得:

[ ⑸]

根据欧拉公式[eiα=cosα+isinα],⑸可以改写为:

[Y=h(x,t)eiωiDiX]                ⑹

由此得到傅里叶逆变换的海面模型的初步形式,使用快速傅里叶逆变换可快速对大量cos和sin波形求和,最终基于FFT的波浪模型为:

[h(X,t)=h(K,t)eiKX]            ⑺

[h(X,t)]是一个复数,实部表示波浪高度,虚部表示相位。X是水平面二维坐标,该公式结果为X=(x,z)坐标下的高度。该表达式在[s×s]的范围内的二维网格生成一个周期的FFT波浪,s尺度范围10米~2000米,参与傅里叶变换的网格点数可达2048×2048,在一定视野范围使用较大的s生成的波浪没有较明显的周期性。为创建初始时刻海面高度场的傅里叶频谱,Tessendorf[6]使用了一个如下的菲利普频谱函数:

[Ph(k)=  Aexp(-1/(kl)2)k4|K?w|2]    ⑻

这里,[l= v2g]是在风速v下的最大波浪,k是波浪向量的模,向量[K]是波浪的传播方向,向量[w]是波浪的传播风向。时刻的高度由式⑼得出:

[h0(k)=12(εr+iεi)Ph(K)]        ⑼

[εr]和[εi]是均值为0方差为1的高斯随机数。根据t时刻的频谱,本文可得t时刻的频谱函数:

[h(-k,t)=h0(k)eiω(k)t+h0(-k)e-iω(k)t]      ⑽

从该式可得向相反方向传播的波浪的高度频谱同高,海面高度场有对称性。

1.2 汹涌波浪模型

由式⑹FFT波浪模型可模拟出平滑的浪尖和波纹,此模型适用于较为平静的海面模拟。但是在现实中由于风力等强外力影响,海面波浪在其顶端会形成浪尖,波浪的轮廓(波长和波高)受环境影响。足够高度的波浪会在顶端发生碰撞,生成复杂的物理现象,比如泡沫和水花。对于波浪的模拟需研究海面运动的流体动力学方程。此类方法在海面高程和动力势能上描述水体的运动规律,都源自纳维尔斯托克斯方程(N-S方程)。Creamer[7]使用“米氏变换”的数学方法产生一系列海面高程和速度势能的规范化变换。使用这种变换方法可将海面高程和速度势能转换成简单的表示形式。米氏变换可在二维空间中得出精确解,在三维空间中难以应用。根据二维空间中精确解,利用插值形式可求出三维空间中的解:一个波浪的水平位移项,该位移随着波浪和时间变化。

本文在FFT的海浪模型的基础上使用了两种波浪模型分别用来模拟风速较小时和风速较大时的波浪。

原始的FFT波浪方程如下:

[hX,t=hk,teikx]          ⑾

为得出风速较大时的波浪,不修改参与傅里叶变换的高度函数,在原来的FFT表现形式下增加一个位移项,将原始波浪在水平方向上位移一定距离,使用下式:

[X=X+λDX,t]   ⑿

λ是一个位移系数,用此法模拟海浪需要注意:波浪的顶端可能会发生重叠,即海面会经过自身并发生卷曲,振幅较大的波浪会产生相互重叠的位移,解决此问题需将λ设定为较小的值。

[DX,t]可再通过快速傅里叶变换得到如下公式:

[D(X,t)=-iKkh(K,t)eiKx]    ⒀

[DX,t]是一个二维偏移向量,使用式⑿可得当前网格点经过平移后的对应的网格点的位置,为获得连续的波浪,使用一次双线性插值计算偏移位置对应的海面高度。

1.3 基于FFT的法线贴图

渲染海面,计算法线是关键。相邻网格点的高度差距计算量小,但海面网格的点数少且波长小时,此法所得近似值不准确,波长小于单位网格间距时难以看到海面光照波动效果。

使用式⑹计算表面次法线B与正切向量T,B和T可对式⑹求x和z方向的偏导数求出,可再用一次傅里叶变换,(6)求导可得:

[?h(x,t)=ikh(k,t)eikx]           ⒁

海面参数方程表示为:

[P(x,z,t)=(x,H(x,z,t),z)]           ⒂

次法线B可表示为:

[B(x,z)=(?x?x,?H(x,z,t)?x,?z?x)=(1,?H(x,z,t)?x,0)]  ⒃

切向量T可表示成:

[T(x,z)=(?x?z,?H(x,z,t)?z,?z?z)=(0,?H(x,z,t)?x,1)] ⒄

顶点法线:

[N=T×B=(-?H(x,z,t)αx,1,-?H(x,z,t)αz)]   ⒅

把式⑾带入,得法线表达式:

[N=(-ik.xh(k,t)eikx,1,-ik.yh(k,t)eikx)]  ⒆

其中,k.x表示k的x分量,k.y表示k的y分量。

网格分辨率的影响海面的渲染效果,借助GPU的强大性能,可较快实现大规模网格的FFT变换,通过在式⒁中二维波浪向量k的x方向以及k的z方向添加小的偏移[Δx]、[Δz],計算任意二维波浪向量k[+Δk]的法线值,此法可实时计算出任意分辨率的法线贴图。将法线贴图传递到片段着色器中进行光照计算,可增加波浪的高频部分和细节。

2 海面光照

海面真实感是光与海面复杂交互的结果。光照模型是用于计算光源经过物体反射、散射后返回视点的数学表示。随着GPU硬件性能的提升,光照模型的复杂性和硬件的限制逐渐减弱。利用Cuda架构可对光照模型进行有效快速的计算,构建海面光照可有效提升海面波浪细节,增强视觉效果。

海面的光照模型可看作一个理想镜面,但此模型不具真实感,需对其进行改进。假设到达海面的光线主要分为两部分:穿透海面经过折射的光线和被反射的光线,这两部分的光强受到反射和折射系数的影响。

2.1 反射光线

在理想的镜面反射中,入射角和反射角相等。本文构建一个反射光线的简单描述,海面上的三维点可表示成水平方向x与波浪高度函数[h(x,t)]的线性组合:

[r(x,t)=x+yh(x,t)]              ⒇

其中,[y]是垂直向上的方向向量。点r处的法线由波浪方程求导得出,[ε(x,t)=?h(x,t)],法线由下式得出:

[ns(x,t)=y-ε(x,t)1+ε2(x,t)]            21

对于方向[ni]与入射表面交于r的入射光线,其反射光线的夹角只和入射光线和反射表面在r处的法线有关。由入射角和反射角相等,可得反射向量:

[nr(x,t)=ni-2ns(x,t)(nr(x,t)?ni)]      22

2.2 折射光线

折射光线的方向与入射光线和折射表面的法线有关,遵循Snell定律(入射角和折射角的比值等于入射介质和折射介质的折射率的比)。设入射光线从折射率为ni的介质入射,折射光线从折射率为ns的介质出射,对于入射角有下面公式:

[sinθi=1-(ni?ns)2=|ni×ns|]    23

根据Snell定律入射角和折射角有以下关系:

[ni sinθi=nt sinθt]            24

折射向量由下式给出:

[nt(x,t)=±{1-(nint)2|ni×ns(x,t)|2}12]    25

2.3 菲涅耳反射和折射

反射系数和透射系数决定光线在介质反射和投射的效率。在没有光强损失的限定条件下,反射系数R和T存在以下关系:

[R+T= 1]                 26

R和T的推导结果

[R(ni,nr)=12{sin2(θt-θi)sin2(θt+θi)+tan2(θt-θi)tan2(θt+θi)}]  27

海面上不同的反射率构成海面的纹理。反射率是入射角与法线的函数,由此可知,海面高程梯度是影响海面纹理的关键因素,而浪高度起到波浪间相互遮挡作用,海面高程梯度图和海面高程图相比与渲染后的海面具有更加相似的纹理。

3 实验与结果

3.1 实验环境与实验方法

本文使用的CUDA版本为8.0,实验采用的机器配置为:Intel Core i5-4430,双核四线程,主频3.0GHz,内存8GB,NVIDIA GTX960显卡。

海面模拟和可视化框架由OpenGL着色语言实现,本文框架对FFT法线贴图实现参数化控制,理论上其可以支持无限分辨率海面渲染,但是由于内存与显存容量限制,实际计算中并不能得出无限分辨率的结果。本文的渲染框架中计算开销最大的部分是FFT法线贴图的计算,CUDA完成全部计算过程。

框架的FFT海面高度场均使用128×128的二维网格生成,为达到真实的视觉效果并节省计算开销,低分辨率的海面网格上使用高分辨率法线贴图来增强视觉效果。当法线贴图的分辨率增加时,呈现更多高频波浪及更多海面细节。

3.2 實验结果与分析

3.2.1 效果图

所有实验结果均在1200×900像素的窗口展示,效果图使用分辨率为512×512像素的法线贴图。

3.2.2 测试图表

随着法线贴图分辨率的提高,得出计算时间与帧率趋势图。从表1、图2可以看出,计算时间随着法线贴图分辨率的提高而逐渐升高,计算时间增长速度也随着法线贴图分辨率的提高而加快,帧率随着法线贴图分辨率的提高而逐渐下降,帧率下降速度无明显加快的趋势。帧率虽然下降,但在所测试的分辨率的情况之下均可保持在60FPS以上,能够保证交互感和逼真感。将本文方法与投影网格方法进行对比,本文方法的帧率有所下降,但不影响流畅程度,并且计算时间与投影网格方法相比降低10%左右。

4 结束语

本文构建一个海面模拟可视化框架,采用了FFT波浪方程计算法线贴图和纳维尔斯托克斯方程(N-S方程)相结合来构建海面,采用CUDA对N-S方程的求解和FFT变换,并用Open GL着色器进行海面渲染,实现海面波浪模拟。可不增加海面网格复杂度而得到逼真的视觉效果,节省计算时间,满足实时交互的帧率要求,为海面波浪模拟提供了一定的参考。

参考文献(References):

[1] Fournier A,Reeves W T.A simple model of ocean waves[J].ACM SIGGRAPH Computer Graphics,1986.20(4):75-84

[2] Tessendorf J.Simulating ocean water[J].Simulating nature:realistic and interactive techniques.SIGGRAPH, 2001.1(2):5.

[3] 童若锋,汪国昭.用于动画的水波造型[J].计算机学报, 1996.8:594-599

[4] Yann L.Realistic water rendering[J].2003).http://www. andyc,org/lecture/vewlog. php,2003.

[5] 徐迎庆,苏成,李华,et al.基于物理模型的流水及波浪模拟[J].计算机辅助设计与图形学学报,1997.2:191-192

[6] Creamer D B,Henyey F,Schult R,et al.Improved linear representation of ocean surface waves[J].Journal of Fluid Mechanics,1989.205(-1):135.

[7] Tessendorf J.Simulating ocean water[J].Simulating nature:realistic and interactive techniques.SIGGRAPH, 2001.1(2):5.

[8] Creamer D B,Henyey F,Schult R,et al.Improved linear representation of ocean surface waves[J].Journal of Fluid Mechanics,1989.205:135-161

猜你喜欢
模拟海面波浪
波浪谷和波浪岩
波浪谷随想
去看神奇波浪谷
海面上的“一千座埃菲尔铁塔”
一个高分子模拟计算网格的作业管理
工业机器人模拟仿真技术在职业教育中的应用浅析
浅析柔道运动员的模拟实战训练
虚拟机局域网组建技术应用初探
波浪中并靠两船相对运动的短时预报