cesium 3dtiles 模型裁切

cesium 3dtiles 模型裁切CesiumSandca 官网示例熟悉 cesium 的 apiClippingP ClippingPlan Plane Cesium3DTile CallbackProp 可以控制裁切方向 值不同 裁切方向也不同水平裁切垂直裁切 mapReady 地图加载完成 this initMouseEvt 添加鼠标事件 点击裁切按钮执行 tiles

Cesium Sandcastle   官网示例,包括实体、3dtiles等的裁切

熟悉cesium 的api 

  • ClippingPlaneCollection
  • ClippingPlane
  • Plane
  • Cesium3DTileset
  • CallbackProperty

ClippingPlane 可以控制裁切方向,值不同,裁切方向也不同

 水平裁切

cesium 3dtiles 模型裁切

垂直裁切 

cesium 3dtiles 模型裁切

下面是3dtiles裁切的代码逻辑,仅供参考

mapReady(){ // 地图加载完成 this.initMouseEvt(); // 添加鼠标事件 }

 点击裁切按钮 执行

tileset = new Cesium.Cesium3DTileset({ url: config.serverUrl + "/osgbresult/tileset.json", skipLevelOfDetail: true, preferLeaves: true, maximumMemoryUsage: 1024 }); viewer.scene.primitives.add(tileset); this.loadTileset(tileset)
 loadTileset(tileset) { const { viewer, Cesium } = window.$cesiumInstance; clippingPlanes = new Cesium.ClippingPlaneCollection({ planes: [ new Cesium.ClippingPlane(new Cesium.Cartesian3(1.0, 0.0, 0.0), 0.0) //裁切方向 ], edgeWidth: 1.0 }); tileset.clippingPlanes = clippingPlanes let _this = this; const boundingSphere = tileset.boundingSphere; const radius = boundingSphere.radius; viewer.zoomTo( tileset, new Cesium.HeadingPitchRange(0.5, -0.2, radius * 4.0) ); if ( !Cesium.Matrix4.equals( tileset.root.transform, Cesium.Matrix4.IDENTITY ) ) { // The clipping plane is initially positioned at the tileset's root transform. // Apply an additional matrix to center the clipping plane on the bounding sphere center. const transformCenter = Cesium.Matrix4.getTranslation( tileset.root.transform, new Cesium.Cartesian3() ); const transformCartographic = Cesium.Cartographic.fromCartesian( transformCenter ); const boundingSphereCartographic = Cesium.Cartographic.fromCartesian( tileset.boundingSphere.center ); const height = boundingSphereCartographic.height - transformCartographic.height; clippingPlanes.modelMatrix = Cesium.Matrix4.fromTranslation( new Cesium.Cartesian3(0.0, 0.0, height) ); } for (let i = 0; i < clippingPlanes.length; ++i) { const plane = clippingPlanes.get(i); const planeEntity = viewer.entities.add({ position: boundingSphere.center, plane: { dimensions: new Cesium.Cartesian2(radius * 2.5, radius * 2.5), material: Cesium.Color.WHITE.withAlpha(0.1), plane: new Cesium.CallbackProperty( _this.createPlaneUpdateFunction(plane), false ), outline: true, outlineColor: Cesium.Color.WHITE } }); planeEntities.push(planeEntity); } },
initMouseEvt() { var selectedPlane; let _this = this; const { viewer, Cesium } = window.$cesiumInstance; var ellipsoid = viewer.scene.globe.ellipsoid; var scene = viewer.scene // 注册鼠标事件 var downHandler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); //鼠标点击事件 downHandler.setInputAction(function(movement) { const pickedObject = scene.pick(movement.position); if ( Cesium.defined(pickedObject) && Cesium.defined(pickedObject.id) && Cesium.defined(pickedObject.id.plane) ) { selectedPlane = pickedObject.id.plane; selectedPlane.material = Cesium.Color.WHITE.withAlpha(0.05); selectedPlane.outlineColor = Cesium.Color.WHITE; 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) { //通过指定的椭球或者地图对应的坐标系,将鼠标的二维坐标转换为对应椭球体三维坐标 if (Cesium.defined(selectedPlane)) { const deltaY = movement.startPosition.x - movement.endPosition.x; targetY += deltaY; } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); },

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/212527.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午7:51
下一篇 2026年3月18日 下午7:51


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号