原文:http://www.critterai.org/projects/nmgen_study/config.html

Unity官方文档中文版中,将“ledge”一词译为“窗台”,本文亦采用这种译法。
英文文档 中文文档

Recast Navigation文档中对ledge的定义:
A ledge is a span with one or more neighbors whose maximum is further away than walkableClimb from the current span's maximum. This method removes the impact of the overestimation of conservative voxelization so the resulting mesh will not have regions hanging in the air over ledges.
A span is a ledge if: rcAbs(currentSpan.smax - neighborSpan.smax) > walkableClimb

在进入网格生成每个阶段的细节之前,理解影响最终结果的各种配置参数是很重要的。这个页面提供了NMGen的类所使用的所有配置参数的功能描述,它们如何影响最终结果,以及它们之间如何相互影响。

cellSize

约束
> 0
使用者
NavmeshGenerator, SolidHeightFieldBuilder, SolidHeightField, OpenHeightField, ContourSet, PolyMeshField
描述

采样源几何图形时使用的宽度和深度分辨率。构成体素场的单元格列的宽度和深度。
单元格放置在体素场的宽度/深度平面上。 宽度与源几何体的 x 轴相关联,深度与 z 轴相关联。
较低的值使得生成的网格更接近源几何形状,但需要更高的处理和内存成本。

示例:cellSize与体素场的关系。

有时你可能会注意到障碍物的网格边界出乎意料地宽,或物体一侧与另一侧的边界的宽度不同。 这是网格生成过程的固有行为。 看一下上面体素场的可视化,最终网格中的顶点只能存在于体素的角上。 顶点被对齐到体素网格,体素尺寸越大,最终网格顶点的潜在 xz 平面偏移就越大,边界“错误”就越明显。

注意:在下面的两个例子中,traversableAreaBorderSize都被设置为0。尽管这会关闭边界功能,但边界仍然存在。这是体素场的分辨率导致的,只有无限高的分辨率才能完全消除这种影响。

边界示例 #1:这个网格是使用较低的分辨率(较大的cellSize)生成的。

边界示例 #2:这个网格是使用更高的分辨率(更小的cellSize)生成的。所以偏移的表现并不明显(尽管从技术上讲,它仍然存在)。

相互作用
这是一个与几乎所有其他参数交互的核心配置值。

cellHeight

约束
> 0
使用者
NavmeshGenerator, SolidHeightFieldBuilder, SolidHeightField, OpenHeightField, ContourSet, PolyMeshField
描述

采样源几何图形时使用的高度分辨率。体素场中体素的高度。
高度与源几何图形的y轴相关。
较小的值使得最终的网格更接近源几何形状,代价是更高的处理成本。(与cellSize不同,使用较低的cellHeight值不会显著增加内存使用。)

示例:cellHeight与体素场的关系。

cellSize 一样,cellHeight 控制顶点的位置。 最终网格的表面将“对齐”到包含源几何体的体素的顶部,而不是几何体本身。 这是网格生成过程的固有行为。看一下上面体素场的可视化,最终网格中的顶点只能存在于体素的角上,所以顶点被对齐到体素网格。体素的高度越大,顶点与实际源几何体的在y轴可能的偏移量就越大。

示例 #1:这个细节网格是使用较低的分辨率(较大的cellHeight)生成的。

示例 #2:这个细节网格是使用更高的分辨率(更小的cellHeight)生成的。因此,偏移的表现并不明显。

相互作用
这是一个核心配置值,影响几乎所有其他参数。minTraversableHeightmaxTraversableStepcontourMaxDeviation需要大于这个值才能正常工作。maxTraversableStep特别容易受到cellHeight值的影响。

minTraversableHeight

约束
> 0
使用者
NavmeshGenerator, SolidHeightFieldBuilder, OpenHeightFieldBuilder
描述

地板到天花板的最小高度,大于此高度则认为地板区域是可通过的。用于检测几何体中使下面的几何体变得无法行走的悬臂结构(overhangs)。也可以认为是最大的agent高度。

示例 #1:正确设置该值可以防止网格在桌子底下穿过。

示例 #2:将值设置得太低会导致网格在不应该穿过的桌子底下穿过。

示例 #3:将值设置得太高会导致网格无法延伸到阳台下方的区域。

相互作用
这个值应该至少是 cellHeight 的两倍才能得到好的结果。

maxTraversableStep

约束
>= 0
使用者
NavmeshGenerator, SolidHeightFieldBuilder, OpenHeightFieldBuilder
描述

最大窗台(ledge)高度,小于这个值则被认为是可通过的。
防止的微小的高度偏差就被不正确地显示为障碍物。使得检测楼梯状结构、路缘等成为可能。

