是否有捕获所有事件的通用 ScreenSpaceEvent?

Is there a generic ScreenSpaceEvent that captures all events?

为了对特定的 space 处理程序做出反应,我通常这样做 -

var fooHandler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
fooHandler.setInputAction(function(movement){
    // do stuff
}, Cesium.ScreenSpaceEventType.WHEEL);

此功能仅限于 WHEEL 输入。每次相机改变位置或高度时,我都需要做几件事。我尝试以类似于上述的方式为相机创建一个事件处理程序,然后在该函数中调用 camera.positionCartographic,但无济于事。

Cesium 中是否有捕获任何 运动的事件?

您不想使用 ScreenSpaceEventHandler 来执行此操作。相反,您订阅 preRender 事件并比较上一帧的相机位置。下面是一些示例代码:

var lastTime = Cesium.getTimestamp();
var lastPosition = viewer.scene.camera.position.clone();

function preRender(scene) {
    var time = Cesium.getTimestamp();
    var position = scene.camera.position;
    if (!Cesium.Cartesian3.equalsEpsilon(lastPosition, position, Cesium.Math.EPSILON4)) {
        document.getElementById('viewChanged').style.display = 'block';
        lastTime = time;
    } else if (time - lastTime > 250) {
        //hide the 'view changed' message after 250 ms of inactivity
        lastTime = time;
        document.getElementById('viewChanged').style.display = 'none';
    }
    lastPosition = position.clone();
}

viewer.scene.preRender.addEventListener(preRender);

我们计划在不久的将来向 Cesium 添加一个 viewChanged 事件,也许在 1.8 中,但此代码将在此之后继续工作,您可以在空闲时切换到该事件。

如果您想要上述代码的现场演示,请查看更改后的视图端口 Google 我们在 Cesium 中进行的地球演示:http://analyticalgraphicsinc.github.io/cesium-google-earth-examples/examples/viewchangeEvent.html

这是我最后做的事情:

        _preRender = function (scene) {
        var currentPosition = scene.camera.position;

        if (!Cesium.Cartesian3.equalsEpsilon(_lastPosition, currentPosition, Cesium.Math.EPSILON4)) {
            _lastPosition = currentPosition.clone();

            if (typeof _positionChangeTimeout !== 'undefined' && _positionChangeTimeout !== null)
            {
                clearTimeout(_positionChangeTimeout);
            }

            var currentPositionCartographic = scene.camera.positionCartographic;

            _positionChangeTimeout = setTimeout(function() {
                if (typeof _positionChangeListener === 'function' && _positionChangeListener !== null)
                {
                    _positionChangeListener({
                        lat: Cesium.Math.toDegrees(currentPositionCartographic.latitude),
                        long: Cesium.Math.toDegrees(currentPositionCartographic.longitude),
                        zoomLevel: _calcZoomForAltitude(currentPositionCartographic.height, currentPositionCartographic.latitude)
                    });
                }
            }, 250);
        }
    }