本文章文字少少,干货多多,记录自己学习过程中的代码积累。
官方提供有三种地形裁剪的示例,主要是运用到官方API:Cesium.ClipPlaneCollection,Cesium.ClippingPlane,Cesium.ClipPlane,Cesium.Plane,Cesium.ClippingPolygon,Cesium.ClippingPolygonCollection。
早期版本的Cesium中,没有Cesium.ClippingPolygon,Cesium.ClippingPolygonCollection,凹多变的实现方案比较复杂,需要对源码进行打补丁,幸运的是现在官方已经提供了更好的方法了。
1.简单的地形裁剪
这个的实现比较简单,只需要一个平面即可,平面与地形相交,将地形裁剪掉,实现代码如下:
// 简单裁剪
const simpleTerrainClip = () => {
const globe = viewer.value.scene.globe;
// 开启地形遮挡
globe.depthTestAgainstTerrain = true;
// 定义一个点,以这一点为原点。
const position = Cesium.Cartesian3.fromDegrees(113.65, 26.0);
const entity = viewer.value.entities.add({
position: position,
});
globe.clippingPlanes = new Cesium.ClippingPlaneCollection({
modelMatrix: entity.computeModelMatrix(Cesium.JulianDate.now()),
planes: [
new Cesium.ClippingPlane(new Cesium.Cartesian3(1.0, 0.0, 0.0), -150.0), // 原点东方向,裁剪距离为150米向西方向的整个地球空间模型
new Cesium.ClippingPlane(new Cesium.Cartesian3(-1.0, 0.0, 0.0), -150.0), // 原点西方向,裁剪距离为150米向东方向的整个地球空间模型
new Cesium.ClippingPlane(new Cesium.Cartesian3(0.0, 1.0, 0.0), -150.0), // 原点北方向,裁剪距离为150米向南方向的整个地球空间模型
new Cesium.ClippingPlane(new Cesium.Cartesian3(0.0, -1.0, 0.0), -150.0), // 原点南方向,裁剪距离为150米向北方向的整个地球空间模型
// new Cesium.ClippingPlane(new Cesium.Cartesian3(0.0, 0.0, -1.0), -150.0), // 原点高度方向,裁剪高度为150米以上的整个地球空间模型
// new Cesium.ClippingPlane(new Cesium.Cartesian3(0.0, 0.0, 1.0), -150.0), // 原点高度方向,裁剪高度为150米以下的整个地球空间模型
],
edgeWidth: 1.0,
edgeColor: Cesium.Color.WHITE,
enabled: true,
});
globe.backFaceCulling = true;
globe.showSkirts = true;
};
简单画了两个图来说明这个裁剪面的作用效果: