TechWrites

There is no audience.

【译】NMGen - 轮廓生成

本页介绍了构建导航网格的第三阶段,即生成表示源几何体的可穿越表面(traversable surface area)的简单多边形(凸多边形和凹多边形)。轮廓仍然以体素空间为单位表示,但这是从体素空间回到向量空间的第一步。

源数据类:OpenHeightfield
构建器类:ContourSetBuilder
数据类:ContourSetContour

如果您需要了解此阶段执行的操作,请回顾处理过程概览

搜索区域边缘(Region Edges)

从开放高度场结构转向轮廓结构时,最大的概念变化是从关注span的表面(surface)转变为关注span的边(edges)。

对于轮廓,我们关心span的边。 有两种类型的边:区域边和内部边(region and internal)。 区域边是其邻居位于另一个区域中的span的边。 内部边是其邻居在同一区域中的span的边。

为了便于可视化,接下来的几个示例仅处理 2D,稍后我们将回到 3D。

在此步骤中,我们希望将边分类为区域边或内部边。这些信息很容易找到。我们遍历所有span,对于每个span,我们检查所有轴邻居,如果轴邻居与当前span不在同一区域中,则该边将被标记为区域边。

【译】NMGen - 区域生成

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

本页介绍了构建导航网格的第二阶段,即生成表面区域,用以表示源几何结构的可通过表面。

源数据类:SolidHeightfield
Builder 类:OpenHeightfieldBuilder
数据类:OpenHeightfield

如果你需要回顾此阶段执行的操作,请参见:处理过程概览

solid span比open span更容易可视化。所以这个页面的大多数可视化都使用了solid span。但要记住,这里描述的大多数算法使用open高度场而不是solid高度场。

创建开放高度场(Open Heightfield)

高度场简介中所述,开放高度场表示实体高度场中span上方的区域。开放高度场的创建相对简单,循环遍历所有实体span,如果span被标记为可通过,则确定它的最高值与其所在列中下一个更高span的最低值之间的开放空间。 这些值分别形成了新的开放span的地板和天花板。如果一个实体span是它所在列中最高的span,则其关联的开放span将其天花板设置为任意高值(例如 Integer.MAX_VALUE)。新生成的开放span形成所谓的开放高度场。

【译】NMGen - 体素化过程

构建导航网格的第一阶段是使用体素化(voxelization)创建实体高度场(solid heightfield)。

构建类:SolidHeightfieldBuilder
数据类:SolidHeightfield

如果你需要回顾体素化过程中执行的操作,请参阅:处理过程概览

原文

The Voxelization Process

The first stage in building the navigation mesh is the creation of a solid heightfield using voxelization.

Builder class: SolidHeightfieldBuilder
Data class: SolidHeightfield

If you need a reminder of what is performed in the voxelization process, refer back to the high level process.

实体高度场的创建

在检测到源网格的轴对齐包围盒,并创建实体高度场以保存体素信息后,我们对源网格中的每个多边形执行以下过程:

确定多边形在高度场网格上的覆盖区(footprint)。 这是多边形的 2D 轴对齐包围盒,它限定了找出与该多边形相交的网格列,所需要的相交测试次数。

原文

Creation of the Solid Heightfield

After the axis-aligned bounding box of the source mesh is detected and a solid heightfield created to hold the voxel information, we perform the following process for each polygon in the source mesh:

Determine the footprint of the polygon on the heightfield's grid. This is the 2D axis-aligned bounding box of the polygon and limits the number of intersection tests required to find the grid columns intersected by the polygon.

【译】NMGen - 配置参数

原文: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

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

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

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

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

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

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

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

【译】NMGen - 处理过程概览

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

本页面描述了NMGen用于创建导航网格数据的过程概览。这个过程是由NavmeshGenerator类实现的。

如果你还没有这样做,我强烈建议你观看 AIGameDev.com 上的 Recast 演示视频

在演示中,Alex 提到 Recast 将在未来发布。 自录制视频以来,开源版本已经发布。 在撰写本页时,Recast 最高版本为 v1.4。

一般流程如下:

  1. 体素化:从源几何结构创建一个实体高度场
  2. 生成区域:检测实体高度场的顶部表面,并将其划分为由相邻span组成的区域。
  3. 生成轮廓:检测区域的轮廓,并将它们形成简单多边形
  4. 生成多边形网格:将轮廓细分为凸多边形。
  5. 生成详细网格:将多边形网格三角形化,并添加高度细节。
如何使用NMGen创建的数据超出了本研究的范围。但 Recast 的姊妹库 Detour 是如何使用这些数据结构进行寻路和空间推理的一个很好的例子,可以在Reast网站上找到它。

体素化(Voxelization)

SolidHeightfieldBuilder类实现。

在体素化过程中,源几何结构被抽象为一个表示障碍空间的高度场。 然后对不可行走的表面进行一些初始剔除。

源几何结构中的每个三角形都使用保守体素化的方式进行体素化并添加到高度场中。保守体素化是一种确保多边形表面完全被生成的体素包围的算法。

下面是使用保守体素化包围三角形的一个例子:

Page 2 of 7

Powered by WordPress & Theme by Anders Norén

粤ICP备2021073162号-1