CESIUM例子学习(十一)——3DTiles Clipping Planes(2)

前面一节学习了剖切模型的交互方法,这一节学习剖切BIM的方法,看了一下代码,现在对BIM的剖切其实用的是3dtiles的clippingPlanes可选属性,也就是说不仅仅是BIM,只要是3dtiles都可以剖切的,下面验证一下我的想法。下面用倾斜摄影做剖切测试。

方法与模型加载剖切面类似,只是剖切面绑定时有一点点变化。因为3dtiles的构造函数是Cesium3DTileset,所以绑定是Cesium3DTileset的可选参数clippingPlanes。代码如下:

function add3dtiles (url, height = 0) {
    clippingPlanes = new Cesium.ClippingPlaneCollection({
        planes: [//切面
            new Cesium.ClippingPlane(
                new Cesium.Cartesian3(0.0, 0.0, 1.0),
                0.0
            ),
        ],
        edgeWidth: 2.0,// 切面与模型相交线的线宽,如果不需要切面边线,可设置为0
        edgeColor: planeColor //切面颜色
    });
    var tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
        url: url,
        clippingPlanes: clippingPlanes
    }))
    tileset.readyPromise.then((tileset) => {
        changeHeight(tileset, height)
        var modelMatrix = tileset.modelMatrix
        var boundingSphere = tileset.boundingSphere;
        var radius = boundingSphere.radius;
        viewer.flyTo(tileset)
        //加载切面到场景中
        for (var i = 0; i < clippingPlanes.length; ++i) {
            var plane = clippingPlanes.get(i);
            viewer.entities.add({
                position: boundingSphere.center,//3dtiles中心
                modelMatrix: modelMatrix,
                plane: {
                    dimensions: new Cesium.Cartesian2(radius * 2.0, radius * 2.0),
                    material: planeColor.withAlpha(0.1),
                    modelMatrix: modelMatrix,
                    plane: new Cesium.CallbackProperty(createPlaneUpdateFunction(plane), false),
                    outline: true,
                    outlineColor: planeColor,
                },
            });
        }
    })
}

加载剖切面时,需要从3dtiles的包围球中获取到3dtiles的中心,平移矩阵添加的也是3dtiles的平移矩阵。这个例子还是可以有一些应用场景的,比如,违建控高、低洼填平。问题也很多,跟模型剖切一样,所以要应用还有很长的路要走……要走……走……

你可能感兴趣的:(cesium,3dtiles,3DTiles,Clipping,Planes)