Cesium地形(四)

admin0条评论 515 次浏览

地形

铯支持对海洋,湖泊和河流的全球高分辨率地形和水影响进行流式传输和可视化。与2D地图相比,山峰,山谷和其他地形特征确实显示出3D地球的优势。

地形数据集非常庞大,通常总数为千兆字节或兆兆字节。使用低级图形API或通用3D引擎高效地可视化地形涉及相当多的工作。幸运的是,Cesium已经完成了繁重的工作,所以我们只需要编写几行代码即可。

快速开始

我们从一个例子开始。在Sandcastle中打开Hello World示例。默认情况下,地球是一个WGS84椭球体。要添加由Cesium ion托管的Cesium World Terrain,请在底部(行后var viewer = ...)添加以下代码:

viewer.terrainProvider = Cesium.createWorldTerrain();

修改示例后,按F8运行它。要感受地形,请放大至山区,然后按住鼠标中键并拖动以倾斜至地平线视图。以下是珠穆朗玛峰的外观:

珠穆朗玛峰

随着我们缩小距离,Cesium会根据地球的哪些部分可见以及它们有多远请求更高分辨率的地形。

地形和图像分开处理; 上面,默认图像覆盖在地形上。任何图像提供商都可以用于任何地形提供商。有关管理图像的信息,请参阅图像图层教程

启用地形照明和水效应

铯世界地形还包括地形照明数据以及水效应所需的海岸线数据。默认情况下,地形服务器不会发送照明或海岸线数据与地形图块; 我们必须要求在构建地形时需要地形照明或海岸线数据CesiumTerrainProvider

要启用地形照明,请向地形服务器请求VertexNormals扩展,并启用地球照明。

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

这里是上面显示的珠穆朗玛峰的相同视图,但现在地形根据太阳的位置进行阴影处理。

珠穆朗玛峰与照明

水效应以类似的方式启用。要启用,我们请求Terrain服务器的WaterMask扩展如下:

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

用水放大到一个区域。例如,这里是旧金山湾:

旧金山湾

随着时间的推移而动起来的波浪和明亮的镜面高光显示了太阳和月亮的反射。

查看Sandcastle中的地形示例,探索具有有趣地形和水的几个选择区域。

即用型地形

Cesium World Terrain可以用于您自己的基于Cesium的应用程序,通常只需添加几行代码即可。

地形提供者

Cesium支持几种使用地形提供者请求地形的方法。大多数地形提供者通过HTTP 使用REST接口来请求地形图块作为高度图。地形提供者根据请求的格式以及地形数据的组织方式而有所不同。铯有以下地形提供者:

我们可以通过实现TerrainProvider接口来访问其他地形服务。如果你这样做,并认为它通常是有用的,请贡献给铯为每个人的利益。

正如我们上面看到的,要使用地形提供者,我们构造它,并通过设置Viewer.terrainProvider来分配它。地形提供者的构造与图像提供者类似,通常包括地形服务器的URL和可选代理(如果服务器不支持跨源资源共享(CORS))。

一些地形提供商,如CesiumTerrainProvider,包括动画水需要的海岸线数据。可以通过使用CentralBody.oceanNormalMapUrl更改用于创建波浪的法线贴图来定制水。更改图像提供者还会影响水的外观,因为水的颜色与底层图像混合在一起。

资源

查看Sandcastle中的地形示例所有地形提供者的参考文档。