首先需要建立裁剪面,裁剪面可以是面也可以是面构成的体。可以根据你要裁剪的形状,自己组合ClippingPlaneCollection。
其次将裁剪面作用到地形或者模型或者地球上,可以达到裁切模型,裁切地形,给地球挖洞,或者给地面的山体挖洞等。
let clippingPlanes = new Cesium.ClippingPlaneCollection({
modelMatrix: Cesium.Transforms.eastNorthUpToFixedFrame(position),
planes: [
new Cesium.ClippingPlane(new Cesium.Cartesian3(0.5, 0.0, 0.5), distance),
new Cesium.ClippingPlane(new Cesium.Cartesian3(-0.5, 0.0, 0.5), distance),
new Cesium.ClippingPlane(new Cesium.Cartesian3(0.0, 0.0, -1.0), distance)
],
unionClippingRegions: false
});
modelMatrix为该次裁剪选择一个中心点,设置其矩阵
planes为ClippingPlane的集合,
ClippingPlane的第一个参数为裁切面的法线方向,distance为法线方向上到原点的距离
unionClippingRegions 为true则裁剪planes区域外侧的,为false则裁剪区域内部的数据,如果是挖洞的话,则需要为false
如果想给地表挖个洞,需要先选一个点,然后在该点的前后左后四个方向上设置法线与距离,
然后把 unionClippingRegions: false 就可以把地表挖一个洞,挖洞是往外挖 原点在法线相反的方向所以 distance为负值
如果 distance为正值,unionClippingRegions: true 则地表就只剩这个洞了,外面的都被裁剪掉了。
第一种 地形的裁剪: 给某山体挖一个三角形洞
let thisBLH = {B:103,L:90,H:227};
let position = cesiumCommon.lonlat2Cartesian([thisBLH.L, thisBLH.B], thisBLH.H);
let distance = -1000;
let clippingPlanes = new Cesium.ClippingPlaneCollection({
modelMatrix: Cesium.Transforms.eastNorthUpToFixedFrame(position),
planes: [
new Cesium.ClippingPlane(new Cesium.Cartesian3(0.5, 0.0, 0.5), distance),
new Cesium.ClippingPlane(new Cesium.Cartesian3(-0.5, 0.0, 0.5), distance),
new Cesium.ClippingPlane(new Cesium.Cartesian3(0.0, 0.0, -1.0), distance)
],
unionClippingRegions: false
});
this.viewer.scene.globe.clippingPlanes = clippingPlanes;
第二种 模型的裁剪:
var entity = viewer.entities.add({
position : position,
model : {
uri : '../../../../Apps/SampleData/models/CesiumAir/Cesium_Air.glb',
scale : 8,
minimumPixelSize : 100.0,
clippingPlanes : clippingPlanes // 设置模型的裁切平面
}
});