默认情况下,只能保证 NavData 会遵循具有一定精度的地形网格的垂直海拔高度。由于 NavMesh 旨在抽象地表示地形的适航性和拓扑,因此,只要能够成功区分可导航区域和非导航区域,Gameware Navigation 运行时组件就不需要它们严格遵循地形的精确海拔高度。
但是,在某些情况下,您可能会发现在 NavMesh 中直接嵌入精确的海拔高度信息会更方便。例如,要调整角色的海拔高度,使他们在行走时看起来贴近地面,您可能会发现使用 NavMesh 的海拔高度比使用物理光线投射在 CPU 时间上要便宜得多,即使结果通常有点不太精确。
如果您需要更高的精度,NavData 生成系统可以限制 NavMesh 的海拔高度,使其在您指定的容差范围内遵循原始地形网格的海拔高度。这通常会生成具有更多、更小三角形的 NavMesh。
NavData 生成系统为您的地形创建 NavData 之后,执行后期处理步骤,以调整 NavMesh 的海拔高度,使其更加匹配原始地形网格的海拔高度。
系统首先会创建一个具有可配置间距的水平采样栅格。为确保该栅格与原始光栅化匹配,将间距内部调整为针对地形网格光栅化初始设置的像素大小的倍数。在每个采样点都会检查地形网格和 NavMesh 之间的海拔高度差。
要直观显示默认 NavMesh 与垂直精确 NavMesh 之间的差异,请使用下面的示例地形。
假定为 NavData 生成系统配置的移动模型允许角色自由穿过这些四棱锥,默认情况下会生成以下 NavMesh。
如上所示的 NavMesh 精确表示了区域的适航性,并可以在运行时由人物使用而不会出现问题。但是,尽管可以在 NavMesh 中看到地形的大概形状,但却无法非常准确地反映原始地形网格的海拔高度。如果要使用此 NavMesh 的海拔高度来确定角色的海拔高度,而不使用碰撞系统使角色的脚贴近实际地面海拔高度,则角色的脚会轮流地稍高于地面或略低于四棱锥。(请注意,为避免深度冲突,Navigation Lab 会使 NavMesh 的海拔高度略微偏移地形的海拔高度以方便显示。在某些地方,NavMesh 的实际海拔高度从地形网格下方穿过。)
因此,您可以降低垂直容差(和水平采样步长),以提高 NavMesh 符合地形的精度。如果需要,可以获得与以下图像中类似的高保真度:
可以在 Gameware Navigation Lab 和 NavData 生成系统的 API 中设置海拔高度容差。
在 Generator 中设置海拔高度容差:
通过在 Altitude tolerance (m) 控件中设置所需的值,可以降低默认海拔高度精度。
尽管这将减少一定的生成时间,也可能会减小 NavData 的最终大小,但大多数情况下建议不要这样做。在 NavMesh 海拔高度明显有别于地形海拔高度的区域内,运行时组件可能无法正确检索与位于或高于地平面的给定 3D 位置对应的 NavMesh,因而无法对人物和障碍物进行空间化。这可能会导致导航查询失败并在使用障碍物管理系统时出现问题。