先講怎么用,再講大致原理,
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.pickPosition、Scene.prototype.pick 和 Globe.prototype.pickRay 的準確性受深度快取影響,所以,在深度檢測不開啟時,拾取的坐標會不準確,
建議開啟,
viewer.scene.globe.depthTestAgainstTerrain = true
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/288797.html
標籤:JavaScript
上一篇:循序漸進BootstrapVue,開發公司門戶網站(5)--- 使用實際資料介面代替本地Mock資料
下一篇:Vue前端訪問控制方案
