Cesium
的坐标拾取
-
屏幕坐标:鼠标点击位置距离
canvas
左上角的像素值var handler= new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); handler.setInputAction(function (movement) { // movement.position 为屏幕坐标 console.log(movement.position); }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
-
地图/椭球体表面的坐标,
pickEllipsoid(windowPosition, ellipsoid, result) → Cartesian3
var canvas = viewer.scene.canvas; var center = new Cesium.Cartesian2(canvas.clientWidth / 2.0, canvas.clientHeight / 2.0); var ellipsoid = viewer.scene.globe.ellipsoid; var result = viewer.camera.pickEllipsoid(center, ellipsoid);
-
地标坐标:只能求交于地形,不包括模型、倾斜摄影表面,能获取加载地形后的坐标,
pick(ray, scene, result) → Cartesian3|undefined
// 从相机位置到windowPosition 世界坐标中的像素创建射线。 // 返回Cartesian3射线的位置和方向。 var ray = viewer.camera.getPickRay(windowCoordinates); // 查找射线与渲染的地球表面之间的交点。射线必须以世界坐标给出。 var intersection = globe.pick(ray, scene);
-
场景坐标:根据窗口坐标,从场景的深度缓冲区中拾取相应的位置,返回笛卡尔坐标,不仅可以求交地形,还可以求交除地形以外其他所有写深度的物体。
pickPosition(windowPosition, result) → Cartesian3
var viewer = new Cesium.Viewer('cesiumContainer'); var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); handler.setInputAction(function (movement) { var pickedObject = viewer.scene.pick(movement.endPosition); // 使用时,最好利用pickPositionSupported判断一下浏览器是否支持模型高度拾取 if (scene.pickPositionSupported && Cesium.defined(pickedObject)) { var cartesian = viewer.scene.pickPosition(movement.endPosition); console.log(cartesian); } }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
-
globe.pick
与scene.pickPosition
比较-
globe.pick
的结果相对稳定准确,不论地形深度检测开启与否,不论加载的是默认地形还是别的地形数据; -
scene.pickPosition
只有在开启地形深度检测,且不使用默认地形时是准确的。 -
注意点:
globe.pick
只能求交地形;scene.pickPosition
不仅可以求交地形,还可以求交除地形以外其他所有写深度的物体。
所以使用时可以二者结合来使用。
-
-
Scene
中pick
讲解pick:scene.pick
可以通过此方法获取到pick对象,通过pick.id
即可拾取当前的entity
对象,也可以获取Cesium3DTileFeature
对象;drillPick:scene.drillPick(click.position)
是从当前鼠标点击位置获取entity
的集合,然后通过for循环可以获取当前坐标下的所有entity;