Cesium专栏-地形开挖

1,838 阅读1分钟

关于地形开挖

地形开挖就是在地形表面,开挖出一定范围的区域,用于显示地形下的场景,经常用于城市管网、地下沟渠,排污通道等地下设施,或者地下建筑等等。

效果图

需要提前预习的接口

地形开挖与基于3dtiles模型的裁剪效果所使用的接口是一致的,只是使用方式不一样。依然是这几个接口。

  • ClippingPlaneCollection
  • ClippingPlane
  • Globe

具体操作

1、初始化地球,并开启深度测试

var viewer = new Cesium.Viewer('cesiumContainer', {
    imageryProvider: new Cesium.UrlTemplateImageryProvider({
        url: 'http://www.google.cn/maps/vt?lyrs=s@716&x={x}&y={y}&z={z}'
    }),
    terrainProvider: Cesium.createWorldTerrain({
        requestVertexNormals: true,
        requestWaterMask: true
    })
});
viewer.scene.globe.depthTestAgainstTerrain = true;

2、指定开挖位置,并设置开挖距离

var position = Cesium.Cartographic.toCartesian(new Cesium.Cartographic.fromDegrees(-113.2665534, 36.0939345, 100));
var distance = -3000.0; // 开挖距离

3、创建ClippingPlaneCollection对象

var clippingPlaneCollection  = new Cesium.ClippingPlaneCollection({
    modelMatrix: Cesium.Transforms.eastNorthUpToFixedFrame(position),
    planes: [
        new Cesium.ClippingPlane(new Cesium.Cartesian3(1.0, 0.0, 0.0), distance),
        new Cesium.ClippingPlane(new Cesium.Cartesian3(-1.0, 0.0, 0.0), distance),
        new Cesium.ClippingPlane(new Cesium.Cartesian3(0.0, 1.0, 0.0), distance),
        new Cesium.ClippingPlane(new Cesium.Cartesian3(0.0, -1.0, 0.0), distance)
    ],
    edgeWidth: 0.0,
    edgeColor: Cesium.Color.WHITE,
});

4、开挖地形

viewer.scene.globe.clippingPlanes = clippingPlaneCollection;

5、设置相机位置,查看开挖效果

viewer.camera.viewBoundingSphere(boundingSphere, new Cesium.HeadingPitchRange(0.5, 1.0, boundingSphere.radius * 5.0));
viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);

后续

当然挖了一个洞,黑呼呼的也不好看,如果加载了地下模型,估计也看不清楚,我们需要把这个洞给填上,复杂的应该可以通过自定义shader完成,但那玩意难度有点大,于是想着通过polygon对象拉升到指定的高度,即可完成这种效果,试了一下,效果、效率还可以。

link==>