cesium实体移动(折线,圆,多边形带边框)

圆的移动就是把圆心赋值为鼠标当前位置,但是我们知道,实体的outline宽度不生效后我们改用的polyline来代替边框,那么我们要做的就不仅是改变圆心,还有边框的位置同样需要改变

折线以及多边形都是通过改变polyline的数组改变位置

Cesium.Cartesian3.subtract(result, start, new Cesium.Cartesian3())计算两个笛卡尔的分量差

Cesium.Cartesian3.add (left, right, result)计算两个笛卡尔的分量和

 

 先使用Cesium.Cartesian3.subtract计算出鼠标移动的笛卡尔分量,再用原本的圆的位置加上这个分量得到新的位置更新到圆的polyline上以及圆心上。同理折线和多边形也是如此

polylineMove(start, result) {
      // 计算平移向量
      const translationMatrix = Cesium.Cartesian3.subtract(result, start, new Cesium.Cartesian3())
      // console.log(translationMatrix)
      // 注意需要赋值三维坐标
      this.overlays[this.overlays.length - 1].polyline.positions = this.overlays[this.overlays.length - 1].polyline.positions._value.map(item => {
        return Cesium.Cartesian3.add(item, translationMatrix, new Cesium.Cartesian3())
      })
    },
 handler.setInputAction((arg) => { 
          const start = this.viewer.camera.pickEllipsoid(arg.startPosition, this.viewer.scene.globe.ellipsoid)
          const result = this.viewer.camera.pickEllipsoid(arg.endPosition, this.viewer.scene.globe.ellipsoid)
          // 笛卡尔坐标转化为地理坐标Cesium.Cartographic.fromCartesian (cartesian, ellipsoid , result )-生成的对象将以弧度表示
          // 更新实体位置为当前鼠标位置
          if (this.overlays[this.overlays.length - 1].name.search('折线') !== -1) {
            // 如果是折线,判断鼠标前后移动向量,所有坐标移动相同位移
            this.polylineMove(start, result)
          }
          if (this.overlays[this.overlays.length - 1].name.search('多边形') !== -1) {
            const translationMatrix = Cesium.Cartesian3.subtract(result, start, new Cesium.Cartesian3())
            this.polygonArr = this.polygonArr.map(item => {
              return Cesium.Cartesian3.add(item, translationMatrix, new Cesium.Cartesian3())
            })
            this.overlays[this.overlays.length - 1].polygon.hierarchy = new Cesium.PolygonHierarchy(this.polygonArr)
            this.polylineMove(start, result)
          }
          if (this.overlays[this.overlays.length - 1].name.search('圆') !== -1) {
            // 计算平移向量
            const translationMatrix = Cesium.Cartesian3.subtract(result, start, new Cesium.Cartesian3())
            // 注意需要赋值三维坐标
            this.polylineMove(start, result)
            // 如果直接把当前移动位置给圆的圆心,会导致圆与圆的边框移动不一致
            this.overlays[this.overlays.length - 1].position = Cesium.Cartesian3.add(this.overlays[this.overlays.length - 1].position._value, translationMatrix, new Cesium.Cartesian3())
          }
        }, Cesium.ScreenSpaceEventType.MOUSE_MOVE)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值