如何在铯中获得场景变化事件?

时间:2015-03-25 18:03:42

标签: javascript cesium

我希望每次相机位置,航向,俯仰或滚动在Cesium视图上发生变化时都能检测到,以便我可以更新显示这些值的显示。经过大量的搜索,我最终发现我可以在窗口小部件的Scene对象上添加一个事件处理程序给那些不那么直观的preRenderpostRender事件。然而,这些事件连续发射,每秒数百次。我猜他们每个时钟滴答一次。我可以注册的其他事件是否会在地图视图发生变化后触发?我正在寻找接近Leaflet moveend事件的内容,preRenderpostRender并不是。

如果失败了,有什么方法可以让我preRenderpostRender只有在实际发生了变化时才会触发?

5 个答案:

答案 0 :(得分:11)

另一种不使用计时器的解决方案是监听摄像机移动开始和移动结束事件。

viewer.camera.moveStart.addEventListener(function() { 
     // the camera started to move
});
viewer.camera.moveEnd.addEventListener(function() { 
     // the camera stopped moving
});

这些听起来更像是你正在寻找的事件。

[编辑]: 惯性旋转和缩放默认启用,看起来很酷,它们可以很容易地被禁用。这将使moveEnd事件按预期触发。以下是禁用惯性的方法。

var viewer = new Cesium.Viewer();

viewer.scene.screenSpaceCameraController.inertiaSpin = 0;
viewer.scene.screenSpaceCameraController.inertiaTranslate = 0;
viewer.scene.screenSpaceCameraController.inertiaZoom = 0;

答案 1 :(得分:2)

使用cesium v​​1.30,您可以使用以下代码:

viewer.camera.changed.addEventListener(function() {
  var deg = Math.round( Cesium.Math.toDegrees(viewer.camera.heading))
  console.log('Heading:', deg)

  var deg = Math.round( Cesium.Math.toDegrees(viewer.camera.pitch))
  console.log('Pitch:', deg)
})

答案 2 :(得分:1)

我会推荐以下解决方案之一:

  • 设置一个间隔,以适合您应用的频率轮询相机位置。

    var intervalHandle = setInterval(function() {
      var camera = viewer.scene.camera,
        store = {  position: camera.position.clone(),
                   direction: camera.direction.clone(),
                   up: camera.up.clone(),
                   right: camera.right.clone(),
                   transform: camera.transform.clone(),
                   frustum: camera.frustum.clone()
                };
      //update UI elements
      ...
     }, 1000); // every 1 second whatever is best for your application
    ...
    
  • 在更改的发起者上附加事件触发器。如果是鼠标,那么就是鼠标。如果是键盘,请在键盘上附上。

    CameraEventAggregator对象有一个名为“anyButtonDown”的成员,它对鼠标状态更改很有用。

  • 您也可以使用Camera的FlightCompleteCallback。如果您使用辅助方法移动相机,则应该在相机完成移动时触发。

答案 3 :(得分:0)

除了答案https://stackoverflow.com/a/42044819/3092437之外,您可能希望将viewer.camera.percentageChanged设置为接近0的某个小值(但0camera倾向于始终生成change个事件。我使用0.001,它在所有缩放级别都提供了非常好的事件频率。

答案 4 :(得分:0)

实际答案:

viewer.scene.morphStart.addEventListener(function(ignore, previousMode, newMode) {

});

还有morphComplete

https://www.cesium.com/docs/cesiumjs-ref-doc/Scene.html?classFilter=scene#morphComplete