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

weixin_33670713發表於2018-11-23

原文地址: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執行。先感受下地形效果,縮放到任意山區,按住中鍵,拖拽讓水平檢視傾斜。 下面是珠峰的效果:

11335939-d9e8371cc5b00ba8.png
珠峰

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

開啟地形光照和水面效果

Cesium全球地形也包含了地形光照資料,以及水面效果需要的海岸線資料。預設地形伺服器不會傳遞包含這兩個額外資料的切片。我們可以在 CesiumTerrainProvider的建構函式配置一下。
開啟地形光照,需要VertexNormals擴充套件。

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

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


11335939-c6469cea2984e760.png
帶光照的地形

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

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

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

11335939-8f182fa5bdfb40e7.png
舊金山灣

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

可以再去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.

11335939-dcb55745f12c86a7.png
中國最專業的Cesium開發者社群

相關文章