示例 #1:正确设置该值使得网格沿楼梯向上延伸。

示例 #2:将值设置得太低会使楼梯看起来无法通过(agent无法走上楼梯)。

示例 #3:将值设置得太高会导致网格流过(flow up)桌子和柜台。

相互作用
maxTraversableStep 应该大于 cellHeight 的两倍(maxTraversableStep > cellHeight * 2)。 否则体素场的分辨率可能不够高,无法准确检测可通过的窗台(ledge)。窗台可以合并,有效地将它们的台阶高度加倍。对于楼梯来说,这尤其是个问题。
(原文:maxTraversableStep should be greater than two times cellHeight. (maxTraversableStep > cellHeight * 2) Otherwise the resolution of the voxel field may not be high enough to accurately detect traversable ledges. Ledges may merge, effectively doubling their step height. This is especially an issue for stairways.)

maxTraversableSlope

约束
>= 0
使用者
NavmeshGenerator, SolidHeightFieldBuilder
描述

可通过的最大坡度(slope)(以度为单位)。

示例 #1:正确设置这个值可以让网格向上延伸一个可通过的坡道。

示例 #2:将该值设置得太低会阻止网格向上延伸到应该可通过的斜坡。

相互作用

clipLedges

约束
使用者
NavmeshGenerator, SolidHeightFieldBuilder
描述
指示窗台(ledges)是否应该被视为不可行走。
窗台是一种可通过的体素,它有一个或多个相邻体素,从窗台体素顶部到其邻居体素顶部有一个不可步进的(un-steppable)下降。例如,如果一个使用网格的agent从窗台体素向下移动到它的邻居体素,则会导致违反最大可通过步距(maximum traversable step distance)。 Agent不能合法地从窗台“走下”到它的邻居。
相互作用
窗台裁剪在网格生成过程的早期执行。 这导致窗台体素被后来的算法解释为障碍物。 例如,如果 traversableAreaBorderSize > 0,那么被剪切的窗台附近的边界将比其他区域更厚。 出于这个原因,使用 traversableAreaBorderSize 功能时通常不需要窗台裁剪。

traversableAreaBorderSize

约束
>= 0
使用者
NavmeshGenerator, OpenHeightFieldBuilder
描述

表示网格的任意部分到源几何体中障碍物的最近距离。(原文:Represents the closest any part of a mesh can get to an obstruction in the source geometry.)
通常这个值被设置为利用网格进行导航决策的agent的最大边界半径(maximum bounding radius)。

示例 #1:设置边界大小为> 0可以使网格远离墙壁和楼梯扶手。

示例 #2:将边界大小设置为零会使网格更紧密地贴紧墙壁和楼梯扶手。

相互作用
此值必须大于cellSize才能生效。
如果启用了窗台裁剪,则窗台周围的实际边界会更大。 更多信息请参阅 clipLedges 参数。
如果 smoothingTreshold > 0,则实际边界区域会更大。有关详细信息,请参阅 smoothingThreshold 参数。

smoothingThreshold

约束
>= 0
使用者
NavmeshGenerator, OpenHeightFieldBuilder
描述

在生成用于推导区域(deriving regions)的距离场(distance field)时要执行的平滑量。
该值影响区域形成和边界检测。一般来说,数值越大,区域越大,细三角形(thin triangles)越少,边界越宽。
值为0则禁用平滑。

这个特性有一个已知的问题。详情请参阅问题页

示例 #1:当smoothingThreshold设置为0时,会有更多的细长三角形(与下一个例子相比)。

示例 #2:通过将平滑值设为2来改进三角剖分。

相互作用

正如描述中提到的,平滑创建了一个更宽的边界区域。事实上,即使将 traversableAreaBorderSize 设置为0,将平滑设置得太高也会导致网格周围出现边界。 这也意味着平滑放大了 traversableAreaBorderSize 的效果。

示例 #1:使用 traversableAreaBorderSize 定义边界,并将 smoothingThreshold 设置为零。沿墙和楼梯扶手的边界符合预期。

示例 #2traversableAreaBorderSize 使用相同的值,但将 smoothingThreshold 设置为 2。沿墙和楼梯扶手的边界比第一个示例中的要大。

useConservativeExpansion

约束
使用者
NavmeshGenerator, OpenHeightFieldBuilder
描述

应用额外的算法,以帮助防止形成畸形区域。
如果网格缺少了应该存在的部分,那么启用这个功能可能会解决这个问题。
启用此特性会显著增加处理成本。
这是一个在Recast中没有的实验特性。目前还不知道该特性所解决的问题是否存在于Recast中。

