recastdemo源码详解 002

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
在这里插入图片描述
把高度场转化为紧缩高度场
XXXXXXXXXXXXXXXXX
然后把每一个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,

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值