地形平滑中瓦片高程数据的快速调度方法

2021-07-03 03:52朱俊洁陶伟殷明阳
现代计算机 2021年12期
关键词:瓦片高程顶点

朱俊洁,陶伟,殷明阳

(1.四川大学计算机学院,成都610065;2.中国舰船研究设计中心,武汉430064;3.中国核动力研究设计院,成都610041)

0 引言

近年来,随着“数字地球”这一概念的提出[1],大规模地形可视化[2]在战场仿真、战场态势推演、虚拟现实等诸多领域得到了广泛的应用。数字地球在世界各地覆盖高分辨率的遥感影像,并通过建立覆盖全球的数字高程模型和地球景观模型,形成虚拟地球。地形数据以数字高程模型(DEM)为基础,实现地形的数字仿真,通过LOD 分层、四叉树分块全球剖分建立骨架。地形分块的过程中,地形块边界顶点的法向量只通过每个地形块含有的数据信息进行计算,所以相邻地形块重叠的边界顶点的法向量不相同,导致地形瓦片边界无法平滑过渡,从而降低了三维地形的真实感。

数字地球平台OSGEarth 通过在地形引擎中提供normalizeEdges 的选择,解决了地形块边界顶点法向量不一致的问题。为了呈现真实的地形效果,渲染过程中需要调度大量高程数据和纹理数据。在大规模地形平滑过程中,OSGEarth 地形引擎对周围地形瓦片数据的调度次数过于频繁,会导致地形加载缓慢,极大地影响实时绘制的速度。

本文基于数字地球平台OSGEarth 提出了一种地形平滑过程中瓦片高程数据快速调度方法,通过对地形瓦片数据的高程值进行预处理,生成高程差值文件,从而减少了对周围地形瓦片的调度次数,能够有效地加快平滑地形的速度。

1 OSGEarth简介

OpenSceneGraph(OSG)是OpenGL 开发的开源三维渲染引擎。其核心功能主要包括场景管理和图形绘制[3]。OSG 在虚拟现实、战场仿真、三维数据可视化等领域之中有着非常广泛的应用。OSGEarth 是一个基于标准C++和OSG 3D 渲染引擎的开源软件开发工具包,用于地形生成、模型数据加载和渲染。它可以从网络或本地获取地形数据和图像数据,并实时优化、构建和显示,支持多个数据源的加载和管理[4]。OSGEarth 使用一种基于XML 格式的配置管理文件,可以从系统外部读取本地文本文件加载地球数据,开发人员可以手动配置文本文件来加载所需的数据,具有很强的灵活性。用户添加的数据通过不同的场景层进行加载和调度,便于数据管理。OSGEarth 提供了一种数据缓存机制。OSGEarth 可以将第一次加载的数据以缓存的形式保存到本地,第二次加载时先读取缓存的数据,提高了数据加载的效率。

OSGEarth 通过加载不同的数据源驱动程序来加载数据源的。例如,调用GDAL 驱动程序进行影像加载和DEM 数据处理;基于TMS 协议,调用TMS 服务加载瓦片数据[5];调用ArcGIS 驱动程序加载和显示ArcGIS服务器所发布的数据。另外,OSGEarth 具有很强的可扩展性,开发人员可以基于OSGEarth 编写所需的数据源驱动程序来加载相应的数据。

2 LOD算法

为了实现大规模地形数据的实时可视化,目前的研究热点主要包括大规模数据块的数据调度、网格简化、裂缝消除和视图裁剪,其中,细节层次模型(Level Of Detail,LOD)[6]是近年来学者们的一个重要研究方向。在海量地形和模型数据的浏览方案中,经常采用LOD 对其进行划分。细节层次(LOD)是提高模型显示速度和降低场景复杂度的有效方法。LOD 根据对象模型节点在三维环境中的位置和重要性,确定了对象绘制的资源分配,减少了非重要对象的细节,从而加快了场景的绘制。同样,由于人眼视觉特性的影响,物体在不同位置的细节程度是完全不同的。根据人眼视觉差异的特点,LOD 技术将场景中同一物体按照不同的细节层次建立一组几何模型[7]。在进行场景渲染的过程中,根据不同对象的位置,选择具有相应细节级别的模型来加载场景。也就是说,当视点靠近对象时,模型的精细部分被加载到视图中;反之,当视点远离对象时,粗略模型部分被加载到视图中。

