span 介绍
关键类 rcSpan
上篇博客讲到了体素化,接下来我们要把体素化生成的数据保存起来,span可以理解为拥有相同x,z坐标的体素的集合。
是用链表结构保存然后这个信息会保存在rcHeightfield结构里面
这里进行的操作是对可行走平面进行过滤
rcFilterLowHangingWalkableObstacles walkableClimb(可攀爬高度)如果两个span的上表面差值小于这walkableClimb时,如果下面一个span是可行走平面,那么上面这个span也要被标记成可行走平面
rcFilterLedgeSpans 凸起(ledge)检测,如果一个span到它相邻的span高度超过了walkableclimb,认为这个span是一个凸起,标记为不可行走
rcFilterWalkableLowHeightSpans 高度检测,如果一个span的上表面(smax)距离他上面的span的下表面(smin)距离小于walkableheight,那么这个span被标记为为不可行走,例如桌子的下面,高度比较低就不可以行走
区域生成
rcCompactHeightfield 紧缩开放高度与生成
关于高度场的详细讲解 https://blog.csdn.net/Windgs_YF/article/details/87791950
把高度场转化为紧缩高度场
然后把每一个span4个方向的可达的span的下标有压缩在一个int里面
因为设置的最打压缩坐标为(1<<6)-1,如果每个体素点有超过MAX_LAYERS个span,那么久认为这个数据非法,不写到数据里面,打log,
rcBuildCompactHeightfleld 根据walkableradius来计算边缘不可行区域
rcMarkConvexPolyArea 不清楚
rcBuildHeightfieldLayers 这个函数的功能是把spans,分层,分块,具体实现稍微有点复杂,
首先按照x轴,相同的相连的span看做一段,用srcReg标记,
同时把这一段前面一行(x轴的前一行)相连的段保存下来,如果这一段与两个不同段相连(在下面画了一个比较抽象的图)
那么就不再标记这一段的相连段(原因后面会解释)
在这里用到了之前提到的段的相连段的属性,注意有两个属性是ns,和preCount,ns代表某一段包含的span数,preConunt代表一个段被多少个span相连,如果这两个相等就把他们合成一个段(这里段用的是博主自己的理解,可能不是很好,可以理解为集合)。这里是为了处理层这个问题,比如说有一个楼梯连接了两层的span,那么楼梯边缘这部分span会是上下两层楼层地面的相连段,这种情况下,很明显不一样作为一个段。
如下图所示,蓝色,红色青色,3个段,青色段是蓝色段和红色段的相连段,但是蓝色段和红色段不在同一层,所以不能算作一段
这里更新了srcReg的信息
定义了seg数组用于保存span的一些信息,有相邻span的段信息,相同区域,不同层的段信息。
然后对段进行合并,然后就得到一些集合,每个然后在对不同集合在没有覆盖的情况下的在一定高度内的集合进行合并,然后对这些集合的id进行重新分配,就得到了rcHeightfieldLayerSet,