cesium实现道路飞行

/** 飞行过程中,模型进行移动
 * @param {Array} positions 位置
 * @param {Number} speed 速度
 */
var onTickEvent;
export function carMove(positions, speed) {
  if (!positions) return;

  var allDis = 0;
  for (var index = 0; index < positions.length - 1; index++) {
    var dis = Cesium.Cartesian3.distance(positions[index], positions[index + 1]);
    allDis += dis;
  }

  var v = speed; // 控制速度

  var playTime = allDis / v;
  // 起始时间
  var startTime = window.viewer.clock.currentTime;
  // 结束时间
  var endTime = Cesium.JulianDate.addSeconds(startTime, playTime, new Cesium.JulianDate());
  var property = new Cesium.SampledPositionProperty();
  var t = 0;
  for (var i = 1; i < positions.length; i++) {
    if (i === 1) {
      property.addSample(startTime, positions[0]);
    }
    var disi = Cesium.Cartesian3.distance(positions[i], positions[i - 1]);
    var time = disi / v + t;
    var julianDate = Cesium.JulianDate.addSeconds(startTime, time, new Cesium.JulianDate());
    property.addSample(julianDate, positions[i]);
    t += disi / v;
  }
  // 设置平滑轨迹(利用插值实现)
  property.setInterpolationOptions({
    interpolationDegree: 1, // 值越大,越平滑,拐角越趋向圆形
    interpolationAlgorithm: Cesium.LagrangePolynomialApproximation
  });

  let trackedEntity = window.viewer.entities.add({
    name: '道路飞行',
    position: property,
    orientation: new Cesium.VelocityOrientationProperty(property),
    label: {
      text: '',
      fillColor: Cesium.Color.RED,
      pixelOffset: new Cesium.Cartesian2(0, -30)
    },
    model: {
      uri: process.env.VUE_APP_PUBLICE_PATH + 'libs/models/Cesium_Ground.gltf',
      scale: 3,
      // 最小刻度
      minimumPixelSize: 70,
      heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
    }
  });
  // 设置时钟当前时间
  window.viewer.clock.currentTime = startTime;
  // 时间速率,数字越大时间过的越快
  window.viewer.clock.multiplier = 1;
  window.viewer.clock.shouldAnimate = true;
  // 设置始终停止时间
  window.viewer.clock.stopTime = endTime;
  window.viewer.trackedEntity = trackedEntity;
  // 实时调整位置
  function adjust() {
    // 获取当前模型方向和位置
    // trackedEntity 为模型对象
    const orientation = trackedEntity.orientation;
    const position = trackedEntity.position;
    if (window.viewer.clock.shouldAnimate === true) {
      // 获取偏向角
      let ori = orientation.getValue(window.viewer.clock.currentTime);
      // 获取位置
      let center = position.getValue(window.viewer.clock.currentTime);
      // 1、由四元数计算三维旋转矩阵
      var mtx3 = Cesium.Matrix3.fromQuaternion(ori);
      // 2、计算四维转换矩阵:
      var mtx4 = Cesium.Matrix4.fromRotationTranslation(mtx3, center);
      // 3、计算角度:
      var hpr = Cesium.Transforms.fixedFrameToHeadingPitchRoll(mtx4);
      // 获取角度(弧度)
      const headingTemp = hpr.heading;
      const pitchTemp = hpr.pitch;
      // 调整角度为第一人称,注意调整的角度
      const heading = Cesium.Math.toRadians(Cesium.Math.toDegrees(headingTemp) + 90);
      const pitch = Cesium.Math.toRadians(Cesium.Math.toDegrees(pitchTemp) - 50);
      // 视角高度,根据模型大小调整
      const range = 2000.0;
      // 动态改变模型视角
      window.viewer.camera.lookAt(center, new Cesium.HeadingPitchRange(heading, pitch, range));
    }
  }
  onTickEvent = window.viewer.clock.onTick.addEventListener(adjust);
}

Cesium是一个用于创建3D地球和地图的JavaScript库。要在Cesium实现飞机飞行,你可以首先创建一个代表飞机的3D模型,并将其添加到Cesium场景中。然后,你可以使用Cesium的实体(Entity)和样条路径(Spline)功能来模拟飞行路径。 首先,你需要在Cesium中加载飞机的3D模型。你可以使用Cesium的3D模型加载器来加载模型文件,例如Gltf或Collada格式的文件。加载模型后,你可以将其添加到Cesium的场景(Scene)中。 接下来,你可以使用实体(Entity)来表示飞机。实体是Cesium中的一个概念,它代表场景中的一个可视对象。你可以为飞机创建一个实体,并设置其位置、方向和姿态等属性。通过更新实体的属性,你可以模拟飞机在场景中的移动和旋转。 为了实现飞行路径,你可以使用样条路径(Spline)功能。Cesium提供了一个样条路径插值器(CatmullRomSpline)来生成平滑的飞行路径。你可以根据你想要的路径点的位置和时间信息,使用插值器来计算出飞机在每个时间点的位置。然后,通过设置实体的位置属性,让飞机沿着计算出的路径进行飞行。 最后,你可以使用Cesium的时间控制功能来控制飞行的速度和时间进度。通过调整时间的流逝速度,你可以模拟飞机的飞行速度。你还可以使用Cesium的摄像机控制功能来跟踪飞机,使其在飞行过程中始终保持在视野中心。 总结来说,要在Cesium实现飞机飞行,你需要加载飞机模型、创建实体表示飞机、使用样条路径生成飞行路径,并使用时间和摄像机控制功能来控制飞行过程。这样,你就可以在Cesium实现一个基本的飞机飞行效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值