3 地形数据高程值预处理

3.1 高程数据的获取与组织

数字高程模型DEM(Digital Elevation Model)[8]是一个实体地面模型,以有序值数组的形式表示地面高程。它主要是描述区域地貌形态的空间分布,通过等高线或类似的三维模型进行数据采集,然后进行数据插值形成。通过STRM(Shuttle Radar Topography Mission),即航天飞机雷达地形测绘任务会,本文获取了格式为GeoTiff 的全球高程数据,高程数据集共3.8G。

由于高程数据量大,需要将地形数据分割成矩形块数据,然后根据不同的级别和区域进行命名,然后存储在相应的cache 文件夹中。每个地形瓦片数据包含17×17 个像素点,以从左往右、从上到下的顺序存储了289 个数据。在3D 环境下加载高程数据时,可以通过缓存索引文件直接加载到相应的地形瓦片数据中。这种方法可以大大提高海量高程数据的加载和浏览效率[10]。OSGEarth 使用动态四叉树LOD 来组织地形高程数据。数据被分成不同层次的瓦片序列。层间数据采用四叉树数据结构,类似于金字塔形状。

金字塔模型如图1 所示。

3.2 读取地形高程数据

GDAL 是一个优秀的开源库,它为读取、写入、转换和处理光栅数据格式提供了标准的二次开发接口,并且是一个完全开放的源代码,它为开发人员进行二次开发和底层功能扩展提供了一个高起点[9]。获取到地形高程数据后,使用GDAL 栅格空间数据转换库读取地形瓦片数据的高程值,并调整高程数据的存储顺序,确保高程值的存储顺序和加载瓦片数据时读取高程值的顺序相同。读取地形瓦片数据高程值的核心代码如下:

3.3 生成高程差值文件

记需要进行平滑处理的地形块为中心地形瓦片c,使用GDAL 读取中心地形瓦片数据及其周围地形瓦片数据的高程值,周围地形瓦片数据的高程值包括和中心地形瓦片据同一LOD 下的西北方、北方、东北方、西方、东方、西南方、南方和东南方单元的地形瓦片高程值。将中心地形瓦片的西北方、北方、东北方、西方、东方、西南方、南方和东南方单元地形瓦片分别记为nw、n、ne、w、e、sw、s 和se。

每个地形瓦片数据包含17×17 个像素点,因此中心地形瓦片每条边上有17 个边界点。中心地形瓦片边界点与周围地形瓦片近边界点的对应关系如图2 中虚线所示。

图2 边界点与近边界点对应关系示意图

按照中心地形瓦片边界点与周围地形瓦片近边界点的对应关系,计算周围地形瓦片近边界点和中心地形瓦片边界点的差值。每个高程差值文件存放72 个浮点数类型的高程差值数据,共占用288 个字节。根据不同的LOD 级别和区域对高程差值文件进行命名,存储在相对应的文件夹中。

4 调度高程数据及平滑地形

4.1 地形平滑原理

要使光照应用到地形上,首先需要计算法线。法线是定义表面对光的反应的向量,即它是如何被照亮的。表面的光照强度与光线方向和法线之间的角度成正比。角度越小,表面看起来越亮。OpenGL 中可以定义为面法线和顶点法线。如果定义了面法线,那么法线通常被定义为正交于这个面的向量。与这个面共面的两个向量叉乘的结果即为正交于面的法向量。另一个必要的步骤就是对向量进行归一化,即使其成为单位长度。归一化需要计算向量的长度,再除以每个分量的长度。

