Cesium 点击获取/拾取(PICK)的不同用法

Cesium 拾取有多个方法,下面就分别说明一下几种常用方法都是做什么用的,在什么场景下使用。

1. viewer.scene.pick

通过坐标位置,拾取 EntityPrimitive3D-TilesCesium3DTileFeature)对象。

例如获取 Entity ,通过position(坐标位置)获取到 pick 对象,通过pick.id即可拾取当前的entity对象。

var pick = viewer.scene.pick(position);

注意: scene.pick 只能获取一个对象,并且获取的是最顶部的对象。如果拾取点没有对象,则为undefined

使用场景: viewer.scene.pick 主要是用来拾取 EntityPrimitive、3D-Tiles。拾取后,可以用于改变对象的属性参数。

示例代码: 点击获取图标,修改图标的图片

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
// 设置左键点击事件
handler.setInputAction(function (event) {
    
    
  // 获取 pick 拾取对象
  var pick = viewer.scene.pick(event.position);
  // 判断是否获取到了 pick 
  if (Cesium.defined(pick)) {
    
    
    // 修改拾取到的entity的样式
    pick.id.billboard.image = "xxx.png"
  }
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

2. viewer.scene.pickPosition

主要是用于拾取对应位置的世界坐标,例如:拾取点击模型表面的坐标。

注意: 一定要开启深度检测(viewer.scene.globe.depthTestAgainstTerrain = true;),否则在没有3dTile模型的情况下,会出现空间坐标不准的问题,如果不开启深度检测,只能在3dTile模型上获取准确的空间坐标。

使用场景: 适用于模型表面位置的选取,拾取三维物体的坐标等。

扫描二维码关注公众号,回复: 14616914 查看本文章

示例

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (event) {
    
    
     var position = viewer.scene.pickPosition(event.position);
     console.log("获取到的坐标:", positionposition);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

3. viewer.scene.drillPick

可以理解为穿透拾取,是从当前拾取位置获取所有对象的对象列表(entity的集合),列表按其在场景中的视觉顺序(从前到后)排序(通过for循环可以获取当前坐标下的所有entity)。

注意: drillPickPick 不同,Pick 只能拾取一个对象,而 drillPick 可以拾取多个对象,并且 drillPick 可以设置 limit 参数,limit 参数可以控制获取几个对象,超出的就不获取了。

使用场景: 适用于多个对象重叠在一个位置,并且要获取到多个对象的情况。

示例

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (event) {
    
    
	var pickedObjects = scene.drillPick(event.position);
	// pickedObjects 使用for循环 可以拿到所有entity
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

4. viewer.scene.globe.pick

找到射线与渲染的地球表面之间的交点(射线必须以世界坐标给出),返回的是世界坐标。一般用来获取加载地形后的经纬度和高程。

注意: 一定要开启深度检测(viewer.scene.globe.depthTestAgainstTerrain = true;

使用场景: 一般用于获取点击处地球表面的世界坐标(有地形),注意:不包括模型、倾斜摄影表面。

示例

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (event) {
    
    
     var ray = viewer.camera.getPickRay(event.position);
     var position = viewer.scene.globe.pick(ray, viewer.scene);
     console.log("获取到的坐标:", position);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

5. viewer.scene.camera.pickEllipsoid

通过一个必选的屏幕坐标,获取椭圆球体表面的一个Cartesian3坐标。适用于裸球表面的选取,是基于数学模型的椭圆球体。

注意: pickEllipsoid在加载地形的情况下有误差,地形凹凸程度越大,误差越大,所以不要用来获取有地形的坐标。

使用场景: 主要用于获取椭球面的位置。

示例

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (event) {
    
    
     var position = viewer.scene.camera.pickEllipsoid(event.position, viewer.scene.globe.ellipsoid);
     console.log("获取到的坐标:", position);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

本文在后续遇到详细场景的时候会继续补充

猜你喜欢

转载自blog.csdn.net/qq_17627195/article/details/128632055