Cesium 地形 Terrain

前言

原文地址
Cesium supports streaming and visualizing global high-resolution terrain and water effects for oceans, lakes, and rivers. Mountain peaks, valleys, and other terrain features really show the benefit of a 3D globe compared to a 2D map.

Terrain datasets are huge, commonly totaling gigabytes or terabytes. Efficiently visualizing terrain with a low-level graphics API or with a general 3D engine involves quite a bit of work. Fortunately, Cesium has already done the heavy lifting so we only need to write a couple lines of code.

快速上手

从一个例子开始。 打开Sandcastle的Hello World示例。 默认情况下,地球是一个WGS84坐标系椭球。 要使用Cesium Terrain Server添加地形,请将以下代码添加到底部(在var viewer = ...之后):

var terrainProvider = new Cesium.CesiumTerrainProvider({
    url : 'https://assets.agi.com/stk-terrain/v1/tilesets/world/tiles'
});
viewer.terrainProvider = terrainProvider;

修改示例后,按F8运行。 要查看明显的地形的效果,需要放大到山区,并按住鼠标中键并拖动以倾斜到水平视图。 这是珠穆朗玛峰的样子(搜索框中输入Mount Everest):
file
随着视角拉得更近,Cesium会请求更高分辨率的地形,请求策略是根据可视区域的以及离相机的远近这两个方面来确定的。

地形和图像分开处理; 如上所示,默认图像覆盖在地形上。 任何图像提供商都可以与任何地形提供商一起使用。 请参阅图像数据层教程

启用地形光照和水纹效果

Cesium 地形服务还包括地形光照以及确定水纹效果范围的海岸线数据。 默认情况下,地形照明或海岸线数据是不启用的,地形服务器不会返回这些数据; 要启用地形光照和水纹效果,就需要在构建CesiumTerrainProvider时,使用 VertexNormals 拓展,并启用全球照明。

var terrainProvider = new Cesium.CesiumTerrainProvider({
    url : 'https://assets.agi.com/stk-terrain/v1/tilesets/world/tiles',
    requestVertexNormals: true
});
viewer.terrainProvider = terrainProvider;
viewer.scene.globe.enableLighting = true;

下面是与上面显示的珠穆朗玛峰相同的视图,但现在的地形是具有阴影效果的。
file
水效果以类似的方式启用。 要启用的话需要开启WaterMask扩展,如下所示:

var terrainProvider = new Cesium.CesiumTerrainProvider({
    url : 'https://assets.agi.com/stk-terrain/v1/tilesets/world/tiles',
    requestWaterMask: true
});
viewer.terrainProvider = terrainProvider;

放大到一个水面区域。 例如,这里是旧金山湾(搜索框中输入Mount Everest):
file
水面具有波浪动画效果,以及由太阳和月亮的反射造成的水面上明亮的镜面亮点。总结来说就是波光粼粼。
查看Sandcastle 的地形示例,探索更多有趣的地形和水域。

已准备好的地形

Cesium 已经在Cesiumjs.org上维护了一个因特网可访问的地形数据。 可以在自己的Cesium应用中直接使用,通常只需添加几行代码即可。:trollface: 基于国内的GFW很有可能无法访问这些数据。

地形提供者TerrainProvider

Cesium通过使用TerrainProvider来支持多种方式的地形数据请求。大多数TerrainProvider通过HTTP使用REST接口来请求地形图块作为高度图。TerrainProvider根据请求地形数据的格式以及组织方式划分。Cesium具有下列TerrainProvider

  • Cesium Terrain Server - 高分辨率的全球地形,通过拓展支持地形照明和水纹效果。地形图块使用开放的运行时格式传递给客户端, quantized-mesh v1.0。在Cesium中,请参考CesiumTerrainProvider
  • Esri ArcGIS Image Server - 这个地形是通过从Esri Image Service请求高度图来生成的。例如世界数字地形模型(DTM)椭球体,其数据集的范围从小于1米到200公里。在Cesium中,请参阅ArcGisImageServerTerrainProvider。:trollface: Cesium 1.32以后以及移除了。参照
  • VT MÄK VR-TheWorld Server - 从VR-TheWorld服务器请求的高度映射生成地形。他们的托管服务器在全球范围内有90米的间距,包括测深。在Cesium中,见VRTheWorldTerrainProvider。:trollface: 这个VR和VR头盔没有直接关系
  • Ellipsoid - 由程序创建光滑表面的椭球。这缺乏实际的地形外观,不会从服务器请求数据,但是对许多应用程序(如空间)很有用。在Cesium中,请参阅EllipsoidTerrainProvider

我们可以通过继承TerrainProvider来实现它接口从而访问其它地形服务。 如果你这样做,并认为它会给更多的人带来方便,请贡献给Cesium为了所有人的利益。
如上所述,要使用terrain provider,我们构造它,并通过设置Viewer.terrainProvider来分配它。terrain provider的构造类似于imagery providers如果服务器不支持跨域访问CORS,通常的设置需要包含地形服务器的URL和可选代理服务地址。
有些 terrain providers, 像CesiumTerrainProvider, 包含一些水纹效果需要的海岸线数据. 可以通过用CentralBody.oceanNormalMapUrl更改用于创建波形的法线贴图来定制水纹效果。 改变imagery provider 也会影响水纹外观,因为水的颜色会与潜在的图像混合在一起。

资源

查看Sandcastle中的地形示例以及所有terrain providers的参考文档