1. 程式人生 > >Cesium官方教程5--地形圖層

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

原文地址:https://cesiumjs.org/tutorials/Terrain-Tutorial/
Cesium支援漸進流式載入和渲染全球高精度地形,並且包含海、湖、河等水面效果。相對2D地圖,山峰、山谷等其他地形特徵的更適宜在這種3D地球中展示。
地形資料集是巨大的,通常都是GB或者TB級別。在普通3D引擎中,使用底層圖形API去高效實現地形資料的視覺化需要做很多事情。幸好,Cesium已經完成了這個體力活,而我們只需要寫幾行程式碼。
快速開始
從一個示例開始吧。開啟Sandcastle中的 Hello World 示例。預設,全球是 WGS84 標準球。 新增下面程式碼 (在這一行之後 var viewer = ...),即可把Cesium ion上釋出的全球地形資料加入到場景中:
Cesium官方教程5--地形圖層


修改後,按F8執行。先感受下地形效果,縮放到任意山區,按住中鍵,拖拽讓水平檢視傾斜。 下面是珠峰的效果:
Cesium官方教程5--地形圖層
珠峰

當我們拉近一些,Cesium依據當前相機距離以及當前可視範圍來請求高精度地形資料。
地形和影像是區別對待的。預設影像是覆蓋在地形上的。任意影像provider可以覆蓋在任意地形provider上。
開啟地形光照和水面效果
Cesium全球地形也包含了地形光照資料,以及水面效果需要的海岸線資料。預設地形伺服器不會傳遞包含這兩個額外資料的切片。我們可以在 CesiumTerrainProvider的建構函式配置一下。
開啟地形光照,需要VertexNormals擴充套件。
Cesium官方教程5--地形圖層
這和上面的珠峰位置相同,但是現在有了基於太陽實際位置的光暈效果。
Cesium官方教程5--地形圖層


帶光照的地形
水面效果也是同樣的方法。我們請求WaterMask擴充套件。
Cesium官方教程5--地形圖層
縮放到一片水域。比如舊金山灣:
Cesium官方教程5--地形圖層
舊金山灣

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

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

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