Cesium 二三维切换

Cesium 二三维切换

关键是切换后视角的计算
使用mars3d的map.setCameraView:

    switch2D3D() {
      let map = getMap();
      if (!map) return;
      let view = map.getCameraView();
      if (map.scene.mode == Cesium.SceneMode.SCENE3D) {
        let pitch = ((0 - view.pitch) * Math.PI) / 180;
        let length = view.alt / Math.tan(pitch);
        let newAlt = view.alt / Math.sin(pitch);
        let pos = getNextPosition(view.lng, view.lat, 0 - view.heading, length);
        let pos2 = toDegrees(map, pos);
        map.setCameraView(
          {
            lng: pos2.lng,
            lat: pos2.lat,
            alt: newAlt,
          },
          {
            complete: () => {
              map.scene.mode = Cesium.SceneMode.SCENE2D;
            },
          }
        );
      } else {
        map.scene.mode = Cesium.SceneMode.SCENE3D;
        let pitch = (25 * Math.PI) / 180;
        let length = view.alt * Math.cos(pitch);
        let newAlt = view.alt * Math.sin(pitch);
        let pos = getNextPosition(
          view.lng,
          view.lat,
          180 - view.heading,
          length
        );
        let pos2 = toDegrees(map, pos);
        map.setCameraView({
          lng: pos2.lng,
          lat: pos2.lat,
          alt: newAlt,
          heading: view.heading,
          pitch: -25,
        });
      }
    }

使用cesium的scene.camera.flyTo:

    switch2D3D() {
      let map = getMap();
      if (!map) return;
      let view = map.getCameraView();
      if (map.scene.mode == Cesium.SceneMode.SCENE3D) {
        let pitch = ((0 - view.pitch) * Math.PI) / 180;
        let length = view.alt / Math.tan(pitch);
        let newAlt = view.alt / Math.sin(pitch);
        let pos = getNextPosition(view.lng, view.lat, 0 - view.heading, length);
        let pos2 = toDegrees(map, pos);
        map.scene.camera.flyTo({
          destination: new Cesium.Cartesian3.fromDegrees(
            pos2.lng,
            pos2.lat,
            newAlt
          ),
          complete: () => {
            map.scene.mode = Cesium.SceneMode.SCENE2D;
          },
        });
      } else {
        map.scene.mode = Cesium.SceneMode.SCENE3D;
        let pitch = (25 * Math.PI) / 180;
        let length = view.alt * Math.cos(pitch);
        let newAlt = view.alt * Math.sin(pitch);
        let pos = getNextPosition(
          view.lng,
          view.lat,
          180 - view.heading,
          length
        );
        let pos2 = toDegrees(map, pos);
        map.scene.camera.flyTo({
          destination: Cesium.Cartesian3.fromDegrees(
            pos2.lng,
            pos2.lat,
            newAlt
          ),
          orientation: {
            heading: Cesium.Math.toRadians(view.heading),
            pitch: Cesium.Math.toRadians(-25.0),
            roll: 0.0,
          },
        });
      }
    }
posted @ 2024-12-03 14:35  0611163  阅读(602)  评论(0)    收藏  举报