Cesium 拾取 API 徹底總結

@秋意正寒緩存

先講怎麼用,再講大體原理。性能

1 拾取座標

> 僅拾取橢球體表面座標

使用 Camera.prototype.pickEllipsoid 方法,接受一個必選的屏幕座標,返回一個三維世界座標 Cartesian3prototype

> 拾取帶地形高度的地表座標

使用 Globe.prototype.pick 方法。須要事先使用 Camera.prototype.getPickRay 建立射線。
接受一個必選的射線對象,一個必選的 Scene 對象,返回一個三維世界座標 Cartesian33d

> 拾取三維物體的座標

使用 Scene.prototype.pickPosition 方法。code

拓展閱讀
Scene.prototype.pickPositionSupported,只讀字段,表示當前 Scene 是否支持拾取座標
Scene.prototype.pickTranslucentDepth,Boolean 類型字段,使用它的前提是設置 Scene.prototype.useDepthPicking 爲 true,這個 會增長性能消耗,來判斷透明物體的深度對象

2 拾取三維物體

> 拾取 Entity 和 Primitive(包括 3D-Tiles)

使用 Scene.prototype.pick 方法,返回一個對象:ip

{
  primitive: Primitive | GroundPrimitive | Cesium3DTileContent | ...
  id?: Entity
}

若拾取到的是 Entity,那麼返回的對象的 id 字段將爲此 Entity,不然爲 undefined.get

還有一個 Scene.prototype.drillPick,穿透拾取的意思,與 pick 的區別就是能拾取多個點擊點的三維物體。數學

> 拾取 DataSource 加載的數據

同樣經過 Scene.prototype.pickdrillPick 方法拾取,接受二維屏幕座標 Cartesian2it

*拾取圖層

這個功能正在推動,屆時可能在 1.84 版本的 Cesium 會加入拾取圖層的功能。
API 或爲 ImageryLayerCollection.prototype.pickImageryLayers,參數同 Globe.prototype.pick,也是射線求交的一種,返回一個 ImageryLayerCollection 或 undefined.

原理

在 Cesium 的場景組織中,有那麼幾個容器構成了三維世界:

Scene:包括了 Globe,除了 Globe 的元素外,還加上了 Primitive、Entity、DataSource 等三維物件
Globe:包括了 Ellipsoid,還包括了全部的影像圖層、地形瓦片,能夠算是橢球體上面的皮膚
Ellipsoid:一個數學公式所定義的旋轉橢球體,表明一個純粹的地球橢球形狀

因此,針對不一樣的容器,就有不一樣的拾取。

拾取不許確的問題:開啓深度檢測

Scene.prototype.pickPositionScene.prototype.pickGlobe.prototype.pickRay 的準確性受深度緩存影響,因此,在深度檢測不開啓時,拾取的座標會不許確。

建議開啓。

viewer.scene.globe.depthTestAgainstTerrain = true
相關文章
相關標籤/搜索