想象一下,如果我们能将全球地形一次性清晰地呈现在我们的电脑屏幕上,那将是怎样的场景?即使拥有比大多数人性能更强悍的电脑,也会忍不住说一句:“卧槽,卡死了”!那么,要在电脑中流畅地展示全球地形,这是一个怎样的挑战呢?然而,随着三维地形瓦片服务的出现,仿佛为我们打开了通往神秘世界的一扇大门,引领我们踏入其中,去探索那些隐藏的奥秘。
图片来源:网络
一、global-geodetic规则解密:揭秘地球'大卸八块'的组织奥秘
首先要明确的一点是,地球表面是个球体,即使地球表面的地形全部显示在电脑上,我们也无法同时看到地球的全貌。而且,随着显示的地球区域范围越大,需要显示的地形精度反而越小,此时显示高精度的地形数据无疑是“高射炮打蚊子”——小题大作。那么该如何做呢?那就不得不提一下——global-geodetic规则。
首先,我们必须明确一点:地球的表面是一个球体,即使将其全部显示在电脑上,我们也无法一览全貌。此外,随着显示范围的扩大,所需地形数据的精度反而会减小。在这种情况下,显示高精度地形数据就好比是“用高射炮打蚊子”——有些大题小做。那么,如何解决这个问题呢?这时候,就不得不提到global-geodetic规则。
global-geodetic规则的实现基于地球的几何特性和数据结构。这个规则的核心原理是将地球表面划分为经度和纬度网格,并运用四叉树数据结构来有序地组织和管理地形数据。
经纬度网格图 来源:百度图片
使用经纬度坐标系来表示地球上的点。基于WGS84大地坐标系,我们将地球表面划分为网格,形成以经度和纬度为坐标轴的网格系统。这种划分方式确保了在不同区域的地形数据分辨率相对均匀,同时也使得地球表面地形的表示得更加精确和一致。
global-geodetic规则原理示意图,来源:百度图片
采用四叉树数据结构来组织地形数据。四叉树是一种递归的数据结构,它将一个区域划分为四个子区域,并在每个子区域中再次应用相同的划分方法。这样一直递归下去,直到达到某个预定义的终止条件。与传统的四叉树不同的是,地球表面的0级瓦片有两个根瓦片,分别是东半球和西半球瓦片。通过构建四叉树地形金字塔,我们能够有效地管理大规模地形数据,并在不同级别上实现地形数据的分辨率适应。这种方法不仅能够支持全球范围的地形表示,还能够提供局部细节的有效支持。
四叉树分割地形示例图,来源:百度图片
采用{x}{y}{z}类型的方式获取地形瓦片数据。在global-geodetic规则中,我们将地球按经纬度投影的方式展开成一个平面坐标系。在这个坐标系中,以经纬度(-180,-90)为原点,沿着经纬度增加的方向,行列号依次递增。因此,地球上的任何一个位置,都可以通过该位置的经纬度坐标和需要显示的地形层级来计算出所在的地形瓦片行列号。根据计算得到的行列号和层级,我们可以以{x}{y}{z}类型的方式获取地形金字塔中相应的地形瓦片数据。例如,对于经纬度范围分别为[90,180]、[-90,0]的区域,可以通过类似于 "http://assets.agi.com/stk-terrain/world/tiles/1/0/0.terrain"的地址获取其1级地形瓦片。
图片来源:网络
二、解密地形数据格式:探索Heightmap和Quantized-Mesh格式的地形瓦片之谜
在了解了global-geodetic规则如何将地球“大卸八块”之后,我们来探讨一下单个地形瓦片数据的构成。目前,基于global-geodetic规则组织的瓦片主要有两种格式:Heightmap格式的地形瓦片和Quantized-Mesh格式的瓦片。
- Heightmap格式的地形瓦片
Heightmap格式的地形瓦片通过一个65*65像素大小的图块形式来表示一片地形区域。对于每个图块中的单个像素,它记录着一个16Bit大小的高度整数值。然后,通过以下计算规则来得到海拔值:
H = Pixel /5 - 1000
图块是按照每行自西向东、每列自北向南的顺序从左上角顺序排列。相邻瓦片之间有一行或者一列的重合,以确保相邻瓦片之间的高度值逐渐过渡,从而在加载相邻瓦片时不会出现明显的缝隙或断裂,使得地形呈现出更加平滑和连续的视觉效果。
相邻瓦片关系图,来源:术之多
- Quantized-Mesh格式的地形瓦片
Quantized-Mesh格式的地形瓦片与Heightmap格式有所不同,它采用了特殊编码的三角形网格。在Quantized-Mesh中,每个图块都是一个由三角形组成的网格,其中顶点与图块边缘处的相邻网格重叠。换句话说,这意味着在图块的边缘部分,西部瓦片中最东部的顶点与东部瓦片中最西部的顶点具有相同的经度。这种设计确保了地形瓦片在边缘交界处的平滑过渡,使得加载相邻瓦片时不会出现明显的断裂或不连续。
Quantized-Mesh格式构建的地球网格图 来源:Mapmost For UE
每个瓦片图块主要记录着经特殊编码的用于构建三角形网格的经纬高(u、v、h)值以及构网索引(indices)值。利用以下的计算规则,我们可以将瓦片中压缩记录的u、v、h值还原为真实的经纬高值:
Y=Vmin+(X/32767)*(Vmax-Vmin)
其中,X代表的是经过特殊编码压缩的u、v、h值,而Vmin、Vmax代表的是通过行列号计算得到的该瓦片所对应区域的经纬高度的范围。
加载地形瓦片服务时,通过反算经纬高值和记录的构网索引值,即可线性插值构建单个地形瓦片的三角网。同时,为了避免相邻地形瓦片之间出现裂缝,引入了裙边(skirt)的概念。裙边通过四个(边缘)索引列表保存地形瓦片所有边缘上的顶点和索引值,确保地形瓦片能够无缝衔接,呈现连续且真实的地形表现。这种组织方式是目前应用最广泛的一种三维地形瓦片组织方式。
三、全球地形流畅展现:视锥体剔除技术的奥秘揭秘
就像前面说的一样,我们把地球的地形数据按照global-geodetic规则“大卸八块”,然后用Heightmap或Quantized-Mesh格式存储,构建了地形瓦片金字塔。这样一来,我们就能更好地组织和管理全球地形数据了。但接下来的问题是:怎么样才能让这些地形瓦片生动地展示出来,让我们仿佛置身于真实的地球之上呢?
视锥体剔除示意图 来源:百度图片
就像我们的眼睛无法一眼看到整个世界一样,在电脑中也不需要同时展示地球的所有地形。我们只需呈现我们能够“看到”的那部分地形即可。这就引出了“视锥体剔除”这一概念。所谓的“视锥体”,就是指相机(或观察者)视野范围内的一个椎体区域,通常被定义为一个六面体,由近裁剪平面、远裁剪平面以及四个侧面组成。视锥体决定了相机能够看见的区域。而“视锥体剔除”则是利用视锥体来确定在视野范围内需要显示的地形区域范围,然后计算需要加载和显示的地形瓦片。对于不在视锥体内的地形区域,则不进行显示。通过“视锥体剔除”的方式,我们可以大大减少不必要显示的地形瓦片区域,从而实现在地图应用中流畅显示全球地形的目标。
图片来源:网络
在地图引擎领域,大多数地图开发工具都采用“视锥体剔除”这种原理,以实现高效加载和显示地形数据。而Mapmost For UE作为其中之一,同样运用了这一原理。作为一款基于虚幻引擎打造的数字孪生底座开发工具,Mapmost For UE是专为数字孪生应用场景而设计。不仅具备实时加载和渲染三维地形瓦片、多种影像数据叠加以及多种地理模型数据的能力,还集成了数据治理、地理人工智能计算、时空分析、可视化分析、场景交互、图层管理等多种功能。欢迎小伙伴们前来体验我们的Mapmost产品,共同打造你心目中的数字孪生应用。
mapmost搭建的数字水利平台图,来源:mapmost
参考
https://www.shuzhiduo.com/A/gGdX94rpz4/
https://www.shuzhiduo.com/A/KE5QDYZkJL/
https://www.itbaoku.cn/post/2875325.html
关注Mapmost,持续更新GIS、三维美术、计算机技术干货
Mapmost是一套以三维地图和时空计算为特色的数字孪生底座平台,包含了空间数据管理工具(Studio)、应用开发工具(SDK)、应用创作工具(Alpha)。平台能力已覆盖城市时空数据的集成、多源数据资源的发布管理,以及数字孪生应用开发工具链,满足企业开发者用户快速搭建数字孪生场景的切实需求,助力实现行业领先。