tuchooy 发表于 2022-9-26 18:26:23

解读WorldWind(三)模型与地形

WorldWind核心就是在一个星球模型上呈现星球表面的自然景观和自然现象,注意是星球而不是地球,因为可以通过配置,换成任何其他星球的模型来展示,只要有参数和图层,改成月球或是火星都分分钟的事。星球表面有一个很重要的特点,就是都可以用经纬度来表示位置,当然严格来说,经纬度适合表示稳定自转的星球表面的位置,如果没有固定的自转轴,那么定哪一个大圆作为赤道就很为难,经纬度系统也不好建立,不过貌似在太阳系里这个问题不大。基于经纬度,可以把球面切成小片,每次只处理视口内看得见的那几个小片,这样就大大节省了数据量、计算量和渲染量,这样每一个切出来的小片叫做一个Tile,几乎所有的GIS都有类似的Tile系统(中文一般叫瓦片图),而且实现方法也都相近,不过具体切法还是有小小的差异。每个切片所能展现的细节是基本相同的,消耗的计算资源也相近,根据视口的范围动态调整,随着视口内所见的空间范围不断缩小,视口内切片自动分裂成更小的切片,以展示更多的细节,这就是LOD(Levels of Detail,多细节层次)。


上图是WorldWind的初始瓦片切分,不同于大多数在线地图基于墨卡托投影的从最顶级开始的四分系统,WorldWind在全球尺度上的切片是横六纵三,总共18块,在这个初始切分之下再使用四分法逐级切下去。用来表示四分法下瓦片之间关系的数据结构叫做四叉树,四叉树_百度百科。


上图中初始的第一横排瓦片前面的三个各自分裂成四个子瓦片,后面三个由于距离摄像机远而没有分裂。

WorldWind的图层只能依附在星球表面,因为模型里只有一个ElevationModel,也就是说星球只能有一层表面,因此WorldWind不能同时支持海面和海底两套高程,实际上只有海底有高程,海面贴图并不是贴到栅格上,而是直接贴到海拔为0的平面上,这算是一种hack方法吧。下图是海面的高程栅格和贴图,可以看到贴图并没有沿着栅格弯曲,也没有下面所说的台面拉伸。


今天发现海面hack是个特殊图层,全都是蓝色,试了其他图层,发现是直接铺在栅格上,海面的图层直接铺到海床上了,仔细看起来很诡异。下图是菲律宾海沟某处,蓝色平面和贴图台面同时可见。



在高程栅格方面用了另一个hack方法避免了因为LOD造成的不同精度的栅格拼接。通常两个瓦片之间如果不拼接,就会在交界处形成一条缝,但是拼接算法是很麻烦的,WorldWind采用的方法是每个瓦片不仅有上表面一块地表栅格,而且在瓦片四面绘制四片垂直的栅格,这样就形成了一个凸起的台面,类似一个键盘键帽,然后把材质图蒙在这个台面上,这样每一个瓦块的材质图都只需要蒙一个面,不同瓦块之间的缝被瓦块侧面垂直的栅格填充,不会看出有缝。下图是当中一块瓦块材质没有下载完,因此没有蒙上材质,可以看到旁边的瓦块材质在侧面栅格上的拉伸效果,这个侧面的栅格最下部到达地形最深处的极限值,配置文件里缺省设置是海平面下11000米,图中所示区域是贡嘎山,海拔7000多米,因此这个方坑深度大约18000米。

御坂美琴LV5 发表于 2022-9-26 18:40:47

看起来好棒!
页: [1]
查看完整版本: 解读WorldWind(三)模型与地形