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

Lee*_*loo 2 javascript cesium

我正在Cesium Earth开发一个用于卫星跟踪的应用程序。

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

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

怎么做?

ema*_*key 5

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

所述CZML沙堡演示示出了一些环绕地球的卫星与所述惯性帧示出的路径。这是在 CZML 文件中通过做两件事来完成的:

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

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

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

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

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

相机沙堡演示对此有着活生生的例子。单击下拉列表并View in ICRF从列表中选择。此代码从左侧实时编辑窗口的第 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);
Run Code Online (Sandbox Code Playgroud)

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