【问题标题】:Entity not Visually Updating when its Position Changes实体在其位置更改时没有视觉更新
【发布时间】:2016-01-11 20:02:05
【问题描述】:

标题说明了一切,我无法让实体在视觉上在全球范围内移动,即使它的位置在移动。此代码将重现 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,就我所见。

【问题讨论】:

  • 嗨 RIPTuan,欢迎来到 SO。仅供参考:您不需要标题中的标签。我已经进行了更改。
  • "如果您在演示中选择球体.." 可以分享演示链接吗?
  • @Trisped 谢谢,对标题感到抱歉。
  • @meen,我在问题中发布的代码可以粘贴到 Cesium 的 Sandcastle 中以生成我所指的演示。

标签: javascript cesium


【解决方案1】:

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

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

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。

【讨论】:

  • 谢谢,我把它改成了一个原语,它在 postRender 监听器中工作顺利。但是,我不确定如何从原语中获取位置;我在基元之外保留一个名为“pos”的笛卡尔3,更新它,并使用“p.modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(pos);”设置基元的位置直接取自维基。有没有更好的方法来做到这一点,并且 postRender 监听器是一个可以接受的放置它的地方吗?
  • 这听起来不错。如果您对此有疑虑,也许可以发布一个新的问题。
猜你喜欢
  • 2018-08-14
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多