jihongshun
2 天以前 ecc89fd2f61441ea03a264f6111a6089ce4ed2aa
src/utils/components/init-map.vue
@@ -14,6 +14,57 @@
        <el-button  @click="renderData()" type="success">数据渲染</el-button>
      </div>
      <!-- <div class="key-container">
        <div class="arrow-row">
          <div
              class="arrow"
              :class="{ active: activeKey === 'w' }"
            >W</div>
          </div>
          <div class="key-row">
            <div
              class="key"
              :class="{ active: activeKey === 'a' }"
              @mousedown="handleClick('a')"
            >A</div>
            <div
              class="key"
              :class="{ active: activeKey === 's' }"
              @mousedown="handleClick('s')"
            >S</div>
            <div
              class="key"
              :class="{ active: activeKey === 'd' }"
              @mousedown="handleClick('d')"
            >D</div>
          </div>
      </div>
      <div class="key-container">
        <div class="arrow-row">
          <div
              class="arrow"
              :class="{ active: activeKey === 'ArrowUp' }"
              @mousedown="handleClick('ArrowUp')"
            >↑</div>
          </div>
          <div class="key-row">
            <div
              class="key"
              :class="{ active: activeKey === 'ArrowLeft' }"
              @mousedown="handleClick('ArrowLeft')"
            >←</div>
            <div
              class="key"
              :class="{ active: activeKey === 'ArrowDown' }"
              @mousedown="handleClick('ArrowDown')"
            >↓</div>
            <div
              class="key"
              :class="{ active: activeKey === 'ArrowRight' }"
              @mousedown="handleClick('ArrowRight')"
            >→</div>
          </div>
      </div> -->
    </div>
    <!-- 动态坐标、动态相机参数显示 -->
@@ -39,7 +90,11 @@
let  globalon  = 0
let  globalat = 0
let  pois = [globalon, globalat,0] 
let cameraVideo
let ScopeElement; //光轴、视频
let preVideoScopePrimitiveArrTie = [];
let scratchSetViewMatrix3 = new Cesium.Matrix3();
let chooseId
// let  pois = [0, 0,0] 
let holdingPosition;
let rightKeyMove = false
@@ -74,7 +129,9 @@
          space: false,
        },
        animationFrameId: null,
        mergeNumber:null
        mergeNumber:null,
        activeKey: null,
        timer: null,
    }
  },
  mounted(){
@@ -84,6 +141,7 @@
    counter = 0
    this.removeKeyboardEvents();
    if (this.animationFrameId) cancelAnimationFrame(this.animationFrameId);
    window.removeEventListener("keydown", this.handleKeydown);
    if (viewerC) viewerC.destroy();
  },
  methods:{
@@ -98,13 +156,13 @@
        this.loadModel()
        this.addSyncListener()
        this.registerKeyboardEvents();
        let control = viewerC.scene.screenSpaceCameraController;
        control.enableRotate = false;
        control.enableTranslate = false;
        control.enableZoom = false;
        control.enableTilt = false;
        control.enableLook = false;
        viewerC.scene.camera.percentageChanged = 0.05 
        this.cammove_measure_point();
      },1000)
    },
@@ -201,6 +259,7 @@
      // 存下回调以便销毁
      // this._preRenderCallback = () => this.syncViewer();
      viewerM.scene.preRender.addEventListener( this.syncViewer());
      window.addEventListener("keydown", this.handleKeydown);
    },
    syncViewer(){
      console.log(viewerM.camera)
@@ -277,7 +336,41 @@
                const tagert = Cesium.Cartesian3.add(holdingPosition,scalerNormalize,new Cesium.Cartesian3());
                console.log(Cesium.Cartographic.fromCartesian(tagert))
                _this.creatPin("aerialPoiId"+counter,tagert,`空${counter}`,Cesium.Color.RED,viewerM);
                // preVideoScopePrimitiveArrTie = []
                console.log(preVideoScopePrimitiveArrTie)
                console.log(Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).height))
                _this.updateCameraMovement();
                // if(cameraVideo){
                //   viewerM.scene.primitives.remove(cameraVideo)
                // }
              chooseId = crypto.randomUUID()
              //创建视锥体
                let data = {
                    "FHorFieldAngle": 32.13,
                    "FVerFieldAngle": 18.39,
                    "altitude":  Cesium.Cartographic.fromCartesian(tagert).height,
                    "id": chooseId,
                    "chanNo": 1,
                    "latitude": Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).latitude),
                    "longitude":  Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).longitude),
                    "p": 26.8,
                    "t": 351.3,
                    "z": 1,
                }
                const point1 = Cesium.Cartesian3.fromDegrees(0, 0, 50);
                const point2 = Cesium.Cartesian3.fromDegrees(Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).longitude), Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).latitude), Cesium.Cartographic.fromCartesian(tagert).height);
                // 计算距离(单位:米)
                const distance1 = Cesium.Cartesian3.distance(point1, point2)
                console.log(distance1)
                data.distance = distance1
                _this.createVideoScope(data)
                setTimeout(() => {
                  viewerC.camera.changed.addEventListener(_this.onCameraChange)
                }, 100);
                //结束右键监听
                createPinHandler.destroy();
                //结束主图联动鹰眼监听
