解讀WorldWind(二)模型與地形
WorldWind核心就是在一個星球模型上呈現星球表面的自然景觀和自然現象,注意是星球而不是地球,因為可以通過配置,換成任何其他星球的模型來展示,只要有引數和圖層,改成月球或是火星都分分鐘的事。星球表面有一個很重要的特點,就是都可以用經緯度來表示位置,當然嚴格來說,經緯度適合表示穩定自轉的星球表面的位置,如果沒有固定的自轉軸,那麼定哪一個大圓作為赤道就很為難,經緯度系統也不好建立,不過貌似在太陽系裡這個問題不大。基於經緯度,可以把球面切成小片,每次只處理視口內看得見的那幾個小片,這樣就大大節省了資料量、計算量和渲染量,這樣每一個切出來的小片叫做一個Tile,幾乎所有的GIS都有類似的Tile系統(中文一般叫瓦片圖),而且實現方法也都相近,不過具體切法還是有小小的差異。每個切片所能展現的細節是基本相同的,消耗的計算資源也相近,根據視口的範圍動態調整,隨著視口內所見的空間範圍不斷縮小,視口內切片自動分裂成更小的切片,以展示更多的細節,這就是LOD(Levels of Detail,多細節層次)。
上圖是WorldWind的初始瓦片切分,不同於大多數線上地圖基於墨卡託投影的從最頂級開始的四分系統,WorldWind在全球尺度上的切片是橫六縱三,總共18塊,在這個初始切分之下再使用四分法逐級切下去。用來表示四分法下瓦片之間關係的資料結構叫做四叉樹,四叉樹_百度百科。
上圖中初始的第一橫排瓦片前面的三個各自分裂成四個子瓦片,後面三個由於距離攝像機遠而沒有分裂。
WorldWind的圖層只能依附在星球表面,因為模型裡只有一個ElevationModel,也就是說星球只能有一層表面,因此WorldWind不能同時支援海面和海底兩套高程,實際上只有海底有高程,海面貼圖並不是貼到柵格上,而是直接貼到海拔為0的平面上,這算是一種hack方法吧。下圖是海面的高程柵格和貼圖,可以看到貼圖並沒有沿著柵格彎曲,也沒有下面所說的檯面拉伸。
今天發現海面hack是個特殊圖層,全都是藍色,試了其他圖層,發現是直接鋪在柵格上,海面的圖層直接鋪到海床上了,仔細看起來很詭異。下圖是菲律賓海溝某處,藍色平面和貼圖檯面同時可見。
在高程柵格方面用了另一個hack方法避免了因為LOD造成的不同精度的柵格拼接。通常兩個瓦片之間如果不拼接,就會在交界處形成一條縫,但是拼接演算法是很麻煩的,WorldWind採用的方法是每個瓦片不僅有上表面一塊地表柵格,而且在瓦片四面繪製四片垂直的柵格,這樣就形成了一個凸起的檯面,類似一個鍵盤鍵帽,然後把材質圖蒙在這個檯面上,這樣每一個瓦塊的材質圖都只需要蒙一個面,不同瓦塊之間的縫被瓦塊側面垂直的柵格填充,不會看出有縫。下圖是當中一塊瓦塊材質沒有下載完,因此沒有蒙上材質,可以看到旁邊的瓦塊材質在側面柵格上的拉伸效果,這個側面的柵格最下部到達地形最深處的極限值,配置檔案裡預設設定是海平面下11000米,圖中所示區域是貢嘎山,海拔7000多米,因此這個方坑深度大約18000米。
相關文章
- 解讀React原始碼(二):Virtual DOM模型React原始碼模型
- Java RMI學習與解讀(二)Java
- 盤古大模型參與者解讀盤古β大模型大模型
- Stage模型深入解讀模型
- 網路I/O模型 解讀模型
- Java記憶體模型深度解讀Java記憶體模型
- UE4 地形編輯-建立地形Landscape/terrainAI
- [譯] 用 Skater 解讀預測模型:開啟模型的黑箱模型
- ConcurrentHashMap原始碼解讀二HashMap原始碼
- SnapKit 原始碼解讀(二):DSLsAPK原始碼
- Laravel核心解讀–Database(四) 模型關聯LaravelDatabase模型
- c++11 記憶體模型解讀C++記憶體模型
- Java網路程式設計與NIO詳解10:深度解讀Tomcat中的NIO模型Java程式設計Tomcat模型
- 深度解讀《深度探索C++物件模型》之資料成員的存取效率分析(二)C++物件模型
- Cesium 滑鼠拾取橢球、地形、模型座標點(經度+緯度+高程)模型
- 論文解讀丨表格識別模型TableMaster模型AST
- 解讀SSLVPN技術(二)
- @Import與@ImportResource註解的解讀Import
- 深度解讀《深度探索C++物件模型》之C++虛擬函式實現分析(二)C++物件模型函式
- 深度解讀昇騰CANN模型下沉技術,提升模型排程效能模型
- 《深度探索c++記憶體模型》讀書筆記 (二)C++記憶體模型筆記
- Unity Terrain地形設定UnityAI
- OpenSearch向量檢索和大模型方案深度解讀大模型
- LLaMA 3 原始碼解讀-大語言模型5原始碼模型
- Unity3D地形建模外掛World Composer用法(大範圍地形建模)Unity3D
- 【詳解】ThreadPoolExecutor原始碼閱讀(二)thread原始碼
- slate原始碼解析(二)- 基本框架與資料模型原始碼框架模型
- MMKV原始碼解讀與理解原始碼
- Minecraft類遊戲地形生成機制Raft遊戲
- 使用Covermap實現地形細節
- unity3d--地形系統Unity3D
- 資深消防猿為你解讀Java多執行緒與併發模型之共享物件Java執行緒模型物件
- 自動模型壓縮與架構搜尋,這是飛槳PaddleSlim最全的解讀模型架構
- 從JVM設計角度解讀Java記憶體模型JVMJava記憶體模型
- 標準解讀:零信任能力成熟度模型模型
- 文件理解的新時代:LayOutLM模型的全方位解讀模型
- 探究職業發展的關鍵:能力模型解讀模型
- Flutter 入門與實戰(二):容器的盒子模型Flutter模型