WithCoderWithCoderWithCoder

Cesium中拾取模型对象或坐标的方法介绍

在Cesium中,想获取不同的对象,可以通过pick方法来进行拾取。在Cesium中有多种pick的方法,例如 Scene中有pick、drillPick及pickPosition等,Camera中有getPickRay、pickEllipsoid等,Globe中有pick.

一. Scene中的pick方法:

1. pick方法

pick(windowPosition, width, height) → Object

pick方法返回一个带有“primitive”属性的对象,该对象包含场景中指定窗口坐标处的第一个(顶部)“primitive”,如果该位置没有任何内容,则返回undefined。其他属性可能根据“primitive”的类型进行设置,用于进一步标识选中的对象。

当选中3D Tiles的一个特性时,pick方法将返回一个Cesium3DTileFeature对象。

2. drillPick方法

drillPick(windowPosition, limit, width, height) → Array.<Object>

drillPick方法返回一个列表对象,包含指定窗口坐标位置上的所有“primitive”,每个对象包含一个“primitive”属性。其他属性可能根据“primitive”的类型进行设置,用于进一步标识选中的对象。列表中的“primitive”是根据它们在场景中的视觉顺序(从前到后)排序的。

3. pickPosition方法

pickPosition(windowPosition, result) → Cartesian3

pickPosition方法返回从深度缓冲区和窗口位置重建的笛卡尔坐标位置(高程不精确)。

二维深度缓冲重建的位置可能与三维和哥伦布视图重建的位置稍有不同。这是由于透视深度值的分布与正投影深度值的分布不同造成的。

设置 Scene#pickTranslucentDepth 为true,以包含半透明深度的“primitive”;否则,它会穿透半透明的“primitive”。

二. Camera中的pick方法:

1. getPickRay方法

getPickRay(windowPosition, result) → Ray

getPickRay方法在世界坐标中,创建一条从相机位置通过窗口像素位置的射线。

2. pickEllipsoid方法

pickEllipsoid(windowPosition, ellipsoid, result) → Cartesian3

pickEllipsoid方法可以选择一个椭球面或地图。如果选择了椭球面或地图,则返回椭球面或地图在世界坐标中的点。如果未选择椭球面或地图,则返回undefined。

三. Globe中的pick方法:

1. pick方法

pick(ray, scene, result) → Cartesian3|undefined

pick方法在射线和被渲染的球体表面之间找到一个交点,如果没有找到,返回undefined。射线必须以世界坐标表示。

总结:

1. 通过pick进行地形上的坐标的获取

一般来说,Camera和Globe中的pick搭配使用,通过Camera中的getPickRay获取ray(射线),然后通过globel中的pick方法,获取世界坐标,如下面的地形坐标的获取。这个是常用的方法,当你想获取当前鼠标位置的三维坐标时,经常使用到这个方法:

第一步:通过camera的getPickRay,将当前的屏幕坐标转为ray(射线);

    viewer.camera.getPickRay(windowCoordinates);

第二步:找出ray和地形的交点,即可求出三维世界坐标

    globe.pick(ray, scene);

2. 通过pick获取entity 

    eventHandler.setInputAction(function (movement) {
        var pick = viewer.scene.pick(movement.endPosition);  // 获取的pick对象
        var pickedEntity = Cesium.defined(pick) ? pick.id : undefined; // pick.id即为entity
    }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);


欢迎分享交流,转载请注明出处:WithCoder » Cesium中拾取模型对象或坐标的方法介绍