RecastNavigation-理解高度场
本文翻译自CtritterAI:http://critterai.org/projects/cainav/doc/html/6fb3041b-e9be-4f03-868b-dcac944df19b.htm
RecastNavigation是一款非常强大的寻路系统,被广泛的应用于各大游戏引擎中。如Unreal,Unity等。我之前也尝试看过部分RecastNavigation源码,添加了一些注释,放到了我自己的github上(https://github.com/youlanhai/recastnavigation-learn)。
CritterAI是基于RecastNavigation原理开发的一套寻路系统,因此理解了CritterAI也就相当于理解了RecastNavigation。因为RecastNavigation的学习资料比较少,当我看到这篇文章的时候,觉得能够帮助我们去深入理解RecastNavigation,所以就翻译下来跟大家分享,有翻译不当的地方尽请指正。以下是原文翻译:
概述
为了能够运用高级导航网格的生成特性,你需要理解NMGen构建流程的核心。为了理解这个构建流程,你需要理解高度场(heightfield)。这里有两种高度场:体素集(voxel field)和顶点集(vertex field)。
体素集包括普通高度场(Heightfield)和紧缩高度场(CompactHeightfield)。
顶点集包括轮廓集合(ContourSet)和多边形网格(PolyMesh)。
高度场结构概要(Basic Heightfield Structure)
想象一下,一个位于欧几里得空间(euclidean space)的AABB,它的边界使用了最小和最大顶点来定义。
现在,使用固定的宽度和深度(XZCellSize)将盒子沿着垂直方向切割成列。每列就是一个格子。
接下来,使用固定的高度增量(YCellSize)切割每一列,将每一列都分割成小的轴对齐包围盒。每个盒子就是一个体素。位于盒子角落的8个顶点就是顶点集。
顶点集相对来说容易理解,他们就是格子中的顶点。但是体素需要更多的解释。
实心高度场(The Solid Hieghtfield)
在这篇文章中,术语体素常被区间(span)替代,因为区间是压缩存贮的体素。
想象一下,有这样一列体素。体素可能是一个实心的区域,代表了障碍物;也可能是开阔的空间,表示了这个位置什么也没有。
我们把一列上连续的实心体素合并成一个实心的区间。
这些实心的区间,使用HeightfieldSpan结构来存贮。实心区间组成了一个高度场,表示了障碍空间。
开放的紧凑型高度场(The Open Compact Heightfield)
我们不会只关注实心空间本身,许多算法都是在实心区间的上方执行的。对于生成导航网格而言,比实心空间更重要的是它的上方空间。开放区间,表示的就是这样的空间1。
需要特别注意的是,开放区间并不是简单的将实心空间取反。如果高度场的某一列不包括任何的实心区间,那么它也就没有开放区间。同样,位于实心区间最下方的部分也会被忽略掉2。位于一列中的开放区间,是从一个实心空间顶部开始,向上延伸到邻接的实心区间底部。(如果上方没有实心的区间,那么就一直延伸到无穷远)
注意:下面的例子表示的是开放区间,尽管第一眼可能看不到明显的区别,但可以观察到3个开放区间(黄色)。
开放区间,使用CompactSpan结构来存贮,他们组成了紧缩高度场,代表了开放空间。