是否有捕获所有事件的通用 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);
}
}
为了对特定的 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);
}
}