参考:
critterai http://www.critterai.org
recast & Detour https://github.com/recastnavigation/recastnavigation
关于理解 NavMesh 生成:
关于 PolyMesh 的理解,尤其是其有关多边形信息的格式,对于理解 rcPolyMesh 非常关键:
一则关于 Mesh 导入转换成 NavMesh 的讨论帖子:
一则关于作者说不添加导入普通 Mesh 到 NavMesh 功能的讨论贴子:
recast生成导航网格并不是直接用Mesh的原始面片开始合并的
先从平面几何体构建体素,再生成NavMesh
旋转一个物体会影响他的NavMesh生成结果
recast.h 中有大的步骤函数的定义
recast生成的5个步骤:
1 体素化: 将场景中所有物体体素化,保证体素信息覆盖全部原始几何体
2 生成移动区域:
a 将体素的上表面取出,为潜在可移动区域
b 剔除 距离阻挡(墙,家具)太近的 和 上表面太小不足以移动的(桌子,扶手)
c 合并可以移动的面,根据高度差,中间有没有阻挡等
d 剔除太小的面(最小面积)
3 生成轮廓(Contour):
a 从体素空间转为向量空间
b 从上一步的移动区域生成非常详细的多边形信息
Marching squares算法 https://en.wikipedia.org/wiki/Marching_squares
c 简化相邻多边形的边界
Douglas-Peucker算法 https://en.wikipedia.org/wiki/Polygonal_chain
b 简化外部边界(链接空的边)
d 优化边界长度(限定最长边线)
4 生成凸多边形:将轮廓几何体细分为凸多边形
5 生成高度信息:将高度信息写入顶点
Delaunay triangulation 让三角形统一化