基于WPF的大规模地形可视化系统设计与实现

2016-12-28 08:48渠涧涛陈小潘赵亚萌杨伟峰
地理空间信息 2016年12期
关键词:瓦片列表顶点

渠涧涛,陈小潘,赵亚萌,王 鹏,杨伟峰

(1.河南大学 计算机与信息工程学院,河南 开封 475004;2.中国科学院 遥感与数字地球研究所,北京 100012)

基于WPF的大规模地形可视化系统设计与实现

渠涧涛1,2,陈小潘1,赵亚萌2,王 鹏1,2,杨伟峰1,2

(1.河南大学 计算机与信息工程学院,河南 开封 475004;2.中国科学院 遥感与数字地球研究所,北京 100012)

针对大规模地形可视化的需求,设计并实现了基于WPF的大规模地形可视化系统。阐述了虚拟地球、瓦片金字塔结构、数字高程模型的基本原理及在系统中的应用,设计了基于游戏循环的可视化框架,实现了自由摄像机、瓦片模型调度、瓦片模型生成等关键功能。实验表明,该系统能够实时、准确地实现大规模地形的可视化,具有较高的应用价值。

大规模地形可视化;WPF;游戏循环;海量地形数据;地形瓦片模型

随着计算机图形显示技术以及图形硬件处理能力的不断提高,大规模地形可视化在地理信息系统、游戏开发和飞行器辅助设计等领域的应用越来越广泛[1-3]。目前大规模地形可视化软件大多基于国外的平台软件开发[4-6],如NASA的World Wind,Esri公司的Arc Engine,Skyline公司的Terra Explorer Pro等。也有研究人员尝试从底层开发,实现大规模地形可视化[7-8],但大多采用OpenGL、DirectX等底层图形库来编写,开发周期长,维护困难。WPF是微软开发的新一代图形显示技术,其核心是一个与分辨率无关且基于向量的呈现引擎,能够充分利用现代图形硬件的优势[9],提升可视化展示的效果,对三维开发常用的3D摄像机、三维模型等内容都有很好的封装,可以有效缩短开发周期。

本文设计并实现了一个基于WPF的大规模地形可视化系统,该系统能够展示指定地理位置真实的地形地貌,还提供了丰富的摄像机操作,支持对三维地形的全方位浏览,并能根据用户请求动态、实时地更新三维场景。

1 基本原理

1.1 大规模地形数据

地形数据能够表现地球表面的高低起伏状态,是具有高程信息的数据。遥感数据含有丰富的地理环境信息,是地形数据的主要来源。随着航空航天遥感技术的不断发展,遥感数据的获取速度也随之加快,数据精度不断增加。每提高1倍地形数据的分辨率,对应的数据量就会增加4倍[10]。在这种背景下产生的大规模地形数据不仅数据量大,还具有覆盖地域广、数据精度高的特点,例如本文所使用的SRTM(shuttle radar topography mission)数据,覆盖了北纬 60°~南纬56°之间80%的陆地地表面积,数据总量高达12 TB[11],分辨率有30 m和90 m 两种,本文采用的是90 m分辨率的数据。

1.2 虚拟地球模型

传统的大规模地形可视化系统大多将地形模型放在一个平面上展示,这种方式不能真实反映地形的地理位置,为海量地形数据的存储、组织及加载增加了难度,不利于大规模地形的展示,也使可视化场景缺乏真实感,降低了用户体验。因此,需要构建一个虚拟的地球模型作为大规模地形可视化的展示平台。

本文采用经纬度网格和WGS84坐标系构建虚拟地球模型。首先,将WGS84坐标系定义的地球参考椭球面按照经纬线进行剖分,然后计算各个顶点网格的经纬度坐标和纹理坐标,并将各个顶点的经纬度坐标按照公式(1)~(3)转换为三维空间直角坐标[12]。

式中,λ、φ、h分别代表经度、纬度和高程;x、y、z分别是空间坐标系X轴、Y轴和Z轴的坐标,N=a=6 378 137.0 m(赤道半径);b= 6 356 752.314 2 m(极点半径);e=8.181 919 084 262 2×102(离心率),利用WPF技术绘制顶点并添加贴图,完成虚拟地球模型的构建,并基于该虚拟地球模型实现大规模地形的可视化。

1.3 World Wind瓦片组织模型

大规模地形可视化中所使用的纹理数据、高程数据大多是跨度大、分辨率高的地理信息数据,数据量大,不能全部存储在内存中[13]。为了提高地形场景的渲染效率,本文依照World Wind瓦片金字塔结构进行地形数据的切分。

