核心构建过程
http://www.critterai.org/projects/cainav/doc/html/e72bd1ee-04b0-4bbb-a21d-d8d7ecaa11af.htm
本文涵盖 NMGen 构建导航网格的核心处理过程。网格的生成处理有许多变种,但他们都包含这些步骤。
IncrementalBuilder 扩展实现了这些处理。
处理过程如下:
- 体素化:用源几何模型生成 "solid heightfield" 代表阻挡空间。
- 生成域:探测 "solid heightfield" 的上表面,把他划分成连续的空间段。
- 生成轮廓:探测这些区间的轮廓,把他们划分成 "simple polygons"(simple polygons which do not self-intersect)。
- 生成多边形网格:将轮廓细分成凸多边形。
- 生成 Height Detail:三角化多边形网格并添加高度细节。
体素化:
核心类:Heightfield
体素化几何体是指用抽象的 heightfield 代表阻挡空间。然后这些阻挡会被剪裁掉。
源几何体中的三角形通过 "conservative voxelization" 算法体素化 下载。 "conservative voxelization" 算法能够将所有的三角面都包裹在它生成的体素模型中。
体素化后,"solid heightfield" 的空间中会完全包含源几何所有的面。
生成域:
核心类:CompactHeightfield
这一步为了确定哪些区域是可以行走的,并将这些区域连起来生成 "simple polygons"。
先将可以行走的空间由 "solid heightfield" 转成 "open heightfield"。"open heightfield" 代表空间中可能成为地面的部分。
如下所示,绿色区域代表开放空间中的地面。这代表 "solid heightfield" 可行走区域中上面的面(box top)。像墙、桌子底下、阳台扶手等应该在 "solid heightfield" 生成时剪切掉。一些不能走的区域如桌子上、楼梯扶手、墙沿这时还是可走的。
下一步,删除不可行走的区域。最后开放空间只包含通过以下测试的区域:
- 离阻挡空间不能太近。(如墙、家具等)
- 有足够的空间(移动代理可以不与其他物体碰撞地通过)
相邻信息用于把开放空间连起来。算法需要考虑垂直的最大距离阈值,这允许将楼梯、路沿、桌面等考虑进来。例如,楼梯会连在一起,但桌面和地面不会相连。
区域使用相邻信息和分水岭算法(watershed algorithm)。区域的大小可优化,太小的区域会被剪裁。
下例展示的区域中,楼梯之间虽然有空隙仍被连在一起。桌面、楼梯扶手和其他不可走的区域已被剪裁。(黑色代表剪裁掉的空间)
最后,可行走的面被连在一起。
生成轮廓:
核心类:ContourSet
区域的轮廓是由可行走的多面生生成的。第一步将体素空间转到顶点空间。
首先,用这些区域生成有详细描述的多边形。
接下来,有多个算法将被用于完成这个处理过程:
- 简化多边形的边界(区域之间)
- 简化边界线
- 优化边的长度(边太长不能生成优质三角形)
下展示了计算后的边界。
生成凸多边形:
核心类:PolyMesh
许多算法都只能用于凸多边形。所以这一步将轮廓划分成凸多边形。
下图是加工后的,混合凹多边形的轮廓图。
生成详细高度图:
核心类:PolyMeshDetail
最后,凸多边形用 "Delaunay triangulation" 算法三角化,高度细节也将被添加进来。添加顶点到多边形的边上,并确保与原多边形的面贴合。