DIY_v 2022-09-02 13:22 采纳率: 0%
浏览 32
已结题

Cesium渲染模型按点飞行问题

Cesium渲染模型按点飞行问题,有没有好人给解答一下
代码如下:
说明:这是个react项目里面使用的cesium,所以下面使用的方法没有带this,方法之间调用是OK的,这些都是网上找的

let lnglatArr = [
        [121.527589, 38.957547],
        [121.527825, 38.960166],
        [121.536472, 38.959098],
        [121.540442, 38.958464],
        [121.543489, 38.958131],
        [121.542888, 38.955861],
        [121.542266, 38.953325],
    ]
      addTrackLine(lnglatArr)
      
      // 模型飞动
      function addTrackLine(positions) {
          let timeObj = getSiteTimes(positions, 50);
          // console.log(timeObj.siteTimes,timeObj.timeSum)
          let startTime = Cesium.JulianDate.fromDate(new Date());
          let stopTime = Cesium.JulianDate.addSeconds(startTime, timeObj.timeSum, new Cesium.JulianDate());
          viewer.clock.startTime = startTime.clone();
          viewer.clock.stopTime = stopTime.clone();
          viewer.clock.currentTime = startTime.clone();
          viewer.clock.clockRange = Cesium.ClockRange.CLAMPED;
          let property = computeCirclularFlight(positions, startTime, timeObj.siteTimes);
          console.log(property)
          viewer.entities.add({
              availability: new Cesium.TimeIntervalCollection([new Cesium.TimeInterval({
                  start: startTime,
                  stop: stopTime
              })]),
               position: property,
              orientation: new Cesium.VelocityOrientationProperty(property),
              model: {
                  uri: "static/Bee.glb",
                  scale: 0.5
              },
              path: {
                  resolution: 1,
                  material: new Cesium.PolylineGlowMaterialProperty({
                      glowPower: 0.1,
                      color: Cesium.Color.YELLOW
                  }),
                  width: 10
              }
          });
      }



    //获取飞行的动画点位
    function computeCirclularFlight(pArr, startTime, siteTimes) {
        var property = new Cesium.SampledPositionProperty();
        for (var i = 0; i < pArr.length; i++) {
            // console.log('秒数',startTime,'天数',siteTimes[i])
            const time = Cesium.JulianDate.addSeconds(startTime, siteTimes[i], new Cesium.JulianDate());
            console.log('Time',time)
            property.addSample(time, pArr[i]);
        }
        console.log('property',property)
        return property;
    }
    function spaceDistance(positions) {
        let distance = 0;
        for (let i = 0; i < positions.length-1; i++) {
          // console.log(positions[i])
            if(positions[i] !== undefined){
              // WGS84坐标转弧度
              let point1cartographic = Cesium.Cartographic.fromDegrees(...positions[i]);
              let point2cartographic = Cesium.Cartographic.fromDegrees(...positions[i + 1]);
              // console.log('值来',point1cartographic,point2cartographic)
              /**根据经纬度计算出距离**/
              let geodesic = new Cesium.EllipsoidGeodesic();
              geodesic.setEndPoints(point1cartographic, point2cartographic);
              let s = geodesic.surfaceDistance;
              // //返回两点之间的距离
              s = Math.sqrt(Math.pow(s, 2) + Math.pow(point2cartographic.height - point1cartographic.height, 2));
              distance = distance + s;
            }
        }
        return distance.toFixed(2);
    }
    // 计算每个点位时间和总时间
    function getSiteTimes(positions, speed) {
        let timeSum = 0;
        let times = [];
        for (let i = 0; i < positions.length; i++) {
            if (i === 0) {
                times.push(0);
            }
            timeSum += spaceDistance([positions[i - 1], positions[i]]) / speed;
            console.log('timeSum',timeSum)
            times.push(timeSum);
        }
        return {
            timeSum,
            siteTimes: times,
        };
    }

其中如果把里面的position: property,就不报错了,但是没有模型。

viewer.entities.add({
              availability: new Cesium.TimeIntervalCollection([new Cesium.TimeInterval({
                  start: startTime,
                  stop: stopTime
              })]),
              // position: property,
              orientation: new Cesium.VelocityOrientationProperty(property),
              model: {
                  uri: "static/Bee.glb",
                  scale: 0.5
              },
              path: {
                  resolution: 1,
                  material: new Cesium.PolylineGlowMaterialProperty({
                      glowPower: 0.1,
                      color: Cesium.Color.YELLOW
                  }),
                  width: 10
              }
          });

发现是computeCirclularFlight这个方法最后反的值好像有问题,但是我不确定这方法里面的cesium函数用的是否正常,有没有好人给看一下,或者有没有成熟的案例给分享下呗

  • 写回答

1条回答 默认 最新

  • 崽崽的谷雨 2022-09-02 14:48
    关注
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月14日
  • 创建了问题 9月2日

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境