Cesium中支持任意数据的土方计算
利用三角网的土方量计算
在之前的文章 Cesium 中获取地形三角网并进行土方计算 中提到了通过获取地形三角网来进行土方量计算的方法,这种方法的优点是计算效率高,并且结果一定是准确的,但缺点是只能针对地形进行计算。
最近时不时就有人问我有没有能够支持 3DTiles 的土方量计算。这里统一回答,Cesium 为了保证性能,在解析 3DTiles 时,将解析完成的信息推送到 GPU 之后,就将这些信息删除了,因此无法获取 3DTiles 的三角网信息。
因此在不修改源码的前提下,只能通过其他方式来进行土方量计算。
利用采样点的土方量计算
通过均匀设置采样点获取高度来进行土方量计算是最简单的一种方式。事实上,这种方式才是我第一个实现的土方量计算 🤣
该方式的特点是:
- 计算结果与采样点个数有关(采样点个数越多,结果越接近真实值)
- 采样点个数会影响计算效率(采样点个数越多,计算效率越低)
- 对于所有可见的数据均能计算
- 对于上宽下窄或者中间有掏空的物体无法获取正确的结果(参考下图)
计算原理就不再赘述了,重点讲一下怎么提升性能。
很多人也通过这种方式实现了自己的土方量计算,但是基本都会遇到一个问题,采样点太多的话会导致计算的很慢,如果用 Cesium 官方提供的方式,甚至会卡住一段时间。
那么对于这种情况,就可以使用深度图去加速计算了,具体原理是:
- 绘制范围后,计算一个刚刚好能够看完计算范围的相机
- 利用这个相机进行深度测试,获取深度图
- 将深度图上的像素转换成世界坐标
- 判断点在不在范围内
- 点在范围内的话,计算当前填方/挖方
实际体验
实际上计算的效率很快(参考打开异步创建图形选项后,从绘制完成到结果框中显示结果的时间),示例默认情况下的卡顿是由于绘制图形过于复杂的缘故,可以尝试打开异步创建,此时图形会过一段时间才出来。
或许可以不画那么复杂的图形?
Cesium中支持任意数据的土方计算
https://www.liaomz.top/2023/04/07/cesium-zhong-zhi-chi-ren-yi-shu-ju-de-tu-fang-ji-suan/