@@ -510,7 +603,7 @@
      }
      this.resetRoll();
      // Schedule next frame
      this.animationFrameId = requestAnimationFrame(this.updateCameraMovement);
      // this.animationFrameId = requestAnimationFrame(this.updateCameraMovement);
    }, 
    calculateDestinationPoint(lon1, lat1, bearing, distance, radius = 6371000) {
      const toRad = (d) => d * Math.PI / 180;
@@ -579,10 +672,10 @@
      viewerC.camera.flyHome(1.0);
    },
    move_measure_point(){
      CesiumSurvey.measureMovePoint(viewerM,'moveResultCon');
      CesiumSurvey.measureMovePoint(viewerC,'moveResultCon');
    },
    cammove_measure_point(){
      CesiumSurvey.cammeasureMovePoint(viewerM,'cammoveResultCon');
      CesiumSurvey.cammeasureMovePoint(viewerC,'cammoveResultCon');
    },
    renderData(){
        this.$emit('renderData',viewerM)
@@ -623,6 +716,7 @@
          ]
        };
      });
      console.log(result)
      this.$emit('mergePoint',result,this.mergeNumber,viewerM)
    },
    genId() {
@@ -636,7 +730,209 @@
        latitude: Cesium.Math.toDegrees(cartographic.latitude),
        height: cartographic.height
      };
    }
    },
    handleClick(key) {
      this.triggerKey(key);
    },
    triggerKey(key) {
      this.activeKey = key;
      clearTimeout(this.timer);
      this.timer = setTimeout(() => {
        this.activeKey = null;
      }, 200);
      // 自定义动作触发
      console.log("Key triggered:", key);
      // 这里可以发出事件或调用其它方法
    },
    handleKeydown(e) {
      const key = e.key;
      console.log(key)
      const validKeys = ["a", "s", "d", "w",'q','e','ArrowUp','ArrowDown','ArrowLeft','ArrowRight','q','e'];
      if (validKeys.includes(key)) {
        this.triggerKey(key);
      }
      this.updateCameraMovement()
    },
     // 创建初始化的光轴
    createVideoScope(data) {
      console.log(data)
      console.log(data.distance)
      if (data == undefined) {
        this.$message({
          showClose: true,
          message: '暂无数据',
          type: "warning",
        });
      } else {
        ScopeElement = this.createVideoElementOld(
            "http://192.168.5.122:9998/live?port=1234&app=live&stream=mystream",
            data.id,
            1.7778
        );
        // let poi = data.camPosition.split(",");
        // let hight = data.pe_offset.split(",");
        let positionCt3 = Cesium.Cartesian3.fromDegrees(
            Number(data.longitude),
            Number(data.latitude),
            // Number(data.altitude) + Number(hight[1]) + 1.7
            Number(data.altitude)
        );
        console.log(data)
        let inverseViewMatrix = this.hpr2m({
          position: positionCt3, // 相机坐标
          // heading: Cesium.Math.toRadians(Number(120)),
          // pitch: Cesium.Math.toRadians(Number(-5)),
          // roll: Cesium.Math.toRadians(Number(0)),
          heading: Cesium.Math.toRadians(180),
          pitch: Cesium.Math.toRadians(0),
          roll: Cesium.Math.toRadians(0),
        });
        let frustum = new Cesium.PerspectiveFrustum({
          fov: Cesium.Math.toRadians(6),
          aspectRatio: Number(1.77778), // 宽高比
          near: Number(0.05), // 设备焦距
          far: Number(data.distance), // 拍摄距离
        });
         cameraVideo = new Cesium.XbsjCameraVideo({
          inverseViewMatrix: inverseViewMatrix,
          frustum: frustum,
          videoElement: ScopeElement,
          showHelperPrimitive: true,
        });
        cameraVideo._primitive.classificationType = 2; // 同时投影地形和3dtiles数据
        cameraVideo.id =  data.id;
        let isHole = false;
        cameraVideo._primitive.appearance.material = new Cesium.Material({
          fabric: {
            type: "Color",
            uniforms: {
              color: new Cesium.Color(0, 1, 0, 0.2),
            },
          },
        });
        cameraVideo._helperPrimitive.geometryInstances.attributes.color =
            Cesium.ColorGeometryInstanceAttribute.fromColor(
                new Cesium.Color(0, 1.0, 0, 1.0)
            );
        // viewer.scene.primitives.add(cameraVideo);
        let pmObj = {};
        console.log(data)
        pmObj.id = data.id;
        console.log(pmObj)
        pmObj.primitive = cameraVideo;
        // pmCollection.push(pmObj);//幕布,视频转换使用
        viewerM.scene.primitives.add(cameraVideo);
        preVideoScopePrimitiveArrTie.push(pmObj);
        preVideoScopePrimitiveArrTie.map((item)=>{
          console.log(item)
          console.log(chooseId)
          if(item.id != chooseId){
            item.primitive.show = false
          }
        })
      }
      // }
    },
    // 创建光轴下的幕布
    createVideoElementOld(videoSrc, id) {
      var videoElement = document.createElement("div");
      videoElement.id = "video" + id;
      videoElement.style.position = "absolute";
      videoElement.style.zIndex = "-100";
      videoElement.style.background = "green";
      document.getElementById("videoSource").appendChild(videoElement);
      return videoElement;
    },
    //h,p,r转matrix4
    hpr2m(obj, result) {
      // const inverseViewMatrix = Cesium.Transforms.headingPitchRollToFixedFrame(position, headingPitchRoll, undefined, undefined, result);
      const inverseViewMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(
          obj.position,
          undefined,
          result
      );
      let rotMat = Cesium.Matrix3.fromRotationX(
          Cesium.Math.PI_OVER_TWO,
          scratchSetViewMatrix3
      );
      Cesium.Matrix4.multiplyByMatrix3(
          inverseViewMatrix,
          rotMat,
          inverseViewMatrix
      );
      rotMat = Cesium.Matrix3.fromRotationY(
          -obj.heading,
          scratchSetViewMatrix3
      );
      Cesium.Matrix4.multiplyByMatrix3(
          inverseViewMatrix,
          rotMat,
          inverseViewMatrix
      );
      rotMat = Cesium.Matrix3.fromRotationX(obj.pitch, scratchSetViewMatrix3);
      Cesium.Matrix4.multiplyByMatrix3(
          inverseViewMatrix,
          rotMat,
          inverseViewMatrix
      );
      rotMat = Cesium.Matrix3.fromRotationZ(-obj.roll, scratchSetViewMatrix3);
      Cesium.Matrix4.multiplyByMatrix3(
          inverseViewMatrix,
          rotMat,
          inverseViewMatrix
      );
      return inverseViewMatrix;
    },
    onCameraChange() {
      const camera = viewerC.camera;
      const position = camera.positionCartographic;
      const heading = Cesium.Math.toDegrees(camera.heading);
      const pitch = Cesium.Math.toDegrees(camera.pitch);
      const roll = Cesium.Math.toDegrees(camera.roll);
      const point1 = Cesium.Cartesian3.fromDegrees(0, 0, 50);
      const point2 = Cesium.Cartesian3.fromDegrees(Cesium.Math.toDegrees(position.longitude),Cesium.Math.toDegrees(position.latitude),position.height)
      // 计算距离(单位:米)
      const distanceBetween = Cesium.Cartesian3.distance(point1, point2)
      console.log(distanceBetween)
      console.log(preVideoScopePrimitiveArrTie)
      console.log(chooseId)
      preVideoScopePrimitiveArrTie.map((item)=>{
        if(item.id == chooseId){
          let obj = this.updateSZScope(Cesium.Math.toDegrees(position.longitude),Cesium.Math.toDegrees(position.latitude),position.height,heading,pitch,roll,1,distanceBetween)
          item.primitive.inverseViewMatrix = obj.M
          item.primitive.frustum = obj.F
        }
      })
    },
    //更新视椎体位置
    updateSZScope(lon, lat, alt, camHeading, camPitch, camRoll, LightView,distanceBetween) {
      let positionCt3 = Cesium.Cartesian3.fromDegrees(
          Number(lon),
          Number(lat),
          Number(alt)
      );
      console.log(positionCt3)
      console.log(distanceBetween)
      let frustum = new Cesium.PerspectiveFrustum({
        fov: Cesium.Math.toRadians(LightView),
        aspectRatio: Number(1.77778),
        near: Number(0.05),
        far: Number(distanceBetween),
      });
      console.log(frustum)
      let inverseViewMatrixNew = this.hpr2m({
        position: positionCt3,
        heading: Cesium.Math.toRadians(Number(camHeading)),
        pitch: Cesium.Math.toRadians(Number(camPitch)),
        roll: Cesium.Math.toRadians(Number(camRoll)),
      });
      console.log(inverseViewMatrixNew)
      return {M: inverseViewMatrixNew, F: frustum};
    },
  }
}
</script>
@@ -691,3 +987,46 @@
.box_rb{width:10px;height:10px;position:absolute;border-bottom:2px solid #00d3e7;border-right:2px solid #00d3e7;right:0px;bottom:0px;}
.box_lb{width:10px;height:10px;position:absolute;border-bottom:2px solid #00d3e7;border-left:2px solid #00d3e7;left:0px;bottom:0px;}
</style>
<style scoped>
.key-container {
  display: inline-block;
  background-color: rgba(0, 0, 0, 0.7);
  padding: 8px 10px;
  border-radius: 10px;
  color: white;
  font-family: sans-serif;
  margin-top: 55px;
}
.arrow-row{
  display: flex;
  justify-content: center;
  margin-bottom: 4px;
}
.key-row {
  display: flex;
  justify-content: space-between;
  margin-bottom: 4px;
}
.arrow,
.key {
  width: 30px;
  height: 30px;
  margin: 0 2px;
  background-color: #333;
  border-radius: 4px;
  display: flex;
  justify-content: center;
  align-items: center;
  font-weight: bold;
  transition: background-color 0.2s;
  cursor: pointer;
}
.arrow.active,
.key.active {
  background-color: #00aaff;
}
</style>