翻译自: http://www.critterai.org/projects/nmgen_study/config.html
参考: http://blog.csdn.net/kun1234567/article/details/41714511
其他各处记不清了,不一一列出
说明: 英语水平有限,仅限于翻译原网页,并参考了以上作者的翻译,加以整理,并没添加过多的个人经验.(后面会有些个人经验说明),由于理解可能出现偏差,建议对照原英文文档参阅
一. 总览
二.详细
CellSize
限制: > 0
说明: cellSize是最核心的参数,会影响几乎剩下所有的参数的效果
构成x/z平面的体素场
较低的值可以更加贴近原Mesh,但会导致更高的处理和内存消耗
有时可能会发现寻路网格沿着障碍物边缘的会出现一些不期望的较大边距,或者寻路网格与同一个物体的不同边有不同的边距。这是寻路网格生成过程中的一个固有行为。寻路网格中的顶点被限制在x/z平面内体素的顶点上,因此cellSize确定的体素越大,这种误差越大。这是由于cellSize确定的体素的分辨率决定的,是无法去除的,除非cellSize可以无限小,体素可以无限小的细分原Mesh
[低分辨率下:寻路网格与原Mesh偏差offset,在两边不相同,左边偏差明显大于右边]
[高分辨率下,两边的偏差并没有明显差别]
CellHeight
限制: > 0
说明: cellHeight也是一个核心参数,影响几乎剩下所有的参数的效果, minTraversableHeight, maxTraversableStep, contourMaxDeviation应该大于cellHeight才能保证效果正常. maxTraversableStep的效果受cellHeight取值的影响十分明显.
对原Mesh进行采样时采用的高度分辨率.是x/z平面确定的体素场的体素高度
cellHeight采用原Mesh的y轴方向
cellHeight取值较小时生成的寻路网格更贴近原Mesh,并且会导致更高的处理耗时,但是并不会明显增加内存消耗.
[cellHeight和体素场的关系,可以看到,体素场是x/z屏幕的cellSize确定的,cellHeight是确定体素的高度的,即y轴,cellHeight值的大小确定了寻路网格对原Mesh在高度y轴方向的采样精度]
CellHeight和CellSize一起,控制了寻路网格上顶点的位置
最终生成的寻路网格将依据确定原Mesh形状的体素的顶部来生成,而不是原Mesh.也就是,寻路网格是覆盖在根据原Mesh得到的体素场的上表面上的.体素场即x/z平面确定了寻路网格的有无,而在(x,z)处出现的y方向的所有体素的CellHeight确定了寻路网格的高低.
因此寻路网格的顶点的y坐标是由体素的CellHeight确定的
即CellHeight越大,寻路网格上的顶点和原Mesh的y轴偏差越大.
[cellHeight越大,原Mesh采样的高度分辨率越低,寻路网格和原Mesh在y轴的偏差越大]
minTraversableHeight
限制: > 0
说明: minTraversableHeight应该大于等于2倍的CellHeight,来达到最佳效果
控制可以通过的最小高度
判断一些有顶的区域是否可以通过,比如城门,桥洞,避免过矮的地方可以通过,如桌子下面.
用来检查上方Mesh和下方Mesh的高度差,将高度差距过小的地方设置为不可行走.也可以被认为是agent的最大高度.
[minTraversableHeight设置恰当时,桌子底下不生成网格]
[minTraversableHeight设置太小时,桌子底下生成了网格]
[minTraversableHeight设置过大时,阳台下方的房间没有生成网格]
maxTraversableStep
限制: >= 0
说明: maxTraversableStep应该大于2倍的cellHeight
(maxTraversableStep > cellHeight * 2), 否则体素场的分辨率将不足以准确的检测到可行走的高度偏差,导致高度偏差被合并,使得台阶的高度被显著的加倍,特别是楼梯这种地方,会出现明显的问题
控制可通过的最大的凸起高度
防止轻微的高度偏差被识别为障碍物。用来检测楼梯状结构,路缘石等.
避免一些小凸起的地方被认为不可走,例如地面上的一层石板,楼梯台阶等.
[恰当的取值,可以正确的在楼梯上生成寻路网格]
[取值过小,导致楼梯区域被认为是不可行走. Agent无法攀爬楼梯台阶的高度]
[设置数值过大,导致寻路网格可以爬上桌面,导致Agent可以直接走到桌子上]
maxTraversableSlope
限制: >= 0
最大可行走的坡度(以度为单位)
[合适的取值,可以在斜坡上生成寻路网格]
[取值过小,使得斜坡上无法生成寻路网格]
ClipLedges
限制: 无
边缘突出部分裁剪,确定突出边缘是否可走
如果traversableAreaBorderSize > 0 则边缘部分的边距会比其他地方更宽,因此如果使用了traversableAreaBorderSize参数,一般并不需要边缘裁剪这个参数了.
traversableAreaBorderSize
限制: >= 0
说明: traversableAreaBorderSize取值必须大于cellSize,才能生效.
当开启了clipLedges时,实际边距会更大.
当smoothingThreshold > 0时,实际的边距会更大
控制寻路网格距离原Mesh障碍物的最小边距.
通常该值被设置为Agent利用寻路网格进行寻路的最大边界半径
比如Agent自身有宽度,则Agent在寻路时需要考虑自己的宽度(胖瘦),则寻路网格在靠近障碍物生成时的边距,需要预留出来Agent的宽度,这样Agent在寻路网格上移动和寻路时才不会和障碍物之间发生重合.
[设置border > 0时,寻路网格和楼梯墙壁之间产生边距.]
[设置border = 0时,寻路网格和楼梯墙壁之间紧密的贴合,剩下的 间隙是由体素的分辨率导致的]
SmoothingThreshold
限制: >= 0
当生成用于导出区域的距离场时要执行的平滑量
该参数控制区域的形成和边距检测,一般来说,该参数取值越大,生成的区域越大,生成的瘦长三角形越少,寻路网格与原Mesh的边距越大,当该参数=0时,将关闭平滑处理
[SmoothingThreshold = 0时,会出现更多的细长三角形]
[SmoothingThreshold = 2时,三角划分效果较好]
如上面描述提到的,SmoothingThreshold会导致网格边距增大,哪怕是将traversableAreaBorderSize 设置为0,也就是SmoothingThreshold会显著放大traversableAreaBorderSize 的效果.
[SmoothingThreshold = 0时,网格边距由traversableAreaBorderSize 定义,效果符合期望]
[traversableAreaBorderSize 取值不变时, SmoothingThreshold = 2,网格出现较大的边距]
隐含的问题: 当SmoothingThreshold取值过大时,会出现畸形的区域, 导致三角测量和轮廓匹配失败, 测试发现,当SmoothingThreshold > 4时会出现问题。
该问题出现在区域生成阶段,如果区域处本来没有边距,平滑的边距处理会导致区域变的畸形.
一般来说, SmoothingThreshold不会设置为>2,若出现该问题,可以设置traversableAreaBorderSize > 0 或者降低SmoothingThreshold
UseConservativeExpansion
限制: 无
使用保守的区域扩张算法,用来规避畸形区域的生成.
如果寻路网格缺少一些应有的部分,开启该特性可能会解决这个问题
开启该特性会显著增加处理耗时
这个特性在Recast中没有,不确定这个功能所涉及的问题,是否也存在于Recast中
[不开启保守区域扩展算法时,区域沿着两列生成{?},这导致三角划分算法无法对非简单多边形进行最终完全划分,导致一些区域无法生成寻路网格]
minUnconnectedRegionSize
限制: > 0
未连接的,独立的区域的最小尺寸.
该取值是以体素为单位的.
一些不和其他区域相连的寻路网格,如果其尺寸小于该值,会被剔除.比如一些屋顶或者岩石的表面,这些区域一般来说是很零散的,尺寸都不大,一般是不可以寻路的,不需要生成网格,该参数合理的取值会避免在这些无谓的区域生成寻路网格.从而优化网格,提升效率.
[该参数合理的取值,使得桌子上面没有生成网格.不可寻路]
[该参数取值过小,导致桌面出现网格]
mergeRegionSize
限制: >= 0
当一些区域的尺寸小于此参数时,如果可以,会和较大区域合并.
取值以体素为单位
该参数可以帮助减少一些尺寸较小的区域
由于区域生成算法的固有错误,会产生一些不期望的小区域.这在三角路径区域划分时,更为明显.
如果小区域无法被合并到临近的区域,则这些小区域会被保留,不会改变.比如合并后会导致非简单多边形等原因导致无法合并.
[该参数取值过小,产生了一些细长三角形]
[该参数取值足够大,一些细长三角形被合并,网格有更少的细长三角形]
maxEdgeLength
限制: >= 0
表示寻路网格的多边形边的最大长度。
如果网格中多边形的某些边的长度超过该参数,会在边上增加顶点以划分过长的边.
在一些情况下,会减少出现细长的三角形
[该参数取值为0时,禁用该特性,三角形边长较大]
[该参数合理取值,会在较长边上增加顶点,将较长边划分为多个短边]
edgeMaxDeviation
限制: >= 0
寻路网格多边形的边偏离原Mesh的最大偏移量
更小的取值会使得寻路网格更加贴近x/z平面的原Mesh边缘.这会显著的增加三角形的数量以更加精细的贴近原Mesh,也会显著的增加处理耗时
当取值=0时,会导致寻路网格中多边形的数量大量增加,以及较高的处理耗时.这是不建议的.
[边缘匹配完全关闭时,寻路网格的边与原Mesh之间偏差很大]
[适度的边缘匹配参数取值,寻路网格较好的匹配原Mesh的边缘]
[边缘匹配参数取最大值时,寻路网格十分紧密的贴合原Mesh,但是寻路网格上增加了大量的多边形]
maxVertsPerPoly
限制: >= 3
在体素到多边形转换过程中生成的多边形中每个多边形的最大顶点数
较大的取值会导致较高的处理耗时,但是会在寻路网格上生成较好的多边形.
一般取6左右的值即可,更高的取值,收效递减
contourSampleDistance
限制: >= 0
设置寻路网格的细节网格与原Mesh表面匹配时的采样距离
影响细节网格对原Mesh表面轮廓的匹配程度.较高的取值,会使得寻路网格的边缘与原Mesh的边缘匹配的越精细,越贴近.同时会导致寻路网格上出现更多的三角形和更高的处理耗时
说明: contourSampleDistance(轮廓匹配)和edgeMaxDeviation(边缘匹配)的区别是:轮廓匹配是在y轴上和原Mesh进行近似匹配,轮廓匹配将整个寻路细节网格的表面和原始Mesh的轮廓进行匹配.而边缘匹配只拿寻路网格的多边形的边和原始Mesh的轮廓进行匹配.(即轮廓匹配是整个寻路网格面对原Mesh的抽样近似,而边缘匹配只是寻路网格上多边形的边对原Mesh的抽样近似.所以,轮廓匹配更加细致)
当取值 < 0.9 时,该参数不生效.
[轮廓匹配关闭,边缘匹配适度时,寻路网格边缘部分贴近原Mesh的边缘,但是寻路网格的中间部分相对于原Mesh不够精细]
[轮廓匹配和边缘匹配都取适当值时,寻路网格的中间区域也有了更多三角形]
[轮廓匹配取值较高,边缘匹配取值适度时,寻路网格内部出现了非常多的三角形]
contourMaxDeviation
限制: >= 0
寻路网格的细节网格偏离原Mesh表面的程度
该参数的准确性受contourSampleDistance的影响
如果contourSampleDistance = 0 则该参数无效
当取值=0时,会导致寻路网格中多边形的数量大量增加,以及较高的处理耗时.这是不建议的
效果可以参考contourSampleDistance
三. 其他补充
1. 根据对Unity NavMesh的分析,发现Unity使用的NavMesh烘培参数要和Recast提供的默认参数差别很大,因此如果单纯的按Recast的参数范围调节,很难达到Unity的精细度,另外,参数调节一定要慎重分析其对其他参数的影响
这篇博客意在通过分析CritterAI来对照Recast的参数.以便更好的理解Recast,但是两者参数并不完全一致.
2. 尽可能的减少瘦长三角形,由于瘦长三角形夹角过小,计算机数据类型精度限制,容易导致寻路路径产生奇怪的弯曲.(Unity的NavMesh寻路算法在Recast基础上进行了很大的修改)
参考: http://www.cnblogs.com/yaukey/p/recastnavigation_unity_optimize_visible_result.html
参考: <<3d数学基础 图形与游戏开发>>
3. 注意网格参数精细度和性能之间的平衡,如果过分追求精细度,有可能导致寻路路径点过多,达到Recast限制
若有补充感谢补充
文章错误,请务必指出,以免误导他人,十分感谢