Recast Navigation 学习笔记(二)

核心构建过程

http://www.critterai.org/projects/cainav/doc/html/e72bd1ee-04b0-4bbb-a21d-d8d7ecaa11af.htm

本文涵盖 NMGen 构建导航网格的核心处理过程。网格的生成处理有许多变种,但他们都包含这些步骤。

IncrementalBuilder 扩展实现了这些处理。

处理过程如下:

  1. 体素化:用源几何模型生成 "solid heightfield" 代表阻挡空间。
  2. 生成域:探测 "solid heightfield" 的上表面,把他划分成连续的空间段。
  3. 生成轮廓:探测这些区间的轮廓,把他们划分成 "simple polygons"(simple polygons which do not self-intersect)。
  4. 生成多边形网格:将轮廓细分成凸多边形。
  5. 生成 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" 算法三角化,高度细节也将被添加进来。添加顶点到多边形的边上,并确保与原多边形的面贴合。

    

 

posted @ 2017-03-11 13:45  tomren  阅读(3090)  评论(0编辑  收藏  举报