史长安,艾 波,付 帅,史绍雨
(1.山东科技大学 海岛(礁)测绘技术国家测绘局重点实验室 青岛市 266590;2.国家测绘局卫星测绘应用中心 北京市 100039)
海洋环境的三维动态可视化一直是海洋学和计算机图形学领域的研究热点,其中的关键技术问题是仿真动态海面的生成,重点需要考虑光照和大气环境对海表面的影响,包括光线在海表面的反射与折射等[1]。Fournier 和Reeves[2]基于深海小振幅建立了一个简单的海浪模型,Mastern 等[3]提出了一种利用傅里叶变换来合成一块水波区域的方法。徐利明等[4]对开阔海面深水域由风引起的海浪进行定量分析,利用海浪频谱与方向谱进行海浪模拟,基于OpenGL 实现了对海洋场景的实时显示。这些研究方法虽然可以达到较好的可视化效果,但采用的模拟方法比较复杂,算法运算量较大,在实际应用中对系统图形硬件要求较高。此外,这些研究在海洋可视化中缺少对流场等海洋要素的动态表达。
针对上述问题,基于微软的新型游戏开发平台XNA Studio,进行三维海洋环境动态可视化方法研究。XNA Studio 是一个高层次的三维视景开发软件环境,它提供了便捷的工具和图形API 以实现复杂的底层图形操作,从而大幅减少了源代码的开发量,显著提高了开发效率。这里的可视化方法中主要包括动态海面和洋流矢量场动态可视化,实现方法相对简单,但可以达到良好的可视化效果,对系统硬件要求不高。其中,动态海面可以反映出海面的高低起伏以及海面的反射、折射情况;洋流矢量场动态可视化可以表现出洋流的流速、流向。此外,为了更全面地观察海洋环境,论文提出了AUV 场景漫游方法,解决了场景漫游中的关键问题。
要表现具有真实感的海面,不仅要有海面高低起伏的形态,还需要与实际相符的海面颜色。海面类似一面镜子,可以反射周围的景象,另外,海水是部分透明的,透过海面,可以看到海底下面的景色。因此,海面最终的颜色是由折射颜色和反射颜色叠加产生的。
海面的折射颜色从一张纹理图片中取得,这张纹理图片的颜色由海面之下的景物决定,需要去除海面之上景物颜色的影响,论文中通过设置裁剪平面来实现。具体实现步骤如下:
1)将平面系数转换为逆相机矩阵空间。所有裁剪操作都是在硬件中进行,相对于平面的顶点已经在相机空间坐标中。在根据系数创建平面前,需要将平面系数转换为逆相机矩阵空间,这个相机矩阵是世界矩阵、视距矩阵和投影矩阵的组合。
2)确定平面的法线方向和距离。创建一个平面,需要知道法线方向和距离。法线表示平面的朝向,距离表示到(0,0,0)点的距离。由法线和距离可以唯一确定一个平面。
3)创建裁剪面。首先将法线归一化,然后创建一个平面系数,XNA 就可以根据这个系数创建一个裁剪平面。
4)激活平面。激活平面后,将自定义渲染目标作为当前渲染目标并清除它。然后,将地形添加到渲染目标中(只有海面之下的部分需要绘制)。
5)关闭裁剪平面,将渲染目标内容绘制到折射纹理图片。
在将水面反射景物绘制到纹理的过程中,需要重新定位相机,相机的位置是这样确定的,X和Z 坐标相同,而Y 坐标关于水面对称,如图1所示:
图1 水面镜像
从图中可以看出,A 点代表真实的视点位置,B 点是A 点关于水面的对称点。这表示从相机A 看到的颜色与从相机B 看到的颜色应该是相同的[5]。实验中需要将相机B 看到的场景绘制到一张纹理中。另外,如上图所示,海面之下的地形遮挡了部分相机视线,可以用折射贴图裁剪平面的方法解决这个问题。绘制反射贴图的步骤如下:
1)计算相机矩阵和视点目标的位置。相机B 的x 和z 坐标与相机A 的x 和z 坐标相同,相机A 和水面间的y 坐标和相机B 与水面间的y 坐标相同。据此,可以求得反射相机B 的位置。同样方法,可以求得相机B 的观察目标位置。
2)定义相机的向上向量。叉乘相机B 的向前向量和向右向量,获取相机B 的向上向量。
3)利用相机B 的位置、观察目标和向上向量定义视图矩阵,绘制反射贴图。
在得到了折射贴图和反射贴图后,要使海面看起来真实,还需要高低起伏的海面。可以用正弦波来产生高低起伏的海面,但单纯的一个正弦波会让海面看起来太过于理想化,缺乏真实感,因为每个波形都是一样的[6-7]。在考虑了GPU 的并行能力后,决定用4 个正弦波叠加来产生波浪。对每个正弦波设置不同的波长、波速和振幅,叠加后会产生比较真实的海面。
论文中实现波浪效果的步骤如下:
1)使用顶点位置作为正弦函数的一个参数,这个参数与波的传播方向相关。当这个参数增加时,会形成在-1 到1 之间的波形。
2)在参数中添加时间,使水波移动。将波速变量乘以当前时间,定义每列波的波速,让某些波比其它波运动的更快或是更慢。
3)为了使海面更真实,需要在水面上添加凹凸映射,在大的海浪上再增加一些小的逐像素的涟漪。然后使用菲涅耳项调整最后结果,使像素着色器在深蓝色和反射颜色之间进行插值。
本文实现的海面仿真可视化最终效果如图2所示:
为了表现洋流矢量场动态变化,通过运动箭头表现洋流的方向和速度。在加载了洋流速度、
图2 动态海面可视化
方向数据后,还需要进行一系列的转化与计算,才能正确的显示洋流矢量场。
在三维坐标系下,流场箭头模型在XZ 平面运动,要表达流场方向需要对箭头模型进行三维图形变换,设流场角度为α,箭头模型坐标为P(x,y),模型缩放比例为Scale,则图形变换矩阵可由如下公式计算得到:
洋流是按一定速度运动的,要真实的表现流场,需要真实的表现出洋流速度的变化。通过箭头模型颜色和移动步长表现洋流速度。在加载了洋流速度数据和方向数据之后,将速度分成10个等级,每个等级用不同颜色的箭头模型表示。箭头的移动位置由速度和方向共同决定。要确定模型下一时刻的位置,需计算模型在X 方向和Z方向的改变量,如图3 所示。
图3 运动箭头可视化
实现过程分为以下3 步:
1)通过洋流方向求出单位向量在X 轴、Z轴的改变量,即:X′=sin α;Z′=cos α。
2)通过洋流的运动速度得到洋流在X 轴、Z轴的改变量,即:dX=X′v;dZ=Y′v。
3)通过X、Z 轴的改变量,求得洋流新位置的x、z 坐标:x=x1+dX=x1+X′v;z=z1+dZ=y1+Z′v,其中x1、z1 是洋流上一时刻的位置。流场动态可视化的效果如图4 所示:
图4 流场动态可视化
在三维海洋环境可视化中,为了更好地查看场景中的要素,观察要素的变化,需要根据用户设定的路线,对场景进行漫游。AUV 场景漫游首先需要设定漫游路线,设定路线时通过在场景中点击添加关键节点,设定路线完成后,通过贝塞尔曲线平缓漫游路径,然后开始漫游,漫游分为艇内漫游和艇外漫游,在漫游过程中需实时进行碰撞检测,调整AUV 的姿态,直至整个漫游路径的完成,工作流程如图5 所示:
要顺利完成场景漫游,需要解决的关键问题是曲线平滑。在设定漫游路径完成后,如果AUV按设定的路线行驶,在曲线拐弯处,会出现急速转弯的现象,影响观察效果。为了解决这个问题,用贝塞尔曲线对路径进行平滑,达到了理想的漫游效果。
图5 AUV 场景漫游流程图
贝塞尔曲线最初由Paul de Casteljau 于1959年运用de Casteljau 算法开发,以稳定数值的方法求出贝塞尔曲线。论文采用二次贝塞尔曲线对路径进行平滑。二次方贝塞尔曲线的路径由给定点P0、P1、P2的函数B(t)追踪:
为构建二次贝塞尔曲线,可以中介点Q0和Q1作为由0 至1 的t:
1)由P0至P1的连续点Q0,描述一条线性贝塞尔曲线。
2)由P1至P2的连续点Q1,描述一条线性贝塞尔曲线。
3)由Q0至Q1的连续点B(t),描述一条二次贝塞尔曲线。
二次贝塞尔曲线的结构如图6 所示:
图6 二次贝塞尔曲线结构图
论文对路径进行平滑的效果如图7 所示:
基于微软的三维图形开发平台XNA Studio,进行海洋环境动态可视化方法研究,实现了动态海面仿真和流场动态可视化,并提出了基于贝塞尔曲线的AUV 水下漫游路线平滑方法,解决了场景漫游中的关键问题。其中,动态海面可以反映出海面的高低起伏以及海面的反射、折射情况;洋流矢量场动态可视化可以表现出洋流的流速、流向。本方法实现相对简单,但可以达到良好的可视化效果,对系统图形硬件要求不高,适用性较好。
图7 贝塞尔曲线平滑
[1] 明德烈,徐秋程,李向春.面向全球应用的海洋仿真系统的实现研究[J].系统仿真学报,2012,24(8):1741-1745.
[2] Alain Fournier,William T.Reeves.A Simple Model of Ocean Waves[J].Computer Graphics,1986,20(4):75-84.
[3] Gary A Mastin,Peter A Watterger,John F Mareda.Fourier Synthesis of Ocean Scenes [R].IEEE CG&A.USA:IEEE,1987:16-23.
[4] 徐利明,王瑞臣,马暄.基于海浪谱的实时海洋场景仿真[J].计算机仿真,2013,30(6):409-413.
[5] 印桂生,王海玲,张菁,等.分形算法调和的海浪模拟方法[J].哈尔滨工程大学学报,2011,32(17):1496-1500.
[6] 俞聿修.随机波浪及其工程应用[M].第3 版.大连:大连理工大学出版社,2003:131-137.
[7] Henry D.On Gerstners water wave[J].Journal of Non-linear Mathematical Physics,2008,15(2):87-95.
[8] 陈小龙.AUV 水下地形匹配辅助导航技术研究[D].哈尔滨:哈尔滨工程大学(博士学位论文),2013:25-27.