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

dgv*_*vid 4 javascript cesium

我想在每次相机位置,航向,俯仰或滚动在Cesium视图上发生变化时进行检测,以便我可以更新显示这些值的显示.经过相当多的搜索,我最终发现我可以为小部件的Scene对象上的非直观preRenderpostRender事件添加事件处理程序.然而,这些事件连续发射,每秒数百次.我猜他们每个时钟滴答一次.我可以注册的其他事件是否会在地图视图发生变化后触发?我正在寻找接近Leaflet moveend活动的东西,preRenderpostRender不是它.

如果不这样做,有什么方法可以让我preRender或者postRender只有在某些事情发生变化时才会开火?

Zac*_*Zac 12

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

viewer.camera.moveStart.addEventListener(function() { 
     // the camera started to move
});
viewer.camera.moveEnd.addEventListener(function() { 
     // the camera stopped moving
});
Run Code Online (Sandbox Code Playgroud)

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

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

var viewer = new Cesium.Viewer();

viewer.scene.screenSpaceCameraController.inertiaSpin = 0;
viewer.scene.screenSpaceCameraController.inertiaTranslate = 0;
viewer.scene.screenSpaceCameraController.inertiaZoom = 0;
Run Code Online (Sandbox Code Playgroud)


Mik*_* LP 0

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

  • 设置一个间隔,以对您的应用程序有意义的任何频率轮询相机位置。

    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
    ...
    
    Run Code Online (Sandbox Code Playgroud)
  • 将事件触发器附加到更改的发起者上。如果是鼠标,则在 mouseup 上。如果是键盘,请附加到 keyup 上。

    CameraEventAggregator 对象有一个名为“anyButtonDown”的成员,该成员对于鼠标状态更改非常有用。

  • 您也许还可以使用相机的 FlightCompleteCallback。如果您使用辅助方法来移动相机,那么只要相机移动完毕,就会触发它。