3

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

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

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

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

4

2 回答 2

4

你不想用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);

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

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

于 2015-03-07T00:06:07.397 回答
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);
        }
    }
于 2015-03-20T21:50:34.543 回答