原文地址: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:
- Cesium 標准地形 -高經度全球地形,地形支持光照和水面效果。地形切片使用quantized-mesh v1.0格式。 Cesium中使用 CesiumTerrainProvider.
- Google Earth Enterprise -通過高度圖(height map)方式生成地形。 Cesium中使用 GoogleEarthEnterpriseTerrainProvider.
- VT MAK VR-TheWorld Server - 從 VR-TheWorld Server請求地形切片。 這個服務數據是90米采樣精度的全球數據,並且包含水深數據。Cesium中使用 VRTheWorldTerrainProvider.
- Ellipsoid - 光滑橢球體。這個地形不請求任何服務數據,也沒有任何地形起伏效果。一般用作一些太空類展示項目。 Cesium中使用 EllipsoidTerrainProvider.
可以通過實現 TerrainProvider 接口來訪問其他地形服務。如果這么做了,請 貢獻 給Cesium。
綜上所述,使用地形provider,只需要設置 Viewer.terrainProvider。地形provider和影像provider很像,通常地形服務的url地址,以及一個代理服務器配置(當服務不支持CORS跨域訪問的時候)。
一些地形provider,比如CesiumTerrainProvider包含海岸線數據能展示動態水面效果。通過修改 CentralBody.oceanNormalMapUrl屬性去替換海量的法線貼圖,去自定義海浪效果。因為水面顏色和影像顏色是混合的,所以修改影像也會影響水面效果 。
資源
查看Sandcastle中的 地形示例 。幫助手冊 所有的地形provider.
