The general process is as follows:
Voxelization - Create a solid heightfield from the source geometry.
体素化,根据几何体创建solid heightfield(recast里面的rcHeightField)
Generate Regions - Detect the top surface area of the solid heightfield and divide it up into regions of contiguous spans.
生成区域,决定哪一部分表面是可通过的。然后把这些可通过区域划分为邻近的 regions of spans,最终可以用它们形成凸多边形。
第一步,把solid heightfiled转成open heightfield(对应recast里面的rcHeightField转成rcCompactHeightField),open heightfield 也就是表示上表面开阔区域的heightfiled。
创建Neighbor Links,
比如上面这些,桌子下面这些,在生成solid heightfiled的过程就已经被排除了,因为一个体素中有多边形的面穿过而被认为是solid的。
然而在这个时刻桌子上面还是被认为是可行走的。
第二步,进一步排除 un-walkable spans ,排除条件:1 距离阻挡够远 2 上面能走人而不会碰撞到物体
为所有的open spans会产生邻居信息,算法:
所有邻居columns 为候选对象,只考虑四个方向的,而不考虑diagonal方向的,满足以下两条的span会被认为是neibour span:
1 两个span的floor的高度差够小
2 agent通过的时候不会撞到头
如上图,我们每一个独立的span是能放下一个人的,但是在邻居间移动的过程中没办法保证gap足够大。
生成distance field
distance field是什么:包含每个span距离最近的border span的距离。在生成regions的过程中这个算法会用到。
Border span:没有8个neighbor的span。是用来表示原始geometry的可行走表面与阻挡或者empty space之间的boundary。
生成regions
Regions的很重要一点是他们在映射到xz平面的时候会是简单多边形。
初始的生成region的算法:分水岭算法。
分水岭算法会从最低点的span开始慢慢地开始“floods”,进行迭代,每次迭代有一个当前的水平线,当前水平线以下的spans会被增加到现有的regions或者创建出新的regions。在region扩张的过程中如果一个被flood到的span临接一个已经存在的region,那么它会被加入