实体在其位置更改时不会进行可视更新

时间:2016-01-11 20:02:05

标签: javascript cesium

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

router.get('/test', cors(), function(req,res)
{
  res.set("Access-Control-Allow-Origin", "*"); //set header here
  res.render('exampleSearch', {title: 'FM | Test'});
});

如果在演示中选择球体,您将看到绿色选择指示器将在全球范围内移动,但球体将卡在一个位置。我想有一些简单的函数调用我不见了,但我一直在谷歌搜索过去几个小时,我找不到解决方案。

我已经看过Sandcastle的Picking演示了,但似乎没什么关系。我正在寻找的功能只是让一个形状无限期地循环通过同一组坐标,所以我无论如何都不能使用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; });

1 个答案:

答案 0 :(得分:1)

我怀疑这个原因有点棘手:在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);

当工作人员完成更新几何体时,目前无法从Entity API中了解。您可能必须将此示例移出Entity API并改为使用Primitive API。