Cesium地形开挖 (根据所给的点,自定义形状)

cesium在我们的gis开发中经常会用到,而这其中,我们常常需要用到地形开挖这个功能,那么今天我就根据官网示例的代码,帮助大家完成一个cesium地形开挖的例子.

效果图

首先我们先来看一下实现的效果

那么我们接下来一起来完成这个效果

第一步

利用cdn来引入cesium

 <script src="https://cdnjs.cloudflare.com/ajax/libs/cesium/1.101.0/Cesium.js"></script>
    <link
      href="https://cdnjs.cloudflare.com/ajax/libs/cesium/1.101.0/Widgets/widgets.min.css"
      rel="stylesheet"
    />

第二步

加载地球

 html,
      body,
      #cesiumContainer {
        width: 100%;
        height: 100%;
        margin: 0;
        padding: 0;
        overflow: hidden;
      }
    </style>
  </head>
  <body>
    <div id="cesiumContainer">
    </div>



Cesium.Ion.defaultAccessToken =
        'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJiMmM0NmVlNC1lNmQwLTQxMzktOTkyMy0zOTJkMGQ4ZDJiMmMiLCJpZCI6MTM3MDgsInNjb3BlcyI6WyJhc2wiLCJhc3IiLCJhc3ciLCJnYyJdLCJpYXQiOjE1NjM4Njc3MjJ9.jx48UCxoKCjDWPVfXZnAkUYDPORWEyIvWrg2ZFuwdRk'
      const Viewer = new Cesium.Viewer('cesiumContainer', {
        terrainProvider: Cesium.createWorldTerrain(),
      })

第三步 创建剪切平面 进行地形剖切

 let points
      // 假设以下变量是根据用户界面交互来控制的
      let clippingPlanesEnabled = true // 控制是否启用剪切平面
      let edgeStylingEnabled = true // 控制是否启用边缘样式
      const globe = Viewer.scene.globe
      
     function loadStHelens() {
        // 创建剪切平面的坐标点
        points = [
          new Cesium.Cartesian3(
            -1182592.8630924462,
            5515580.9806405855,
            2966674.365247578
          ),
          new Cesium.Cartesian3(
            -1183337.777477057,
            5515825.617716778,
            2965927.4345367434
          ),
          new Cesium.Cartesian3(
            -1184508.4932830015,
            5515571.328839522,
            2965932.974956288
          ),
          new Cesium.Cartesian3(
            -1185587.0332886775,
            5514889.448799464,
            2966764.2948399023
          ),
          new Cesium.Cartesian3(
            -1185099.0292063756,
            5514576.687407264,
            2967535.347584739
          ),
          new Cesium.Cartesian3(
            -1182840.9384216308,
            5515224.64431188,
            2967234.1119776894
          ),
        ]
        const pointsLength = points.length
        const clippingPlanes = []
        for (let i = 0; i < pointsLength; ++i) {
          const nextIndex = (i + 1) % pointsLength
          let midpoint = Cesium.Cartesian3.add(
            points[i],
            points[nextIndex],
            new Cesium.Cartesian3()
          )
          midpoint = Cesium.Cartesian3.multiplyByScalar(midpoint, 0.5, midpoint)

          const up = Cesium.Cartesian3.normalize(
            midpoint,
            new Cesium.Cartesian3()
          )
          let right = Cesium.Cartesian3.subtract(
            points[nextIndex],
            midpoint,
            new Cesium.Cartesian3()
          )
          right = Cesium.Cartesian3.normalize(right, right)

          let normal = Cesium.Cartesian3.cross(
            right,
            up,
            new Cesium.Cartesian3()
          )
          normal = Cesium.Cartesian3.normalize(normal, normal)

          const originCenteredPlane = new Cesium.Plane(normal, 0.0)
          const distance = Cesium.Plane.getPointDistance(
            originCenteredPlane,
            midpoint
          )

          clippingPlanes.push(new Cesium.ClippingPlane(normal, distance))
        }

        globe.clippingPlanes = new Cesium.ClippingPlaneCollection({
          planes: clippingPlanes,
          edgeWidth: edgeStylingEnabled ? 1.0 : 0.0,
          edgeColor: Cesium.Color.WHITE,
          enabled: clippingPlanesEnabled,
        })
        globe.backFaceCulling = true
        globe.showSkirts = true
      }

      // 在合适的时机调用 loadStHelens 函数
      loadStHelens()

最后 我们就实现了 一个地形开挖的简单例子 ,希望可以帮助到大家.

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值