Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当其位置更改时,实体未进行可视化更新_Javascript_Cesium - Fatal编程技术网

Javascript 当其位置更改时,实体未进行可视化更新

Javascript 当其位置更改时,实体未进行可视化更新,javascript,cesium,Javascript,Cesium,标题说明了一切,我无法让一个实体在视觉上在全球移动,即使它的位置在移动。此代码将重现Sandcastle中的问题: var viewer = new Cesium.Viewer('cesiumContainer'); var e = viewer.entities.add({ name : 'Sphere', position: Cesium.Cartesian3.fromDegrees(-100, 30.0, 300000.0), ellipsoid : {

标题说明了一切,我无法让一个实体在视觉上在全球移动,即使它的位置在移动。此代码将重现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上的采摘演示,但似乎没有任何相关内容。我正在寻找的功能只是让一个形状无限期地在同一组坐标中循环,因此我无法使用
SampledPositionProperty
,就我所见。

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

例如,这里的代码再次被400ms的
setInterval
替换为
postdrender
。这更像是时钟滴答作响,而不是平滑的动画,但它显示了正在更新的位置:

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。

Hi RIPTuan,欢迎使用SO。仅供参考:您不需要标题中的标签。我已经进行了更改。“如果您在演示中选择了球体…”您可以共享演示的链接吗?@Trispid谢谢,关于标题,很抱歉。@meen,我在问题中发布的代码可以粘贴到Cesium的Sandcastle中以制作我所指的演示。谢谢,我将其更改为原语,并且它在postRender侦听器中工作顺利。但是,我不知道如何从原语中获得位置;我在原语之外保留一个名为“pos”的Cartesian3,对其进行更新,并使用“p.modelMatrix=Cesium.Transforms.EastNorthUpFixedFrame(pos);”设置原语的位置这是直接从维基上获取的。有没有更好的方法来做到这一点,postRender侦听器是一个可以接受的地方吗?这听起来不错。如果您对此有顾虑,您可以发布一个新的问题,并提供详细信息。