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

时间:2015-03-06 22:58:46

标签: cesium

为了对特定空间处理程序作出反应,我通常会这样做 -

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

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

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

2 个答案:

答案 0 :(得分:3)

您不想使用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,但此代码将继续有效,您可以在闲暇时切换到活动。

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

答案 1 :(得分:0)

这是我最终做的事情:

        _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);
        }
    }