cesium实体姿态控制其一,雷达动态监测卫星

最近有点时间,就想回顾一下cesium的代码案例,在姿态控制这块自己也是比较欠缺的,最终选择从控制实体姿态方面开始,本次以二个案例的编写开发过程作为主要结构来学习实体的控制,

实体姿态控制其一,雷达动态监测卫星

先看效果图

卫星的加载

卫星模型和轨道加载使用czml数据,然后使用dataSource里的CzmlDataSource加载,并根据时间,动态获取卫星的实时位置坐标。具体实现如下图:czml数据下载

 c3d_sdk.viewer.dataSources.add(Cesium.CzmlDataSource.load(MEO9ECI)).then((dataSource) => {
          const satellite = dataSource.entities.getById("Satellite-MEO9");
          c3d_sdk.viewer.clock.onTick.addEventListener((tick) => {
            targetPosition = satellite._position.getValue(tick.currentTime)
            if(!targetPosition) {
              return
            }
          })
});

模拟雷达站加载 

采用雷达控制中心点,使用点代替雷达位置,

c3d_sdk.viewer.scene.globe.depthTestAgainstTerrain = true;
        c3d_sdk.remover.removeById(c3d_sdk.viewer, 'mklfjmgvaseoirvnoas');
        const ent = c3d_sdk.viewer.entities.add({
          id: 'mklfjmgvaseoirvnoas',
          position: Cesium.Cartesian3.fromDegrees(4.110693, 36.0994841, 1160),
          point: {
            color: Cesium.Color.SKYBLUE,
            pixelSize: 4,
            outlineColor: Cesium.Color.YELLOW,
            outlineWidth: 2,
          }
        })

姿态控制

使用cylinder承载监听扫描效果,这里需要注意修改orientation 修改代码如下

方位计算代码

//求方位角和朝向
    getHeadingPitchRoll(m) {
    var m1 = Cesium.Transforms.eastNorthUpToFixedFrame(Cesium.Matrix4.getTranslation(m, new Cesium.Cartesian3()), Cesium.Ellipsoid.WGS84, new Cesium.Matrix4());
    var m3 = Cesium.Matrix4.multiply(Cesium.Matrix4.inverse(m1, new Cesium.Matrix4()), m, new Cesium.Matrix4());
    var mat3 = Cesium.Matrix4.getMatrix3(m3, new Cesium.Matrix3());
    var q = Cesium.Quaternion.fromRotationMatrix(mat3);
    var hpr = Cesium.HeadingPitchRoll.fromQuaternion(q);
    var heading = Cesium.Math.toDegrees(hpr.heading);
    var pitch = Cesium.Math.toDegrees(hpr.pitch);
    var roll = Cesium.Math.toDegrees(hpr.roll);
    return hpr
    },
    //模型矩阵
    getModelMatrix(pointA, pointB) {
      const vector2 = Cesium.Cartesian3.subtract(pointB, pointA, new Cesium.Cartesian3());
      //归一化
      const normal = Cesium.Cartesian3.normalize(vector2, new Cesium.Cartesian3());
      const rotationMatrix3 = Cesium.Transforms.rotationMatrixFromPositionVelocity(pointA, normal, Cesium.Ellipsoid.WGS84);
      const orientation = Cesium.Quaternion.fromRotationMatrix(rotationMatrix3);
      const modelMatrix4 = Cesium.Matrix4.fromRotationTranslation(rotationMatrix3, pointA);
      const hpr = Cesium.HeadingPitchRoll.fromQuaternion(orientation);
      return modelMatrix4;
    }

材质修改代码

 readyCanvas(convasid, radius) {
        var canvas = document.getElementById(convasid);
        let cwidth = 400;
        let cheight = 400;
        var ctx = canvas.getContext("2d");
        ctx.clearRect(0, 0, cwidth, cheight);
        ctx.fillStyle = 'rgba(255, 255, 255, 0)';
        ctx.fillRect(0, 0, cwidth, cheight);
        for (let ii = 0; radius <= 200; ii++) {
          ctx.lineWidth = 2;
          //开始一个新的绘制路径
          ctx.beginPath();
          //设置弧线的颜色
          var trans = 1.0 - (radius / 255);
          ctx.strokeStyle = "rgba(255, 0, 255, " + trans + ")";
          var circle = {
            x: 200, //圆心的x轴坐标值
            y: 200, //圆心的y轴坐标值
            r: radius //圆的半径
          };
          //以canvas中的坐标点(200,200)为圆心,绘制一个半径为50px的圆形
          ctx.arc(circle.x, circle.y, circle.r, 0, Math.PI * 2, true);
          //按照指定的路径绘制弧线
          ctx.stroke();
          radius += 10;
        }
    },

下一节讲Matrix的控制

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值