实体在其位置发生变化时不在视觉上更新

Entity not Visually Updating when its Position Changes

标题说明了一切,我无法让一个实体在视觉上绕地球移动,即使它的位置在移动。此代码将重现 Sandcastle 中的问题:

var viewer = new Cesium.Viewer('cesiumContainer');

var e = viewer.entities.add({
    name : 'Sphere',
    position: Cesium.Cartesian3.fromDegrees(-100, 30.0, 300000.0),
    ellipsoid : {
        radii : new Cesium.Cartesian3(200000.0, 200000.0, 200000.0)
    }
});

viewer.scene.postRender.addEventListener(function(scene, time) {
    var pos = e.position._value;

    var cart = Cesium.Ellipsoid.WGS84.cartesianToCartographic(pos);

    pos = Cesium.Cartesian3.fromRadians(cart.longitude + (1 * Math.PI / 180), cart.latitude, cart.height);

    e.position = pos;
});

如果您 select 演示中的球体,您会看到绿色 selection 指示器将绕地球移动,但球体将卡在一个地方。我想我缺少一些简单的函数调用,但过去几个小时我一直在谷歌搜索,但找不到解决方案。

我已经看过 Sandcastle 上的 Picking 演示,但似乎没有任何相关内容。我正在寻找的功能只是让一个形状无限期地循环通过同一组坐标,所以据我所知,我不能使用 SampledPositionProperty

我怀疑造成这种情况的原因有点棘手:在 Cesium 中,椭圆体几何体是由 Web Worker 异步构建的。通过在每个 postRender 事件中要求改变位置,您基本上是在折磨工作人员,它无法在下一个请求开始之前完成一个请求。所以我们最终根本看不到位置更新。如果你稍微放慢速度,你会注意到位置确实更新了。

例如,这里还是您的代码,将 postRender 替换为 400 毫秒的 setInterval。这更像是时钟的滴答声而不是流畅的动画,但它显示了正在更新的位置:

var viewer = new Cesium.Viewer('cesiumContainer');

var e = viewer.entities.add({
    name : 'Sphere',
    position: Cesium.Cartesian3.fromDegrees(-100, 30.0, 300000.0),
    ellipsoid : {
        radii : new Cesium.Cartesian3(200000.0, 200000.0, 200000.0)
    }
});

window.setInterval(function() {
    var pos = e.position._value;

    var cart = Cesium.Ellipsoid.WGS84.cartesianToCartographic(pos);

    pos = Cesium.Cartesian3.fromRadians(cart.longitude + (1 * Math.PI / 180), cart.latitude, cart.height);

    e.position = pos;
}, 400);

目前无法从实体 API 得知工作人员何时完成几何更新。您可能必须将此示例移出实体 API 并改用原始 API。