目录
快速开始(Quick start)
使用地形照明和水特效(Enabling Terrain Lighting and Water Effects)
现有的地形(Ready-to-use terrain)
地形提供商(Terrain providers)
资源(Resources)
Cesium支持可视化全球高分辨率地形和动态化海洋、湖泊和河流水的影响。山顶和山谷及其它地形特征可以真实展示3D地球,这比2D地图更有优势。
地形数据集非常巨大,通常总计有千兆字节或兆兆字节。使用低分辨率图形API或普通的3D引擎来有效可视化地形涉及到相当多的工作。庆幸的是,Cesium已经完成了大量的工作,所以我们仅仅需要几行代码。
让我们以示例开始,打开沙堡中的Hello World示例。默认情况下,地球使用的WGS84 ellipsoid。为了添加托管在Cesium ion中的Cesium World地形,增加下面的代码(在var viewer = ...):
viewer.terrainProvider = Cesium.createWorldTerrain();
修改这个示例后,按F8运行,放大山区,并按住鼠标中间按钮拖动到水平视角,感受一下地形。可以看到珠穆朗玛峰:
当我们拉近的时候,Cesium根据地球上那些地方是可见的及它们距离地球有多远,来请求更高分辨率的地形。
地形和影像是分开处理的,上面示例中,默认的影像覆盖在地形上。任何影像提供商都可以与任何地形提供商一起使用,查看影像图层教程(Imagery Layers Tutorial)的管理影像。
Cesium世界地形也包括地形照明数据以及水特效所需的海岸线数据。地形数据服务器在传输地形瓦片时不会带有照明或海岸线数据。在创建CesiumTerrainProvider时,我们必须请求地形照明或海岸线数据。
为了启用地形照明,从地形服务器请求顶点法线延伸(VertexNormals extension),并在地球上使用照明。
var terrainProvider = Cesium.createWorldTerrain({
requestVertexNormals: true
});
viewer.terrainProvider = terrainProvider;
viewer.scene.globe.enableLighting = true;
与上面珠穆朗玛峰相同的视角,但现在,根据太阳的位置,地形被遮挡了。
水特效以相同的方式实现。为了使用水特效,我们可以像下面这样,从地形服务器请求WaterMask extension:
var terrainProvider = Cesium.createWorldTerrain({
requestWaterMask: true
});
viewer.terrainProvider = terrainProvider;
放大到有水的地方,例如旧金山湾:
随时间波动的波浪,明亮的太阳和月亮的反射光。
在sandcastle中查看地形实例,探寻一些有趣的地形和水域区域。
Cesium World Terrain可以在你自己的Cesium应用程序中使用,只需要添加几行代码就可以。
Cesium支持几种请求地形数据提供商数据的方式。大多数地形提供商使用HTTP上的REST接口来请求地形瓦片作为高度映射。根据请求的格式和地形数据的组织方式,地形数据提供商会有所不同。Cesium有以下地形提供商:
通过实现地形提供商的接口(TerrainProvider),我们可以使用其它地形服务。如果这样做,认为是有普遍用途的话,为了大家共同的利益请贡献给Cesium。
正如上文所说,为了使用地形提供商的数据,我们创建并通过设置Viewer.terrainProvider来分配它。地形提供商的建立与影像提供商(imagery providers)一样,一般包括地形服务的url和一个可选代理(如果服务器不支持跨域资源共享(CORS))。
一些地形提供商,像CesiumTerrainProvider,包含水域特效需要的海岸线数据。通过改变法线图,其常使用CentralBody.oceanNormalMapUrl创建波浪,来定制水。更改影像提供商还会影像水的外观,这是因为水的颜色与底层影像是混合在一起的。
Checkout 沙堡中的地形示例(terrain example)和所有地形提供商(all terrain providers)的参考文档。