Cesium根据飞机飞行姿态添加飘带

Cesium根据飞机飞行姿态添加飘带

在这里插入图片描述

  // 计算飘带顶点的函数
  function computeRibbonVertices(
    position: any,
    heading: any,
    pitch: any,
    roll: any,
    length: any,
    width: any
  ) {
    var halfWidth = width / 2;
    let hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll);
    // 创建变换矩阵
    var transform = Cesium.Transforms.headingPitchRollToFixedFrame(
      position,
      hpr
    );
    // 计算飘带的起点和终点
    let startPoint = Cesium.Matrix4.multiplyByPoint(
      transform,
      new Cesium.Cartesian3(-length, 0, 0),
      new Cesium.Cartesian3()
    );
    let endPoint = Cesium.Matrix4.multiplyByPoint(
      transform,
      new Cesium.Cartesian3(length, 0, 0),
      new Cesium.Cartesian3()
    );

    // 计算飘带的左右边缘点
    let upVector = new Cesium.Cartesian3(0, 0, 1);
    let forwardVector = Cesium.Cartesian3.normalize(
      Cesium.Matrix4.multiplyByPointAsVector(
        transform,
        new Cesium.Cartesian3(1, 0, 0),
        new Cesium.Cartesian3()
      ),
      new Cesium.Cartesian3()
    );
    // 计算四个顶点
    let leftVector = Cesium.Cartesian3.normalize(
      Cesium.Cartesian3.cross(upVector, forwardVector, new Cesium.Cartesian3()),
      new Cesium.Cartesian3()
    );
    let rightVector = Cesium.Cartesian3.negate(
      leftVector,
      new Cesium.Cartesian3()
    );

    let leftStart = Cesium.Cartesian3.add(
      startPoint,
      Cesium.Cartesian3.multiplyByScalar(
        leftVector,
        width / 2,
        new Cesium.Cartesian3()
      ),
      new Cesium.Cartesian3()
    );
    let rightStart = Cesium.Cartesian3.add(
      startPoint,
      Cesium.Cartesian3.multiplyByScalar(
        rightVector,
        width / 2,
        new Cesium.Cartesian3()
      ),
      new Cesium.Cartesian3()
    );
    let leftEnd = Cesium.Cartesian3.add(
      endPoint,
      Cesium.Cartesian3.multiplyByScalar(
        leftVector,
        width / 2,
        new Cesium.Cartesian3()
      ),
      new Cesium.Cartesian3()
    );
    let rightEnd = Cesium.Cartesian3.add(
      endPoint,
      Cesium.Cartesian3.multiplyByScalar(
        rightVector,
        width / 2,
        new Cesium.Cartesian3()
      ),
      new Cesium.Cartesian3()
    );

    return [leftStart, rightStart, rightEnd, leftEnd];
  } 

  }```

```javascript
  let data = {
    id: "test",
  };
  let lastPos: any = {};
  let entityList: any = {};
  for (var i = 0; i < flightData.length; i++) {
    var position = Cesium.Cartesian3.fromDegrees(
      flightData[i][1],
      flightData[i][2],
      flightData[i][3]
    );
    var heading = Cesium.Math.toRadians(flightData[i][4]);
    var pitch = Cesium.Math.toRadians(360 - flightData[i][6]);
    var roll = Cesium.Math.toRadians(flightData[i][5]);
    // 计算飘带的起点
    if (!entityList[data.id]) {
      let ribbonVertices = computeRibbonVertices(
        position,
        heading,
        pitch,
        roll,
        50,
        2
      );
      lastPos[data.id] = [];
      lastPos[data.id].push(ribbonVertices);
      // 创建飘带的多边形
      entityList[data.id] = [];
      entityList[data.id].push(
        viewer.entities.add({
          polygon: {
            hierarchy: new Cesium.PolygonHierarchy(ribbonVertices),
            material: Cesium.Color.YELLOW.withAlpha(0.5),
            perPositionHeight: true,
          },
        })
      );
      viewer.flyTo(entityList[data.id][0]);
    } else {
      let ribbonVertices = computeRibbonVertices(
        position,
        heading,
        pitch,
        roll,
        50,
        2
      );
      let pos = [
        lastPos[data.id][lastPos[data.id].length - 1][1],
        lastPos[data.id][lastPos[data.id].length - 1][2],
        ribbonVertices[2],
        ribbonVertices[1],
      ];
      lastPos[data.id].push(ribbonVertices);
      entityList[data.id].push(
        viewer.entities.add({
          polygon: {
            hierarchy: new Cesium.PolygonHierarchy(pos.flat(2)),
            material: Cesium.Color.YELLOW.withAlpha(0.5),
            perPositionHeight: true,
          },
        })
      );
    }

有不足之处还请大家多多指教!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cesium小菜王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值