施松波
(武汉数字工程研究所 武汉 430074)
随着计算机网络技术和虚拟现实技术的发展及应用,虚拟战场的提出和应用推动了军事仿真演练的发展,为推动军事仿真训练和演练技术的发展提供了新的途径。虚拟战场是利用虚拟现实技术生成虚拟作战自然环境,并在保证其一致性的基础上,通过计算机网络,将分布在不同地域的虚拟武器仿真平台联入该自然环境中,进行战略、战役、战术等想定演练的分布式交互仿真应用环境[1]。虚拟战场环境建立在数字地图的基础上,在大区域虚拟战场环境研究中,需要大规模的地理数据源作为基础,从而对数据进行存储、查询、分发等操作,因此三维地形数据模型和可视化是虚拟战场环境中最核心和最关键的技术。目前,这方面的研究己经成为数字地球、地理信息系统(GIS),数字摄影测量、虚拟现实(VR)等领域的核心内容。本论文的研究目标就是通过高效地组织地形数据,保证在虚拟战场环境下实现大规模地形的无缝漫游和场景的高度真实感显示[2]。
Google Earth、World Wind、SkylineGlobe、EV-Globe、GeoGlobe是国内外技术成熟的地形数据处理商业软件,虽然提供了简单的二次开发函数接口或部分开源代码,支持用户将本地数据和模型加载到数字地球模型等简单的应用开发中。但也存在许多不足之处,比如只能使用单一的软件默认的数字地球数据,无法集成不同格式数字地球数据;开发模式简单,无法满足用户多方面需求,不够灵活;渲染效率低、传输效率低[3]。
本文选择开源数字地球软件osgEarth进行大规模场景数据的组织管理与可视化。OpenScene-Graph(OSG)是一个高性能的开源三维图形引擎,它以OpenGL为底层平台,使用C++编写而成,可以运行于各种主流操作系统,其功能特性涵盖了大规模场景的分页支持,多线程、多显示的渲染,粒子系统与阴影,各种文件格式的支持,以及对Java、Perl、Python等语言的封装[4]。OSG 广泛应用于虚拟仿真、虚拟现实和工程可视化等领域。osgEarth[1]是一个基于OSG开发的实时地形模型加载和渲染工具,它可以直接从网络上的服务器端读取数据,并实时地进行处理和显示[5]。它支持WMS、WCS、TMS等多种地图数据服务器端,自己则作为一个不断获取和解析数据的客户端,它还可以和Google map、Yahoo map、ArcGIS Online等数字地球服务器建立连接并从中获取所需要的数据。
大规模场景数据的组织管理与可视化可以分为四个层次:osgEarth读取数据、创建数字地球虚拟场景、动态调度和虚拟场景漫游,大规模场景可视化流程图如图1所示。
图1 大规模场景可视化流程图
osgEarth读取数据:osgEarth本身包含了获取多种网络数据的各种插件,通过这些插件,osgEarth可以直接从网络上的服务器获取数据,包括WMS,WCS,TMS等多种地图数据服务器,各种数字地球数据如Google Earth、World Wind、ArcGIS Online、MapServer和ESRI ArcGIS Server发布的GIS数据等,作为虚拟场景的建模数据。
创建数字地球虚拟场景:处理本地影像数据和三维模型,以加快后续的数据读取和渲染速度。然后在底图上叠加本地数据以增加虚拟场景的细节和层次。并进行一定的交互开发,比如漫游、查询、标绘、量测等功能。
· 动态调度:利用磁盘缓存技术对本地磁盘存储数据进行访问,利用内存缓存技术管理场景数据的动态缓存,负责缓存数据的管理和调度,从而实现场景图的动态管理和场景数据的动态加载和卸载。
· 场景漫游:用户可以通过网络获取建设好的虚拟场景数据,从而可以漫游虚拟场景并进行一些交互来获取一定的信息。
由于三维对象的渲染要消耗很多的系统资源,所以对大量精细三维对象的渲染速度会比较慢[6],为了解决这一困难,采用细节层次模型技术,即对三维对象进行分层管理,在远端观察地球时对象较多采用颗粒度较大的粗糙模型,在近端观察地球时对象较少采用颗粒度较小的精细模型,这样既能满足从远至近从模糊到清晰的视觉效果,又能极大地提高系统的效率。当用户视点移动时,视点范围内的地形数据就应该加载,距离视点很远或在视域范围之外的数据就可以暂时卸载。
osgEarth采用动态四叉树LOD方式进行地形数据的组织[7]如图2所示,图中每一个正方形为四叉树的一个节点,每个节点保存了中心点的高度及瓦片宽度。地形数据被实时地划分为不同LOD层次瓦片序列,基于视点进行动态分页、调度和渲染。整个地形场景是一棵瓦片化地四叉树,四叉树低层次(低经度)的影像是从高层次(高精度)的影像上实时重采样获取的。
图2 多分辨率地形四叉树表示示意图
瓦片的大小:长与宽是2的N此幂,DOM通常采用128×128(pixel)或256×256(pixel);DEM通常采用16×16(pixel)或32×32(pixel)。瓦片的格式:DOM一般采用png、jpg格式;DEM一般采用tiff格式。瓦片代理的地理范围:每一层中的各个瓦片所表示的地理范围相同,不同层的瓦片所表示的地理范围不同。第0层中瓦片表示的地理范围为180°×180°,第1层中瓦片表示的地理范围为90°×90°,第2层中瓦片表示的地理范围为45°×45°,依次类推。瓦片标志:每一层中的瓦片是以行、列坐标进行标志。瓦片文件组织:针对某个DOM(或DEM),其瓦片文件以分级的一系列文件夹来组织,文件夹结构为:顶层目录\层目录\列目录\tiles文件。瓦片索引:由于每一个瓦片都有对应的地理范围,并且都有相应的索引号(层、行、列),在三维场景中进行数据浏览时,可以根据视点的可视范围确定需要调用的瓦片。
osgEarth提供了一系列插件,用于实时地进行全球数据的剖分。GDAL/OGR插件支持多种格式的栅格和高程数据,可以实时地从网络上或本地读取GeoTIFF、ECW、MrSID等类型的地理空间数据。AGGLite、Feature Stencil等插件读取多种矢量数据,还具有把矢量数据栅格化为小图片块,把数据覆盖在地形图上等功能。插件在读取数据的同时按照全球网络剖分原理对读取的数据进行分层分块,同时把剖分结果缓存到本地,以后直接调度,提高效率。
osgEarth使用简单,一个简单的XML配置文件可以组织基于球面的全球地理数据,并调用osg-Viewer显示出来。osgEarth支持有多个图像源的地图,允许用户创建地图时,在基础层上覆盖高分辨率的地图。
上述地图使用本地数据源(使用GDAL插件)提供的两个图像。osgEarth使用各种方法来渲染图像层,所以可以渲染多少图像层的限制取决于用户的硬件。顺序是很重要的,定义多个图像源时,它们在该earth文件中指定的顺序是从在底部到顶部的。
添加高程数据到地球的文件与添加图像非常相似。高程数据可以通过将高程元素加入到XML从而添加到地球文件中去。定义多个高程数据顺序也很重要,它们在该earth文件中指定的顺序是从在底部(高分辨率)到顶部(高分辨率)的。
在地形场景实时动态显示中,每一帧场景的渲染数据对应于计算机内存中的几片连续分布的地形数据页面[8]。随着视点的移动,在地形场景动态渲染过程中,需要即时更新计算机内存中的地形数据页面。每次从计算机硬盘中读入新的地形数据到内存中会耗费一定时间,引起视觉上的“延迟”效果。为了提高实时渲染的效率,本文采用两级缓存的结构,设置磁盘缓存和内存缓存。场景图只与内存缓存发生直接联系,当场景图需要卸载数据时,将数据存入内存缓存,当内存数据过多时,内存缓存将部分数据写入硬盘缓存,当场景图请求某个内存缓存中没有的数据时,内存缓存从磁盘缓存加载数据。内存缓存尽量让经常使用的数据常驻内存。
在实现对场景图的缓存策略中,为了减少程序设计的复杂性,采用智能指针注册的方法。OSG中,大部分对象都继承自osg::Referenced类,该类记录了智能指针引用的次数,智能指针引用某osg::Referenced指针时,该指针的引用次数会增加,智能指针销毁时,引用次数会减少。本文采用数据项注册的方法来管理缓存。每当新加载一个数据块时,都要在内存缓存中以智能指针的方式注册。当场景图发生变化时,内存缓存遍历所有的注册项,检查其引用数,一旦引用数为1,说明该数据块已经被场景图卸载,因此可以将其写入缓存。
如图3所示,视点移动时,可视范围也发生变化,可视范围相对应的页面也发生变化。视点在地形场景漫游过程中是连续运动的,所以前后两帧之间显示的内容也是连续的,不会发生跳跃性变化,因此内存中的部分数据是可重用的,必须删除己经离开可视范围的地形页面数据,调入新的进入到可视范围的地形页面数据。
图3 地形场景漫游示意图
动态调度地形数据的过程如图3所示:视点t+1时刻向正北方向移动,视点移动的距离超过某一阈值(Y方向上阈值为DY/2),更新后台数据缓冲区中数据,将其最南边的一行数据块删去;视点t+2时刻继续向正北方向移动再超过一定阈值(Y方向上阈值为DY),新加入最北边的一行数据,同时开始交换内存缓存和磁盘缓存中的数据,从而可以保证视点的可视范围大小总是不变。视点在其它方向上发生变化时,处理方式与此类似。
利用以上方法,每次仅仅显示可视范围内数据页的数据,而与原始数据的范围、大小无关,就实现了任意范围的地形景观模型的实时动态渲染。
本文的DEM地形数据直接采用GTOPO30作为数字高程数据。GTOPO30是一个全球的数字高程模型,它覆盖西经180°至东经180°,南纬90°至北纬90°的所有区域。它的分别率为30s(即0.00833333°)由于该DEM数据为栅格数据,小于一个栅格的点被忽略(即面积小于1km2的小岛)。为了便于数据的分发,GTOPO30被划分为33个小的区域(Tiles)。
本文的纹理数据采用美国宇航局NASA提供的全球卫星图world topo bathy(分辨率为21600×21600×8)作为纹理数据。
由于全球数字高程数据是海量数据,不可能一次性读入内存并显示。本文根据实际需求引用与GTOPO30数字高程图覆盖范围相同的低分辨地形数据作为全球数据显示。然后在全球数据上创建视点的可视范围,即是图4中的局部数据,作为战术地图进行显示。通过可视范围四个角在世界坐标系中的地理坐标可以计算该视点的可视范围覆盖了哪些地形页面数据,并进行合理调度,实现在低分辨率全球地形图上显示局部高分辨率DEM数据[9]。
图4 局部多分辨率地形显示示意图
随着军队信息化程度的不断提高,军用数字地球的应用日益广泛。指挥员可以快速、完整、形象地了解战场上敌我双方各种宏观的和微观的情况,并能借助和充分发挥这些数据的作用,进行正确、有效的决策[10]。大规模场景地理数据可视化方法将地理数据形象、直观展现为战场信息,既体现出这些数据的内在联系,又便于检索利用,指挥员可以根据战场信息情况及时调整作战计划并为模拟训练与战况评估提供可视化的支持。
[1]康来,瞿师,杨冰,等.大规模GIS数据三维可视化系统设计与实现[J].系统仿真学报,2009,21(10):166-170.
[2]黎华.地形与地质体三维可视化的研究与应用[D].广州:中国科研院,2006.
[3]钟登华,宋洋.基于GIS的水利水电工程三维可视化图形仿真方法与应用[J].工程图学学报,2004(1):52-58.
[4]李新放.基于DSG的海洋环境三维可视化系统研究[D].青岛:国家海洋局第一海洋研究所,2012.
[5]邓晶,张明智,李志强,等.基于STK的信息作战态势三维可视化方法研究[J].系统仿真学报,2010,22(11):2654-2659.
[6]左维,刘阳,任鑫,等.基于嫦娥一号CCD相机和激光测距数据的月球三维可视化系统[J].计算机辅助设计与图形学报,2012,24(1):37-43.
[7]杨武年,廖崇高,等.数字区调新技术新方法-遥感图像地质解译三维可视化及影像动态分析[J].地质通报,22(1):60-64.
[8]李勃.虚拟海洋与三维可视化仿真引擎的研究与开发[D].青岛:中国海洋大学,2013.
[9]连明.三维数字地形动态调度及修改技术[D].西北:工业大学,2005.
[10]束搏,毛天露,等.一种基于采样点的大规模群体实时三维可视化方法[J].计算机研究与发展,2008,45(10):1731-1738.