欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Cesium 拾取 API 完全总结

程序员文章站 2022-03-06 10:36:39
先讲怎么用,再讲大致原理。 1 拾取坐标 > 仅拾取椭球体表面坐标 使用 Camera.prototype.pickEllipsoid 方法,接受一个必选的屏幕坐标,返回一个三维世界坐标 Cartesian3。 > 拾取带地形高度的地表坐标 使用 Globe.prototype.pick 方法。需要 ......

先讲怎么用,再讲大致原理。

1 拾取坐标

> 仅拾取椭球体表面坐标

使用 camera.prototype.pickellipsoid 方法,接受一个必选的屏幕坐标,返回一个三维世界坐标 cartesian3

> 拾取带地形高度的地表坐标

使用 globe.prototype.pick 方法。需要事先使用 camera.prototype.getpickray 创建射线。
接受一个必选的射线对象,一个必选的 scene 对象,返回一个三维世界坐标 cartesian3

> 拾取三维物体的坐标

使用 scene.prototype.pickposition 方法。

拓展阅读
scene.prototype.pickpositionsupported,只读字段,表示当前 scene 是否支持拾取坐标
scene.prototype.picktranslucentdepth,boolean 类型字段,使用它的前提是设置 scene.prototype.usedepthpicking 为 true,这个 会增加性能消耗,来判断透明物体的深度

2 拾取三维物体

> 拾取 entity 和 primitive(包括 3d-tiles)

使用 scene.prototype.pick 方法,返回一个对象:

{
  primitive: primitive | groundprimitive | cesium3dtilecontent | ...
  id?: entity
}

若拾取到的是 entity,那么返回的对象的 id 字段将为此 entity,否则为 undefined.

还有一个 scene.prototype.drillpick,穿透拾取的意思,与 pick 的区别就是能拾取多个点击点的三维物体。

> 拾取 datasource 加载的数据

一样通过 scene.prototype.pick 和 drillpick 方法拾取,接受二维屏幕坐标 cartesian2

*拾取图层

这个功能正在推进,届时可能在 1.84 版本的 cesium 会加入拾取图层的功能。

原理

在 cesium 的场景组织中,有那么几个容器构成了三维世界:

scene:包括了 globe,除了 globe 的元素外,还加上了 primitive、entity、datasource 等三维物件
globe:包括了 ellipsoid,还包括了所有的影像图层、地形瓦片,可以算是椭球体上面的皮肤
ellipsoid:一个数学公式所定义的旋转椭球体,代表一个纯粹的地球椭球形状

所以,针对不同的容器,就有不同的拾取。

拾取不准确的问题:开启深度检测

scene.prototype.pickpositionscene.prototype.pick 和 globe.prototype.pickray 的准确性受深度缓存影响,所以,在深度检测不开启时,拾取的坐标会不准确。

建议开启。

viewer.scene.globe.depthtestagainstterrain = true