在大规模地形可视化中,每个地形分块的法线不同,不同方向的面的亮度之间有明显的差异,导致地形看起来不平整。为了使地形更平滑,必须计算每个顶点的法线,而不是每个面的法线。当计算一个顶点法线时,必须考虑所有共享该顶点的面。如图3 所示,每个面的顶点(不包括角落和边界顶点)都由四个多边形共享。因此,这个顶点法线应为所有共享面法线的和再归一化的结果。

图3 中心顶点的法线与共享面关系

图3 中,v表示中心顶点的法线。vij表示每个共享面的法线。如v12是右下方面的单位长度的法线。顶点法线v被计算作为所有vij向量归一化后的和。

4.2 基于OSGEarth调度高程值及平滑地形

OSGEarth 在平滑地形的过程中会调度周围瓦片的所有数据,而高程差值文件只保留了平滑地形需要的点的高程数据,能够避免调度过多地形瓦片数据,因此能够加速平滑过程。本文的算法首先在OSGEarth 中加载中心地形瓦片数据,中心地形瓦片记为c。通过中心地形瓦片c 的编号调度其对应的高程差值文件,读取高程差值文件。通过高程差值和边界点高程值求和算出c 周围一圈点的高程值,即c 以外的西北方点、北方点、东北方点、西方点、东方点、西南方点、南方点和东南方点地形高程值。然后,通过获取的地形高程值修改NDC 坐标(标准化设备坐标)的Z 坐标。

获取到NDC 坐标后,需要进行坐标系转化。首先,将NDC 坐标转换为模型坐标。模型建立坐标系以物体的中心为坐标原点,物体的旋转、平移等操作都在模型坐标系内进行。然后将模型坐标转换成ECEF 坐标(地心地固坐标系),也就是OSGEarth 用于渲染图像的坐标系。在地心坐标下,计算中心地形瓦片边界点相关三角面片的法向量。最后,对中心地形块边界点上的法向量进行归一化处理,以快速平滑地形。

5 实验结果

为了验证该方法能快速平滑地形,本文进行了相关实验。实验的硬件平台CPU 为AMD A8-4500M APU with Radeon HD Graphics 四核,内存为8GB,显卡型号为AMD Radeon HD 7640G,开发工具为Visual Studio 2010,该实验渲染时的屏幕窗口大小为1024×768。测试数据为经纬度在(85.07,28.49)附近地块。

地形渲染效果的对比如图4a~图3c 所示。图4a是没有经过平滑处理的地形场景,图中的圆圈标明了其中的一个分界线。图4b 是OSGEarth 所用算法平滑后的地形场景。图4c 是本文算法平滑后的地形场景。比较而言,地形未平滑时会产生明显的分界线,经过OSGEarth 所用算法和本文所提出的算法平滑后,分界线的问题得到了很大的改善,能够平滑过渡,两种算法的渲染效果并不存在明显差异。因此,本文的算法能够有效地解决地形渲染时出现的不平整问题。

图4 渲染截图

表1 给出了算法的平均耗时对比。

表1 算法的平均耗时对比

从表1 中可看出,当平滑同样数量的地形瓦片时,本文所提出算法相比于OSGEarth 地形调度算法耗时更少,能够快速平滑地形。

6 结语

本文介绍了OSGEarth 和LOD 算法,通过对地形数据高程值预处理,基于OSGEarth 实现大规模地形下高程数据的调度。在保证渲染效果的前提下,由于减少了地形平滑过程中大量不必要的数据调度,可以达到快速平滑地形的效果。实验结果表明,本文提出的方法与OSGEarth 平滑后的结果没有明显区别,但加载同样数量的地形瓦片,能够明显缩短调度耗时。本文的算法能够有效地提高地形瓦片的渲染效率,增加用户的沉浸感。

猜你喜欢
瓦片高程顶点
红树林宜林地滩面高程及潮水退干时间时长的测量方法
场景高程对任意构型双基SAR成像的影响
打水漂
8848.86m珠峰新高程
乡村瓦语
惯性
基于二次曲面函数的高程拟合研究
“图形的认识”复习专题
删繁就简三秋树
数学问答