前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >cesiumjs通过轨道六根数绘制轨道和卫星

cesiumjs通过轨道六根数绘制轨道和卫星

原创
作者头像
治电小白菜
发布2024-08-30 10:46:48
1790
发布2024-08-30 10:46:48
举报
文章被收录于专栏:技术综合

网上cesiumjs使用两行tle绘制卫星和轨道的代码很多,但是很少有轨道六根数绘制卫星和轨道的

一、完整代码

省流直接上代码:https://github.com/klren0312/cesium-sat demo地址:https://klren0312.github.io/cesium-sat/

二、轨道六根数

基本就是先算出当前轨道六根数描述的那个点,就是卫星的位置,随后通过循环修改真近点角0-360度,绘制出轨道

三、根据轨道六根数计算坐标

先计算半通径,过椭圆焦点作焦线的垂线,交椭圆于一点,该点与最近焦点的距离为半通径

代码语言:js
复制
const p = semiMajorAxis * (1 - eccentricity * eccentricity)

通过半通经计算径向距离

代码语言:js
复制
const r = p / (1 + eccentricity * Math.cos(trueAnomalyRadians))

计算轨道平面上的位置

代码语言:js
复制
const positionInOrbitalPlane = new Cesium.Cartesian3(
    r * Math.cos(trueAnomalyRadians),
    r * Math.sin(trueAnomalyRadians),
    0
)

计算组合旋转钜阵

代码语言:js
复制
let rotationMatrix = new Cesium.Matrix3()
rotationMatrix = Cesium.Matrix3.multiply(Cesium.Matrix3.fromRotationZ(rightAscensionRadians), Cesium.Matrix3.fromRotationX(inclinationRadians), rotationMatrix)
rotationMatrix = Cesium.Matrix3.multiply(rotationMatrix, Cesium.Matrix3.fromRotationZ(argumentOfPeriapsisRadians), rotationMatrix)

最后应用旋转矩阵到轨道平面上的位置向量

代码语言:js
复制
const position = Cesium.Matrix3.multiplyByVector(rotationMatrix, positionInOrbitalPlane, new Cesium.Cartesian3())

方法完整代码

代码语言:js
复制
/**
  * 根据轨道六根数计算坐标
  * @param {number} semiMajorAxis 轨道半长轴
  * @param {number} eccentricity 轨道离心率
  * @param {number} inclination 轨道倾角
  * @param {number} rightAscensionOfAscendingNode 右上升角
  * @param {number} argumentOfPeriapsis 近地点角距
  * @param {number} trueAnomaly 平近点角
  */
function calcPosition (semiMajorAxis, eccentricity, inclinationRadians, rightAscensionRadians, argumentOfPeriapsisRadians, trueAnomalyRadians) {
 const p = semiMajorAxis * (1 - eccentricity * eccentricity)
 const r = p / (1 + eccentricity * Math.cos(trueAnomalyRadians))
 const positionInOrbitalPlane = new Cesium.Cartesian3(
   r * Math.cos(trueAnomalyRadians),
   r * Math.sin(trueAnomalyRadians),
   0
 )

 let rotationMatrix = new Cesium.Matrix3()
 rotationMatrix = Cesium.Matrix3.multiply(Cesium.Matrix3.fromRotationZ(rightAscensionRadians), Cesium.Matrix3.fromRotationX(inclinationRadians), rotationMatrix)
 rotationMatrix = Cesium.Matrix3.multiply(rotationMatrix, Cesium.Matrix3.fromRotationZ(argumentOfPeriapsisRadians), rotationMatrix)
 const position = Cesium.Matrix3.multiplyByVector(rotationMatrix, positionInOrbitalPlane, new Cesium.Cartesian3())
 return position
}

四、计算卫星坐标和轨道

转换角度为弧度,因为Cesium使用的是弧度

代码语言:js
复制
const inclinationRadians = Cesium.Math.toRadians(inclination); // 轨道倾角
const rightAscensionRadians = Cesium.Math.toRadians(rightAscensionOfAscendingNode); // 右上升弧度
const argumentOfPeriapsisRadians = Cesium.Math.toRadians(argumentOfPeriapsis); // 近地点角距
const trueAnomalyRadians = Cesium.Math.toRadians(trueAnomaly); // 平近点角

计算轨道位置,0-360循环赋值给真近点角,获取轨道位置数组,然后渲染实体, 使用loop: true闭合线条

代码语言:js
复制
const orbitPositions = [];
for (let angle = 0; angle <= 360; angle++) {
  const angleRadians = Cesium.Math.toRadians(angle);
  // 使用开普勒方程计算卫星在轨道上的位置
  const position = calcPosition(semiMajorAxis, eccentricity, inclinationRadians, rightAscensionRadians, argumentOfPeriapsisRadians, angleRadians)
  orbitPositions.push(position);
}

// 添加实体以表示轨道
viewer.entities.add({
  name: '轨道',
  polyline: {
    positions: orbitPositions,
    width: 1,
    material: Cesium.Color.BLUE, // 这里可以设置不同的颜色或材质
    loop: true // 闭合线条以创建完整轨道
  }
})

卫星也一样,直接计算坐标,绘制实体即可

代码语言:js
复制
const satPosition = calcPosition(semiMajorAxis, eccentricity, inclinationRadians, rightAscensionRadians, argumentOfPeriapsisRadians, trueAnomalyRadians)
// 添加卫星
viewer.entities.add({
  position: satPosition,
  point: {
    color: Cesium.Color.BLUE,
    pixelSize: 10
  }
})

五、效果

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、完整代码
  • 二、轨道六根数
  • 三、根据轨道六根数计算坐标
  • 四、计算卫星坐标和轨道
  • 五、效果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档