示例 :如果没有启用保守扩展,一个区域会围绕两列(two columns)流动。这将导致最终形成一个三角剖分算法无法处理的非简单多边形,因此该区域失去了它的网格。

蓝色区域不正确地围绕列(columns)流动,这就导致了内部的空洞和三角测量的失败。
相互作用
无。

minUnconnectedRegionSize

约束
> 0
使用者
NavmeshGenerator, FilterOutSmallRegions
描述

未连接(孤岛)区域的最小区域大小。
值的单位是体素。
在网格生成之前,未连接到任何其他区域且小于此尺寸的区域将被剔除。也就是说,它们将不再被认为是可通过的。

示例 #1:通过正确设置minUnconnectedRegionSize,桌子的顶部是不可行走的。

示例 #2:如果 minUnconnectedRegionSize 设置得太低,桌子的顶部就会有自己的网格。

相互作用
无。

mergeRegionSize

约束
>= 0
使用者
NavmeshGenerator, FilterOutSmallRegions
描述

如果可能的话,任何小于此大小的区域都将与更大的区域合并。
该值以体素为单位。
有助于减少小区域的数量。这在对角线路径区域(diagonal path regions)中尤其是一个问题,因为在对角线路径区域生成算法中固有的错误会导致生成不必要的小区域。
如果小区域不能与相邻区域合法地合并,则它们保持不变(例如,合并会导致非简单多边形)。

示例 #1:mergeRegionSize太小,生成了一些细长的三角形。

小区域造成的细长三角形

示例 #2:mergeRegionSize足够大,可以清理一些细长的三角形。

区域合并导致更少的细长三角形。
相互作用
无。

maxEdgeLength

约束
>= 0
使用者
NavmeshGenerator, NullRegionMaxEdge
描述

表示网格边界的多边形边的最大长度。
如果特定边超过此值,则会向边界边添加更多顶点。
在某些情况下,这将减少细长三角形的数量。
值为0将禁用此功能。

示例 #1:设置maxEdgeLength为0的网格(禁用)。

示例 #2:maxEdgeLength被启用,导致沿着网格边界产生新的顶点。

相互作用
无。

edgeMaxDeviation

约束
>= 0
使用者
NavmeshGenerator, MatchNullRegionEdges
描述

网格的边可以偏离源几何体的最大距离。
较低的值将导致网格边缘更准确地遵循 xz 平面的几何轮廓,但会增加三角形数量。
不建议将值设为0,因为它会导致最终网格中的多边形数量大幅增加,处理成本很高。

示例 #1:完全关闭边缘匹配。生成器尽可能创建最简单的边,但结果很差。

示例 #2:适度的边缘匹配可以使网格更好地遵循源几何体的边缘。

示例 3#:最大边缘匹配的结果是网格非常接近源几何体边缘,但多边形数量过多。

相互作用
无。

maxVertsPerPoly

约束
>= 3
使用者
NavmeshGenerator, PolyMeshField
描述
在体素到多边形转换过程中生成的多边形中,每个多边形的最大顶点数。
较高的值会增加处理成本,但也会导致在最终网格中形成更好的多边形。大约 6 的值通常就足够了,更高的值收益会递减。
相互作用
无。

contourSampleDistance

约束
>= 0
使用者
NavmeshGenerator, TriangleMeshField
描述

设置将细节网格与原始几何体的表面匹配时要使用的采样距离。
影响最终细节网格与原始几何体的表面轮廓的一致性。较高的值会导致细节网格更接近原始几何体的表面,但代价是最终三角形数量更多和处理成本更高。
将此参数设置为小于 0.9 将禁用此功能。

示例 #1:禁用轮廓匹配,适度的边缘匹配。所以边缘跟随轮廓线,但网格的中心区域不跟随。

示例 #2:适度的轮廓匹配和边缘匹配。更多的三角形被添加到网格的中心区域。

示例 3#:高度的轮廓匹配。

相互作用
这个参数和边匹配的区别在于,这个参数作用于高度而不是xz平面。它还将整个细节网格表面匹配到原始几何形状的轮廓。边缘匹配只是将网格的边缘与原始几何图形的轮廓进行匹配。

contourMaxDeviation

约束
>= 0
使用者
NavmeshGenerator, TriangleMeshField
描述
细节网格的表面可以偏离原始几何体表面的最大距离。
精度受 contourSampleDistance 的影响。
如果将 contourSampleDistance 设置为0,则此参数的值没有意义。
不建议将该值设置为0,因为这会导致最终细节网格中的三角形数量大幅增加,处理成本很高。
有关示例,请参阅 contourSampleDistance。
相互作用
如果contourSampleDistance设置为0,则该参数没有效果。