实体位置发生变化时未进行可视化更新

Entity not Visually Updating when its Position Changes

本文关键字:可视化 更新 位置 变化 实体      更新时间:2023-09-26

标题说明了一切,我无法让一个实体在视觉上在全球移动,即使它的位置在移动。此代码将在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;
});

如果你在演示中选择了球体,你会看到绿色的选择指示器会在地球上移动,但球体会卡在一个地方。我想我错过了一些简单的函数调用,但过去几个小时我一直在谷歌上搜索,找不到解决方案。

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

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

例如,这是您的代码,其中postRender替换为400ms的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。