Cesium中granularity关键字引起的连锁知识
granularity 翻译成中文是颗粒度,在Cesium中用到这个单词的相关类包括Circle、Corridor、Ellipse、GroundPolyline、Polygon、Rectangle、Wall、CZML。第一眼,你肯定觉得是跟几何精度相关的,其实就是跟几何精度相关的。
1、CircleGeometry
总所周之,圆是由正凸多边形圆拟合的。圆的精度用于圆所划分的次数。默认值是0.02。这个0.02可以为圆划分的边数为(1+Ceil(PI/2/0.02))*2~=160条边。因此,如果场景有非常多的圆,建议这个值还是取大一点。这个值最大可以到Math.PI/2。注意,这时候得到的边是8个,不是最少的3个。
2、ShadowVolume
不要以为这是一个乱入的章节。ShadowVolume的创建也跟granularity相关。总所周之,ShadowVolume是一个Volume,即是一个体,那么这个体多大呢?是由CircleGeometry中的granularity决定的。granularity越大,则ShadowVolume的最大高度越高。计算公式如下
const r = ellipsoid.maximumRadius;//6378137
const delta = r / Math.cos(granularity * 0.5) - r;
return 本身圆柱的最大高度+ delta;
因此,如果我们设granularity为Math.PI/2(最大值情况),则这个ShadowVolume会比原来的圆柱(或者圆)高30839米。而如果是默认的参数0.02,这个高度是318米。
3、CorridorGeometry
按理说,这个转弯墙也应该利用granularity来表示转角的圆滑度,默认值为Math.PI/180。但是Cesium却没有用,而是自己根据两面墙的夹角重新算了这个granularity。当前只能通过CorridorGeometryLibrary.computeRoundCorner这个函数,直接修改granularity来达到修改弯曲度。最小granularity为3。
4、GroundPolylineGeometry
它的granularity默认值是999。它是把线段进行切割长度的量。
这个值对贴地的线,只要不为0或者不超过这个线的长度,那么效果都是OK的,因为GroundPolylineGeometry会自己去根据地形采样,但是如果为0,那么就会出现下面的情况。
5、其他类型
由于时间关系,其他类型的几何在granularity设计上也会有所不同。后续有机会慢慢补上。