解讀WorldWind(二)模型與地形

趙丹 Diana Zhao發表於2015-04-06

WorldWind核心就是在一個星球模型上呈現星球表面的自然景觀和自然現象,注意是星球而不是地球,因為可以通過配置,換成任何其他星球的模型來展示,只要有引數和圖層,改成月球或是火星都分分鐘的事。星球表面有一個很重要的特點,就是都可以用經緯度來表示位置,當然嚴格來說,經緯度適合表示穩定自轉的星球表面的位置,如果沒有固定的自轉軸,那麼定哪一個大圓作為赤道就很為難,經緯度系統也不好建立,不過貌似在太陽系裡這個問題不大。基於經緯度,可以把球面切成小片,每次只處理視口內看得見的那幾個小片,這樣就大大節省了資料量、計算量和渲染量,這樣每一個切出來的小片叫做一個Tile,幾乎所有的GIS都有類似的Tile系統(中文一般叫瓦片圖),而且實現方法也都相近,不過具體切法還是有小小的差異。每個切片所能展現的細節是基本相同的,消耗的計算資源也相近,根據視口的範圍動態調整,隨著視口內所見的空間範圍不斷縮小,視口內切片自動分裂成更小的切片,以展示更多的細節,這就是LOD(Levels of Detail,多細節層次)。 enter image description here

上圖是WorldWind的初始瓦片切分,不同於大多數線上地圖基於墨卡託投影的從最頂級開始的四分系統,WorldWind在全球尺度上的切片是橫六縱三,總共18塊,在這個初始切分之下再使用四分法逐級切下去。用來表示四分法下瓦片之間關係的資料結構叫做四叉樹,四叉樹_百度百科

enter image description here

上圖中初始的第一橫排瓦片前面的三個各自分裂成四個子瓦片,後面三個由於距離攝像機遠而沒有分裂。

WorldWind的圖層只能依附在星球表面,因為模型裡只有一個ElevationModel,也就是說星球只能有一層表面,因此WorldWind不能同時支援海面和海底兩套高程,實際上只有海底有高程,海面貼圖並不是貼到柵格上,而是直接貼到海拔為0的平面上,這算是一種hack方法吧。下圖是海面的高程柵格和貼圖,可以看到貼圖並沒有沿著柵格彎曲,也沒有下面所說的檯面拉伸。

enter image description here

今天發現海面hack是個特殊圖層,全都是藍色,試了其他圖層,發現是直接鋪在柵格上,海面的圖層直接鋪到海床上了,仔細看起來很詭異。下圖是菲律賓海溝某處,藍色平面和貼圖檯面同時可見。

enter image description here

在高程柵格方面用了另一個hack方法避免了因為LOD造成的不同精度的柵格拼接。通常兩個瓦片之間如果不拼接,就會在交界處形成一條縫,但是拼接演算法是很麻煩的,WorldWind採用的方法是每個瓦片不僅有上表面一塊地表柵格,而且在瓦片四面繪製四片垂直的柵格,這樣就形成了一個凸起的檯面,類似一個鍵盤鍵帽,然後把材質圖蒙在這個檯面上,這樣每一個瓦塊的材質圖都只需要蒙一個面,不同瓦塊之間的縫被瓦塊側面垂直的柵格填充,不會看出有縫。下圖是當中一塊瓦塊材質沒有下載完,因此沒有蒙上材質,可以看到旁邊的瓦塊材質在側面柵格上的拉伸效果,這個側面的柵格最下部到達地形最深處的極限值,配置檔案裡預設設定是海平面下11000米,圖中所示區域是貢嘎山,海拔7000多米,因此這個方坑深度大約18000米。

enter image description here

相關文章