为了对特定空间处理程序作出反应,我通常会这样做 -
var fooHandler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
fooHandler.setInputAction(function(movement){
// do stuff
}, Cesium.ScreenSpaceEventType.WHEEL);
此功能仅限于WHEEL输入。每次相机改变位置或高度时,我都需要做几件事。我尝试以类似于上面的方式为摄像机创建事件处理程序,然后在该函数中调用camera.positionCartographic
,但无济于事。
Cesium中是否有捕获任何运动的事件?
答案 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);
}
}