首页 / 浏览问题 / 三维GIS / 问题详情
cesium 在相同位置相同高度drillPick会返回不同的结果
18EXP 2023年08月28日

cesium 在相同位置相同高度drillPick会返回不同的结果,导致返回的第一个结果不是最近的entity。

1个回答

您好,

您再返回一下您点击位置的坐标呢?

另外,需要注意scene.drillPick(click.position)是从当前鼠标点击位置获取entity的集合pickedObjects,通过一个for循环,用pickedId匹配所要响应的entity的id。如果把LEFT_CLICK换成MOUSE_MOVE或者其他,则需要考虑click的position是什么。比如,MOUSE_MOVE的click就有startPosition和endPosition,请具体问题具体分析。

如果把scene.drillPick(click.position)中drillPick改成pick,那么当鼠标点击或滑过时该位置存在多个entity,哪怕面点线不在同一高度,面entity都可能会盖住点线entity,从而使得被遮盖的点或线无法响应点击和滑过事件。
4,151EXP 2023年08月28日

位置都是同一个位置,事件是LEFT_CLICK,而且发现返回的结果是有规律的,就好像每隔几次返回的第一个会是最近的entity。

如图所示,drillPick返回的第一个结果我用蓝色表示

您这个应该是触发的 drillPick 的穿透拾取吧。

drillPick 与 pick 最大的区别就是能拾取多个点击点的三维物体。

以下为drillpick的说明:

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

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

示例代码

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (event) {
	var pickedObjectArrays = scene.drillPick(event.position,5);   //最多获取前5个对象
	// pickedObjectArrays 是个数组,使用for循环 可以拿到所有entity
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
那么如何在用drillPick的情况下获得最近的对象呢?
获取对象改为1呢,能否正常使用?

而且如果是entity的,点击对象,使用pick应该就能够满足需求了啊

因为存在多图层叠加且切换不同图层的entity属性浏览的情况下必须使用drillPick 。设置1也无效。

出现图中的情况好像是初始化entity时没有设置height或extrudedHeight,但是设置了这两个任意一个

 classificationType: Cesium.ClassificationType.S3M_TILE, // 贴在S3M模型表面

这段代码就失效了。

多图层叠加且切换不同图层的entity属性浏览

我认为这个是和drillpick的穿透拾取本身就冲突了。
当有多个DataSource显示时,获取当前鼠标位置的所有entity不应该用drillpick吗?获取所有entity是根据需要得到指定图层的entity的属性信息。 目前的问题应该是entity未设置height或extrudedHeight,drillpick穿透拾取时会异常。因为设置了height后或extrudedHeight,drillpick不会出现前文的gif中的错误。而我需要entity显示是贴模型的,而height与heightReference.CLAMP_TO_GROUND又是冲突的。
...