本文翻译自:http://critterai.org/projects/nmgen_study/voxelization.html
体素化过程
构建导航网格的第一步是使用体素化创建一个实体高度域
创建实体高度域
当检测到源网格的轴对齐包围盒并创建一个用于保存体素信息的实体高度域之后,我们对源网格中的每一个多边形(可以是三角形)执行以下过程:
确定多边形在高度域xz平面上的投影。用多边形的2d轴对齐高度域的边界,这样做减少了多边形与高度域作相交测试的次数
循环遍历投影覆盖的所有高度域列,并得出与该列相交的源多边形部分。如果发生相交,则导出一个新的“剪切”多边形。然后确定修剪的多边形的最小和最大高度。这代表这一列与源多边形相交部分在y轴上的体现(y轴上的红色区域)。
我们将基于以下信息将区间添加到高度域中:
与多边形相交的列
裁剪的多边形的最小到最大高度范围
裁剪的多边形上表面是否被标记为可行走
如果多边形在y轴上的倾斜程度小于配置参数中的maxTraversableSlope,则其表面是可行走的
将新的区间添加到高度域时,将发生以下情况:
- 如果新区间不与列中的任何现有区间相交,则会创建一个新区间。如果新区间与现有区间相交或被现有区间涵盖,则两个区间将合并。
- 当新的区间与现有区间合并时,必须对所得的合并区间是否可遍历进行评估。此“可遍历标记”仅适用于区间的上表面。如果设置,则表示区间的上表面坡度足够低,因此可行走。
- 如果新区间的上表面高于要合并到的区间,则将新区间的可遍历标志用于合并区间。
- 如果新区间的上表面小于要合并到的区间,则我们不在乎新区间的标志。新区间可行走的标志将被丢弃。
- 如果新区间的上表面与要合并到的区间处于同一高度,则如果其中一个被认为是可行走的,则将聚合区间标记为可行走。
更多的高度域区间标记
从技术上讲,源网格的体素化已经完成,并且高度域已经包含代表受阻空间的实体体素的区间。区间还具有一个标志,用于表示区间上表面是否是可行走的。但是,目前仅根据与区间相交的多边形的坡度设置此标志。现在是进行更多过滤的好时机。此过滤将从某些范围中删除可行走标志。
有两种类型的过滤:
首先,如果区间的上表面上方有一个过于靠近的障碍物,则该区间的上表面是不可行走的。因为容纳的高度不够(角色无法容纳在两个区间之间的空隙里)。
另一个可选的过滤设计到凸出物(ledge)检测。如果从区间的顶部向下到相邻区间的距离超过配置参数中的maxTraversableStep,则区间被视为凸出物且不可行走。