World Wind瓦片组织模型以地球360°经度和180°纬度为标准,以纬度为-90°、经度为0°的点为起始点,将整个地球划分网格[14]。在构建瓦片金字塔时,首先将原始数据设置为最高层,之后每降低一个层级就将前一层级2×2个像素点合并成为一个像素点,如此反复,构建出瓦片金字塔[15],任何一张瓦片都可以用这张瓦片所在的层级、列号、行号唯一确定。World Wind的瓦片组织模型如图1所示。

图1 World Wind的瓦片组织模型

切分后的地形数据可以按照 “D:Root433_2.abc” 的形式存储在本地,该路径所代表的含义是“磁盘根目录数据根目录层级行号行号_列号.后缀名”。瓦片的层级、行列号与经纬坐标存在对应关系。通过计算可以实现瓦片的层级、行列号与经纬度区间的相互转化,转换公式如式(4)~(7)所示。

式中,lat和lon分别代表纬度和经度;row和col分别代表瓦片所在的行和列,lztd为第0层瓦片的分割度数(一般为36°)。

2 基于游戏循环的可视化框架设计

游戏循环能够根据输入、AI(artificial intelligence)或其他主观逻辑来确定游戏下一阶段的行为,其任务是调用其他逻辑函数,并核查某种条件是否已满足[16]。本文设计了一种基于游戏循环的框架,框架的基本思想是:将实现可视化的各个函数放在一个主循环中,实时监听场景信息的变化,并根据场景信息的变化动态更新三维场景。

本文提出的可视化框架主要分为3个模块:用户接口、场景更新、场景重构。其中,用户接口用于接收用户输入的信息,并根据输入信息更改摄像机状态、触发场景信息的改变,将实时的可视化结果呈现给用户。场景更新用于捕获改变的场景信息,并根据最新的场景信息对瓦片模型进行调度,生成新的瓦片模型列表。场景重构的主要作用是捕获模型列表的改变,并根据模型列表的变化生成新的瓦片模型或者删除旧的瓦片模型,实现三维场景的重构,具体框架如图2。

图2 基于游戏循环的可视化框架

利用该框架能够实时接收用户输入的信息,并根据硬件的性能按照一定的频率对三维场景进行更新,忽略一些不必要的变化细节,提升了程序的性能,稳定了三维场景的帧数,提升了展示效果。同时,循环执行的代码也能提高代码的重用率,降低代码的冗余度。

3 系统实现

基于WPF实现大规模地形可视化的主要功能包括自由摄像机、瓦片模型调度、瓦片模型生成。

3.1 自由摄像机

自由摄像机要求三维场景的摄像机能够根据用户键盘、鼠标输入的信息完成各种动作,实现对三维场景的自由浏览。自由摄像机的动作主要是由平移、纵倾、横摆、旋转等基本动作组合而成,具体操作如下:

1)平移。平移分为水平平移和竖直平移两种,水平平移改变视野中心的位置,竖直平移改变摄像机的海拔高度。由于本文的可视化是在虚拟地球上实现的,所以,水平平移实际上是由摄像机分别绕空间直角坐标系的X轴和Y轴的旋转组合来实现。当用户进行水平平移操作时,假设平移前后视野中心点的经纬度差值分别为Δlon和Δlat,将摄像机位置绕X轴旋转Δlon度、绕Y轴旋转Δlat 度,便实现了摄像机的水平平移,主要代码如下:

rotateAround=new Point3D(0,0,0);//旋转中心点为坐标原点

Vector3D relaPosition= rotateAround - CameraPosition;//构建原始摄像机位置向量

var q1 = new Quaternion(AxisX, Δlat);//利用四元数实现绕X轴旋转Δlat度

var q2 = new Quaternion(AxisY, Δlon);// 利用四元数实现绕Y轴旋转Δlon度

Quaternion q = q1 * q2;//将两个旋转操作组合起来

var m = new Matrix3D();

m.Rotate(q);//利用组合后的四元数构建一个旋转矩阵Vector3D

newRelaPosition = m.Transform(relaPosition);//利用旋转矩阵对原始摄像机位置向量进行旋转操作,得到平移后,最新的摄像机位置为(newRelaPosition.X, newRelaPosition.Y, newRelaPosition.Y)

竖直平移时,由于可视化过程是在虚拟地球上进行的,所以竖直方向从摄像机的位置出发指向地心。假设摄像机在竖直方向上的位移为d,竖直平移后最新摄像机的位置可以根据公式(8)计算出来:

式中,X、Y、Z为摄像机原始位置空间坐标值;X1、Y1、Z1为摄像机最新位置,Dx、Dy、Dz为竖直方向上的位移在空间坐标轴3个方向上的分量。

