关于地形开挖
地形开挖就是在地形表面,开挖出一定范围的区域,用于显示地形下的场景,经常用于城市管网、地下沟渠,排污通道等地下设施,或者地下建筑等等。
效果图
需要提前预习的接口
地形开挖与基于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==>