@秋意正寒缓存
先讲怎么用,再讲大体原理。性能
使用 Camera.prototype.pickEllipsoid
方法,接受一个必选的屏幕坐标,返回一个三维世界坐标 Cartesian3
。prototype
使用 Globe.prototype.pick
方法。须要事先使用 Camera.prototype.getPickRay
建立射线。
接受一个必选的射线对象,一个必选的 Scene
对象,返回一个三维世界坐标 Cartesian3
。3d
使用 Scene.prototype.pickPosition
方法。code
拓展阅读
Scene.prototype.pickPositionSupported
,只读字段,表示当前 Scene 是否支持拾取坐标
Scene.prototype.pickTranslucentDepth
,Boolean 类型字段,使用它的前提是设置Scene.prototype.useDepthPicking
为 true,这个 会增长性能消耗,来判断透明物体的深度对象
使用 Scene.prototype.pick
方法,返回一个对象:ip
{ primitive: Primitive | GroundPrimitive | Cesium3DTileContent | ... id?: Entity }
若拾取到的是 Entity,那么返回的对象的 id 字段将为此 Entity,不然为 undefined.get
还有一个 Scene.prototype.drillPick
,穿透拾取的意思,与 pick 的区别就是能拾取多个点击点的三维物体。数学
同样经过 Scene.prototype.pick
和 drillPick
方法拾取,接受二维屏幕坐标 Cartesian2
。it
这个功能正在推动,届时可能在 1.84 版本的 Cesium 会加入拾取图层的功能。
API 或为 ImageryLayerCollection.prototype.pickImageryLayers
,参数同 Globe.prototype.pick
,也是射线求交的一种,返回一个 ImageryLayerCollection
或 undefined.
在 Cesium 的场景组织中,有那么几个容器构成了三维世界:
Scene:包括了 Globe,除了 Globe 的元素外,还加上了 Primitive、Entity、DataSource 等三维物件
Globe:包括了 Ellipsoid,还包括了全部的影像图层、地形瓦片,能够算是椭球体上面的皮肤
Ellipsoid:一个数学公式所定义的旋转椭球体,表明一个纯粹的地球椭球形状
因此,针对不一样的容器,就有不一样的拾取。
Scene.prototype.pickPosition
、Scene.prototype.pick
和 Globe.prototype.pickRay
的准确性受深度缓存影响,因此,在深度检测不开启时,拾取的坐标会不许确。
建议开启。
viewer.scene.globe.depthTestAgainstTerrain = true