2)纵倾横摆。纵倾与横摆通过更改LookDirection向量的终点来实现,当终点在X轴上移动时能够实现横摆动作,当终点在Y轴上移动时便实现了纵倾动作。

3)旋转。旋转动作主要是根据用户输入将摄像机的UpDirection绕LookDirection旋转来实现。假设旋转角度为Δlat ,则根据以下代码执行:

用户可以通过鼠标、键盘等外设输入来控制摄像机完成以上3种基本动作,对这3种基本动作进行组合就能够实现对摄像机的各种控制。

3.2 瓦片模型调度

在大规模地形可视化展示中,场景信息的变化会改变屏幕所能观察到的经纬度区域。为显示该区域,可以通过建立同屏幕视域等大的边界盒(bounding box,BBOX)来对瓦片模型进行调度,主要步骤如下:

1)确定场景范围。根据边界盒的最大经度、最大纬度以及最小经度、最小纬度,得出边界盒的右上角坐标和左下角的经纬度坐标,利用公式(4)、(5)求出边界盒的右上角和左下角在World Wind的瓦片组织系统中的编号。并据此计算出包围盒内所有瓦片的编号,生成当前场景范围内所有瓦片的编号列表。

2)确定待加载/待删除瓦片列表。遍历步骤1中得到的当前场景范围内所有瓦片编号列表的副本,与上一场景所有瓦片编号列表作匹配,如果当前的瓦片在两个列表中都存在则两个列表都删除这个瓦片。遍历完毕后,副本列表中剩余的瓦片即为当前场景待加载的瓦片,这个副本列表即为新的待加载瓦片列表,上一场景瓦片编号列表中剩余的瓦片列表即为待删除瓦片,这个列表即为待删除瓦片列表。

3.3 瓦片模型生成

生成瓦片模型的基本思路是:将按照金字塔模型进行切分后的影像数据与目标区域的高程数据进行叠加,生成具有地形起伏的三维模型。主要步骤如下:

1)坐标系的转化。WPF提供MeshGeometry3D类构造三维模型,但该类仅支持传统的三维空间坐标系,而瓦片模型是在虚拟地球上生成的,所以模型中顶点位置和范围等参数都是由经纬度度量得到。因此,在生成瓦片模型的过程中,需要通过式(1)~(3)将地理坐标转化为三维空间坐标。

2)建立顶点索引。在绘制三角形网格时,相邻的三角形顶点会重复绘制。为了提高运行效率,减少重复绘制顶点造成的系统资源浪费,可以利用MeshGeometry3D提供的TriangleIndices属性为每个顶点指定唯一索引值。为三角形网格的所有顶点指定索引的方法如下:

图3 顶点索引

三角形网格是由多个正方形单元格构成的,每个正方形单元格的顶点索引如图3。三角网格t1由索引为index1、index2、index3的点构成,三角网格t2由索引为index2、index3、index4的点构成,假设该正方形单元格左上角的点在第row行、第col列,网格的大小为150×150,则index1、index2、index3、 index4的索引分别为然后将构成这两个三角网格的6个顶点索引按三角形构成顺序存入索引列表TriangleIndices中。最后遍历所有的行和列,指定整个三角形网格的顶点索引。

3)添加纹理映射。为了使瓦片模型能够真实地展示地形地貌特征,需要将瓦片所对应的瓦片影像数据作为纹理“贴”在瓦片模型表面。如果要保证每个网格点对应在纹理图像正确的位置,需要为构成瓦片模型的每个点指定纹理映射,对大小为150×150的顶点网格设图像的左上角为第0行、第0列,则第x行、第y列的顶点的纹理映射(u,v)为:

4)叠加高程数据。高程数据的样本数与瓦片的顶点数通常并不相同,因此需要对高程数据进行插值(本文采用双线性插值),生成一个与瓦片顶点一一对应的二维数组。在对顶点进行坐标转化时,将这个高程作为公式(1)~(3)中变量h的值代入,便实现了高程数据的叠加。

4 结果分析

系统在Visual Studio 2012环境下开发,测试的计算机硬件配置CPU为Intel(R) Core(TM) i7-2600 3.40 GHz(8 PUs)、内存为4 G RAM、显卡为GeForce GT 420,测试数据为北京昌平地区90 m分辨率的SRTM(shuttle radar topography mission)数据和相同地区的Blue Marble影像数据,并与目前广泛采用的World Wind进行对比试验。

4.1 可视化结果准确性分析

为了分析可视化结果的准确性,分别在本系统的可视化场景中和World Wind的可视化场景中选择两个参照点,如图4所示。同时记录下这2个参照点在本系统和World Wind中的经纬度坐标和高程值,如表1所示。

