Cesium官方教程5--地形圖層


原文地址:https://cesiumjs.org/tutorials/Terrain-Tutorial/

Cesium支持漸進流式加載和渲染全球高精度地形,並且包含海、湖、河等水面效果。相對2D地圖,山峰、山谷等其他地形特征的更適宜在這種3D地球中展示。

地形數據集是巨大的,通常都是GB或者TB級別。在普通3D引擎中,使用底層圖形API去高效實現地形數據的可視化需要做很多事情。幸好,Cesium已經完成了這個體力活,而我們只需要寫幾行代碼。

快速開始

從一個示例開始吧。打開Sandcastle中的 Hello World 示例。默認,全球是 WGS84 標准球。 添加下面代碼 (在這一行之后 var viewer = ...),即可把Cesium ion上發布的全球地形數據加入到場景中:

viewer.terrainProvider = Cesium.createWorldTerrain();

修改后,按F8運行。先感受下地形效果,縮放到任意山區,按住中鍵,拖拽讓水平視圖傾斜。 下面是珠峰的效果:

 
珠峰

當我們拉近一些,Cesium依據當前相機距離以及當前可視范圍來請求高精度地形數據。
地形和影像是區別對待的。默認影像是覆蓋在地形上的。任意影像provider可以覆蓋在任意地形provider上。

開啟地形光照和水面效果

Cesium全球地形也包含了地形光照數據,以及水面效果需要的海岸線數據。默認地形服務器不會傳遞包含這兩個額外數據的切片。我們可以在 CesiumTerrainProvider的構造函數配置一下。
開啟地形光照,需要VertexNormals擴展。

var terrainProvider = Cesium.createWorldTerrain({ requestVertexNormals: true }); viewer.terrainProvider = terrainProvider; viewer.scene.globe.enableLighting = true; 

這和上面的珠峰位置相同,但是現在有了基於太陽實際位置的光暈效果。


 
帶光照的地形

水面效果也是同樣的方法。我們請求WaterMask擴展。

var terrainProvider = Cesium.createWorldTerrain({ requestWaterMask: true }); viewer.terrainProvider = terrainProvider; 

縮放到一片水域。比如舊金山灣:

 
舊金山灣

有一個海浪的動畫,以及反射太陽和月亮的光。

可以再去Sandcastle的 地形示例查看一些區域的地形和水面 .

可以使用的地形

Cesium 全球地形,基於Cesium開發的項目只需要幾行代碼就可以加載。
CesiumLab工具,非常方便的工具,可以對地形數據切片、下載地形、發布地形服務。

地形數據 providers

Cesium使用terrain providers支持幾種地形數據請求方法。大部分地形provider通過基於HTTP的REST 接口 去請求地形切片。依據地形數據的組織方式和請求方式不同,Cesium支持下列地形provider:

可以通過實現 TerrainProvider 接口來訪問其他地形服務。如果這么做了,請 貢獻 給Cesium。
綜上所述,使用地形provider,只需要設置 Viewer.terrainProvider。地形provider和影像provider很像,通常地形服務的url地址,以及一個代理服務器配置(當服務不支持CORS跨域訪問的時候)。

一些地形provider,比如CesiumTerrainProvider包含海岸線數據能展示動態水面效果。通過修改 CentralBody.oceanNormalMapUrl屬性去替換海量的法線貼圖,去自定義海浪效果。因為水面顏色和影像顏色是混合的,所以修改影像也會影響水面效果 。

資源

查看Sandcastle中的 地形示例 。幫助手冊 所有的地形provider.

 
中國最專業的Cesium開發者社區




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM