Cesium的pickEllipsoid和pickPosition

最近实现Cesium手动绘制图形的功能,需要鼠标点击及移动时获取当前的空间坐标。实现的过程中发现了下面两种获取空间坐标的方式:

在Cesium Sandcastle给出的绘制示例中,采用了pickPosition的方式获取空间坐标,并给出如下注释:

Csium Sandcastle绘制示例

大致可理解为viewer.camera.pickEllipsoid 在加载地形的场景上获取的坐标有误差,用viewer.camera.pickPosition来解决这一问题。于是我用viewer.camera.pickEllipsoid 做了下测试,发现确实有较大误差:
pickEllipsoid在地形起伏表面绘制.gif

于是采用了Cesium Sandcastle中推荐的viewer.scene.pickPosition进行位置获取,却发现误差更大了
pickPosition.gif

查阅资料后得知:viewer.scene.pickPosition需要开启“地形深度检测”来解决在没有3dTile模型下的笛卡尔座标不准问题:

//解决viewer.scene.pickPosition(e.position)在没有3dTile模型下的笛卡尔座标不准问题。
viewer.scene.globe.depthTestAgainstTerrain = true;

也就是说,viewer.scene.pickPosition 在未开启“地形深度检测”的情况下只能在3DTile上准确获取空间坐标(如下图)。

未开启地形深度检测,pickPosition在3DTile上绘制.gif

开启“地形深度检测”后,viewer.scene.pickPosition 也能在非3DTile上准确获取坐标(如下图)。
开启地形深度检测的pickPosition.gif

总结如下

  • pickEllipsoid在加载地形的情况下有一定误差,地形凹凸程度越大,误差越大。
  • pickPosition在depthTestAgainstTerrain=false时只能在3DTile上获取准确位置,当depthTestAgainstTerrain=true时,在3DTile和底图上均能获取准确位置

新发现问题

当开启了地形深度检测后,绘制点时会被遮挡。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容