Cesium Earth:在 ECI 坐标系中显示卫星

Cesium Earth: Show satellites in ECI coordinate system

我正在使用 Cesium Earth 开发卫星跟踪应用程序。

现在,卫星坐标在地球固定系统中,工作正常。

但是,我还需要在 ECI 坐标系中显示它们,为此我必须让地球旋转。

怎么做?

首先我会提到 Cesium 经常使用名称 ICRF 作为 ECI 的同义词或替代词,因此如果您正在搜索文档,您会更幸运地找到 ICRF。

CZML Sandcastle Demo shows some satellites orbiting the Earth with paths shown in the Inertial frame. This is done in the CZML file 通过做两件事:

  • position 部分设置值 "referenceFrame":"INERTIAL"
  • 所有实际 position 值本身必须以惯性而非固定坐标系表示。

你可以看出路径是惯性的,因为它是一个椭圆。如果它以固定地球的方式显示,它看起来就像一个螺旋,疯狂地绕着地球旋转。随着时间的推移,轨道椭圆当然应该保持在恒星的惯性系中,而不是固定在地球上任何一个陆地的上方。

However, I need to show them also in ECI coordinate frame and for that I have to make the Earth rotate.

这是两个不同的问题。在铯中,地球的固定坐标系已经相对于 ICRF 坐标系(在内部)旋转。但默认情况下,相机保持地球固定 (ECF)。因此用户看到地球看起来是静止的,而星星和卫星轨道似乎绕着地球旋转。这实际上是一种观察系统的有效方式,就好像相机只是卡在一个连接地球的非常高的杆子上,扫过不同的轨道。

为了让地球随着时间的推移在屏幕上视觉上旋转,您必须更新相机的位置以使其在 ICRF 框架中保持静止,而不是默认的固定框架。

Camera Sandcastle Demo 有一个活生生的例子。单击下拉菜单和列表中的 select View in ICRF。此代码从左侧实时编辑 window 的第 119 行左右开始:

function icrf(scene, time) {
    if (scene.mode !== Cesium.SceneMode.SCENE3D) {
        return;
    }

    var icrfToFixed = Cesium.Transforms.computeIcrfToFixedMatrix(time);
    if (Cesium.defined(icrfToFixed)) {
        var camera = viewer.camera;
        var offset = Cesium.Cartesian3.clone(camera.position);
        var transform = Cesium.Matrix4.fromRotationTranslation(icrfToFixed);
        camera.lookAtTransform(transform, offset);
    }
}

viewer.scene.postUpdate.addEventListener(icrf);

这段代码只是随着时间的推移更新相机的位置,这样相机在 ICRF 坐标系中看起来是静止的,有恒星和卫星轨道,而地球本身在旋转。