var clippingPlanes; var planesDistance = []; function modelClip(){ clippingPlanes = new Cesium.ClippingPlaneCollection({ planes : [ new Cesium.ClippingPlane(new Cesium.Cartesian3(0.0,0.0,-0.5), 0.0) ], unionClippingRegions: true, edgeColor : Cesium.Color.RED, edgeWidth : 1 }); // 设置模型的裁切平面clippingPlanes tileset.readyPromise.then(function() { var boundingSphere = tileset.boundingSphere; var radius = boundingSphere.radius; tileset.clippingPlanes = clippingPlanes; //viewer.zoomTo(tileset, new Cesium.HeadingPitchRange(0.5, -0.2, radius * 4.0)); if (!Cesium.Matrix4.equals(tileset.root.transform, Cesium.Matrix4.IDENTITY)) { var transformCenter = Cesium.Matrix4.getTranslation(tileset.root.transform, new Cesium.Cartesian3()); var height = Cesium.Cartesian3.distance(transformCenter, tileset.boundingSphere.center); clippingPlanes.modelMatrix = Cesium.Matrix4.fromTranslation(new Cesium.Cartesian3(0.0, 0.0,height));//height 1.041250292910165e-9 // //裁切面位置移动 var cartographic = Cesium.Cartographic.fromCartesian(tileset.boundingSphere.center);//tileset.boundingSphere.center配置文件坐标位置信息 var surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0); var offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0); //调整3dtilies 高度 var translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3()); tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation); //改变3dtiles高度 } for (var i = 0; i < clippingPlanes.length; ++i) { var plane = clippingPlanes.get(i); planeEntity = viewer.entities.add({ //添加平面实体 直观裁切面 position :boundingSphere.center,// offset, 根据3dtiles同步调整裁切面高度 name:'clip', plane : { dimensions : new Cesium.Cartesian2(radius * 2.5, radius * 2.5),//(radius * 2.5, radius * 2.5), material : Cesium.Color.WHITE.withAlpha(0.5), plane : new Cesium.CallbackProperty(createPlaneUpdateFunction(plane), true), outline : true, fill:true, outlineColor : Cesium.Color.WHITE } }); } }); var selectedPlane; var ellipsoid = viewer.scene.globe.ellipsoid; // 注册鼠标事件 var downHandler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);//鼠标点击事件 downHandler.setInputAction(function (movement) { var position = viewer.scene.camera.pickEllipsoid(movement.position, viewer.scene.globe.ellipsoid); //console.log(position); var pickObject = viewer.scene.pick(movement.position); //debugger; if (Cesium.defined(pickObject) && Cesium.defined(pickObject.id) && Cesium.defined(pickObject.id.plane)) { selectedPlane = pickObject.id.plane;//将entities selectedPlane.name = pickObject.id.name//将name赋予selectedPlane selectedPlane.material = Cesium.Color.WHITE.withAlpha(0.05); selectedPlane.outlineColor = Cesium.Color.WHITE;//更换切面的颜色 selectedPlane.startPosition = movement.position;// selectedPlane.startPosition1 = Cesium.Math.toDegrees((ellipsoid.cartesianToCartographic(position).longitude));//初始位置维度 viewer.scene.screenSpaceCameraController.enableInputs = false; // 取消默认的鼠标一切输入事件 } }, Cesium.ScreenSpaceEventType.LEFT_DOWN); // 注册鼠标松开事件 var upHandler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);//鼠标点击向上事件 upHandler.setInputAction(function () { if (Cesium.defined(selectedPlane)) {//如果存在这个对象 selectedPlane.material = Cesium.Color.WHITE.withAlpha(0.6); // 恢复选中的切面颜色 selectedPlane.outlineColor = Cesium.Color.blue;// selectedPlane = undefined; } viewer.scene.screenSpaceCameraController.enableInputs = true; // 恢复默认的鼠标一切输入事件 }, Cesium.ScreenSpaceEventType.LEFT_UP); // 注册鼠标移动事件, var moveHandler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);//鼠标点击移动事件 moveHandler.setInputAction(function (movement) { //通过指定的椭球或者地图对应的坐标系,将鼠标的二维坐标转换为对应椭球体三维坐标 var cartesianEnd = viewer.camera.pickEllipsoid(movement.endPosition, ellipsoid);//笛卡尔积,获取鼠标移动结束世界坐标 var cartesianStart = viewer.camera.pickEllipsoid(movement.startPosition, ellipsoid);//笛卡尔积,获取鼠标开始移动时世界坐标 if (Cesium.defined(selectedPlane)) { // console.log(selectedPlane.name);//做判断哪个面 if (selectedPlane.name == "clip") {//往下 var deltaSize = movement.startPosition.y - movement.endPosition.y; // 计算鼠标移动的过程中产生的垂直高度距离 var beforSize = planesDistance[selectedPlane.name]?planesDistance[selectedPlane.name]:0; var absDelta = Math.abs(deltaSize); for(var x=0;x<absDelta;x++){ if(deltaSize>0){ clippingPlanes.get(0).distance = beforSize + 1; planesDistance[selectedPlane.name] = beforSize + 1 ;//更改鼠标移动的幅度//从初始位置开始算 }else{ clippingPlanes.get(0).distance = beforSize - 1; planesDistance[selectedPlane.name] = beforSize - 1 ;//更改鼠标移动的幅度//从初始位置开始算 } //createPlaneUpdateFunction(clippingPlanes.get(0),0); } } } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); } function createPlaneUpdateFunction(plane) { return function () { //plane.distance = 10; // targetY 设置裁切面高度 var moves = planesDistance['clip']; moves = moves?moves:0; plane.distance = moves;//切面距离原点的距离就等于移动的距离+模型的半径的一半 return plane; }; }
Cesium 模型裁剪
最新推荐文章于 2024-06-29 15:46:43 发布