从表1的对比可以看出,在两个系统中相同参照点的经纬度坐标和高程值基本相同;同时观察图4可以发现,二者对目标区域的地形地貌展示结果完全一致,说明本系统所实现的可视化结果是准确的。

图4 可视化结果对比

表1 可视化结果对比

4.2 场景帧数对比

为了对比三维可视化过程是否流畅,分别使用本系统及World Wind实现测试数据的可视化,然后使视点在测试数据生成的三维场景中按相同的轨迹匀速移动。依照同样的时间间隔,分别记录三维场景每秒的传输帧数(frames per second, FPS),如表2所示。

表2 场景帧数对比

通过对比可以看出,本系统的FPS与World Wind的FPS相差不大,均超过系统流畅运行所要求的30 帧 /s,说明本系统实时的地形三维可视化运行流畅。

5 结 语

针对大规模地形可视化系统的需求,本文设计并实现了基于WPF的大规模地形可视化系统。WPF技术的运用,使得本系统具有更佳的影像展示效果和友好的用户界面,且WPF对3D开发相关技术的封装,使得系统的开发更加便利,能有效缩短开发周期。虚拟地球和World Wind瓦片组织系统的应用在增加可视化结果真实性的同时,提升了系统的可扩展性。基于游戏循环的可视化框架,使用户通过移动摄像机触发场景更新时,减少了不必要的处理过程,有效提升了程序的运行效率。实验表明,系统能够准确实时地对目标区域的地形数据进行可视化,且运行流畅,具有较高的实用价值,为利用WPF实现大规模地形可视化提供了新的思路。参考文献

[1] 闫佳,闫枫.基于XNA的地理信息系统的研究与实现[J].测绘与空间地理信息,2014,37(11):152-154

[2] 罗康.基于OpenGL的3D游戏场景编辑器的设计与实现[D].成都:西南交通大学,2014

[3] 任雨,朱谷昌,张建国,等.遥感图像三维可视化在低空磁测飞行辅助设计中的应用[J].遥感信息,2014,29(3):78-81

[4] 王方雄,马少君.基于ArcEngine的三维地形可视化系统设计与实现[J].地理空间信息,2011,9(3):38-40

[5] 李尔园,李洪平.基于World Wind的海洋数据可视化研究[J].地理空间信息,2015,13(2):25-27

[6] 郭钟哲,李晶,李茜.基于Skyline的渭河下游洪水演进模拟研究与系统实现[J].水利水电技术,2014,45(10):7-10

[7] 潘忠英.基于OpenGL的三维可视化方法研究[J].计算机与数字工程,2014,42(3):512-516

[8] 杨芳,黄明,王晏民.基于Direct3D的三维场景漫游系统设计与实现[J].测绘通报,2014(S1):182-186

[9] 蒲哲,朱名日.基于WPF MVVM的甘蔗种植管理系统[J].计算机与现代化,2014(2):110-114

[10] 霍旭光.基于云计算的大规模地形数据处理方法的研究[D].北京:中国地质大学,2013

[11] 张朝忙,刘庆生,刘高焕,等. SRTM 3与ASTER GDEM数据处理及应用进展[J].地理与地理信息科学,2012,28(5):29-34

[12] 凌东伟,李欣,朱美正.基于GIS的三维虚拟地球的研究与实现[J].计算机工程与设计,2007,28(19):4 774-4 777

[13] 申胜利,李华,刘聚海.基于ArcSDE的栅格数据存储与处理[J].测绘通报,2007(9):47-49

[15] 邹红霞,王文嘉.基于World Wind的WebGIS服务器研究与实现[J].计算机工程与应用,2011,47(8S): 432-438

[16] 朱留果,何卫红,阮晓雨,等.基于World Wind与无人机影像的三维场景重建与漫游研究[J].现代测绘,2012,35(5):48-50

[17] Christopher Griffith. 实战Flash游戏开发[M].北京:人民邮电出版社, 2012

P208

B

1672-4623(2016)12-0041-04

10.3969/j.issn.1672-4623.2016.12.014

渠涧涛,硕士研究生,研究方向为空间数据处理。

2015-08-06。

项目来源:高分重大专项资助项目(Y4D00100GF、Y4D0100038);中科院战略先导专项资助项目(Y1Y02230XD)。

猜你喜欢
瓦片列表顶点
过非等腰锐角三角形顶点和垂心的圆的性质及应用(下)
过非等腰锐角三角形顶点和垂心的圆的性质及应用(上)
打水漂
学习运用列表法
扩列吧
一种基于主题时空价值的服务器端瓦片缓存算法
惯性
列表画树状图各有所长
2011年《小说月刊》转载列表
数学问答