Cesium中获取地形三角网并进行土方计算
三角网获取
Cesium渲染地形时,以 QuadtreePrimitive
管理地形四叉树,四叉树的每一块瓦片用 QuadtreeTile
来实现。因此 QuadtreeTile
中存储了渲染地形所需的顶点信息和索引信息。
获取需要的地形瓦片
通常进行土方量计算会给定一小块范围,并且只针对这一小块范围进行计算。因此,事实上我们并不需要知道所有地形瓦片的三角面信息,只需要获取范围内的就可以了。
地形的三角面信息是以一个个地形瓦片 QuadtreeTile
为单位进行存储的,因此,我们需要先判断那些地形瓦片是我们需要的。
一个地形瓦片 QuadtreeTile
表示的范围可以用一个 Rectangle
表示,这是一个由经纬度定义的“矩形”范围。
因此我们可以先利用 Rectangle
来筛选出与给定范围相交的 QuadtreeTile
。
筛选方式如下(快速,但是不能完全保证获取的地形瓦片都是需要的):
- 计算给定范围的
Rectangle
R1。 - 遍历地形瓦片,获取当前地形瓦片的
Rectangle
R2。 - 判断 R1 是否与 R2相交
- 如果相交则是需要的瓦片
获取范围内的三角面
获取所有筛选出来的地形瓦片的三角面(根据顶点和索引链接成一个个三角面)
利用给定的范围裁切所有三角面,留下范围内的图形
这里利用了 polygon-clipping 进行几何体布尔运算,而 polygon-clipping 只能进行二维平面的布尔运算,因此高程信息需要手动进行插值计算(可以利用三角形重心坐标进行插值)。
由于裁切过后的图形不一定还是三角形,为了后面土方量计算使用的图形类型一致,因此还需要将不是三角形的多边形裁切成三角形集合,这里利用了 earcut 进行多边形分割。
利用三角网计算土方量
获取三角网后,土方量计算就简单多了,每一个三角形与基准高度可以组成一个三棱柱和一个四棱锥组成的复合图形。
剩下的就是高中数学知识了😁
效果体验
获取最高等级地形瓦片分析
本文提到的方法,只能获取视野范围内显示出来的地形瓦片来进行分析。
因此对于视野范围外的地形无法分析,同时由于LOD的问题,相机拉远时,分析的精度较低。
新的文章 Cesium中获取地形最高等级瓦片的三角网进行土方计算 中利用了新的方式,获取到了范围内最高等级的瓦片,解决了上述的问题。