cesium 3dtiles 模型裁切

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

熟悉cesium 的api 

  • ClippingPlaneCollection
  • ClippingPlane
  • Plane
  • Cesium3DTileset
  • CallbackProperty

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

 水平裁切

垂直裁切 

下面是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);
    },

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Cesium 提供了一个功能强大的 JavaScript 库,可以让您轻松地加载、显示和交互式地管理三维模型。您可以使用 Cesium 的 API 来加载三维模型,并使用 Cesium 提供的功能来控制和管理模型。 ### 回答2: Cesium是一个用于构建三维地理信息应用程序的开源JavaScript库。它提供了加载和显示三维模型的功能,下面是使用Cesium加载三维模型的步骤: 1. 下载和引入Cesium库:首先,你需要从Cesium官方网站上下载Cesium库,并将其引入你的HTML页面中。你可以使用以下代码将Cesium库引入到你的页面中: ```html <script src="path-to-cesium/Cesium.js"></script> <link rel="stylesheet" href="path-to-cesium/Cesium.css"> ``` 2. 创建一个Cesium Viewer对象:接下来,你需要创建一个Cesium Viewer对象,用于加载和显示三维模型。你可以使用以下代码创建一个Cesium Viewer对象: ```javascript var viewer = new Cesium.Viewer('cesiumContainer'); ``` 其中,'cesiumContainer'是一个div元素的ID,用于作为渲染三维场景的容器。 3. 加载三维模型:你可以使用`viewer`对象的`entities`属性来加载三维模型。通过创建一个`Entity`对象,并在其中指定模型的URL,然后将该对象添加到`viewer`的`entities`属性中,即可加载三维模型。示例代码如下: ```javascript var position = Cesium.Cartesian3.fromDegrees(longitude, latitude, height); var modelUrl = 'path-to-model/model.glb'; var entity = viewer.entities.add({ position: position, model: { uri: modelUrl, }, }); ``` 其中,`longitude`、`latitude`和`height`是模型的位置信息,`path-to-model/model.glb`是模型文件的URL。 4. 控制三维模型的显示属性:你可以使用`Entity`对象的其他属性来控制三维模型的显示属性,例如设置模型的旋转角度、缩放比例、颜色等。 以上就是使用Cesium加载三维模型的基本步骤。通过按照以上步骤操作,你可以将自定义的三维模型加载到Cesium的场景中,并通过控制属性来调整模型的显示效果。 ### 回答3: 在Cesium中加载三维模型可以通过以下步骤完成: 1. 准备模型:首先,需要准备一个支持的三维模型文件,如COLLADA(.dae)、glTF(.gltf/.glb)或3D Tiles(.json)。可以通过第三方建模软件或在线模型库获取模型文件。 2. 引入Cesium库:在HTML文件中引入Cesium库,可以通过使用Cesium的CDN或者下载库文件到本地引入。 3. 创建场景:使用Cesium的Viewer对象创建一个场景,指定场景的容器元素,例如一个div元素。 4. 加载模型:使用Cesium的Model类加载三维模型文件。可以通过Model.fromGltf、Model.fromGltfUrl或Model.fromGltfResource等方法来加载模型文件。通过指定模型文件的URL或资源对象来加载模型文件。加载成功后,模型会自动添加到场景中,并根据需要进行位置、旋转和缩放等调整。 以下是一个简单的示例,加载一个COLLADA模型文件: ``` <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Load 3D Model in Cesium</title> <style> #cesiumContainer { width: 100%; height: 600px; } </style> <script src="https://cesium.com/downloads/cesiumjs/releases/1.87/Build/Cesium/Cesium.js"></script> </head> <body> <div id="cesiumContainer"></div> <script> // 创建场景 var viewer = new Cesium.Viewer("cesiumContainer"); // 加载模型 var model = viewer.scene.primitives.add(Cesium.Model.fromGltf({ url: "path/to/your/model.dae" })); // 调整模型位置、缩放、旋转等 model.scale = 0.5; model.rotation.x = Cesium.Math.toRadians(90); // 其他调整... // 重渲染场景 viewer.scene.requestRender(); </script> </body> </html> ``` 需要注意的是,加载较大的模型文件可能会导致加载时间较长或浏览器卡顿,可以提前进行模型优化或使用Cesium的量级切片(3D Tiles)进行加载以提高性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值