Wallen's Note

There is no audience.

分类: Navmesh

  • 【译】NMGen – 细节网格生成

    【译】NMGen – 细节网格生成

    本页介绍了构建导航网格的第五个也是最后一个阶段,即生成具有详细高度信息的三角形网格。

    源数据类:PolyMeshFieldOpenHeightField
    构建类:DetailMeshBuilder
    数据类:TriangleMesh

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

    原文
    This page describes the fifth and final stage in building a navigation mesh, the generation of a triangle mesh with detailed height information.

    Source data class: PolyMeshField and OpenHeightField
    Builder class: DetailMeshBuilder
    Data class: TriangleMesh

    If you need an overview of what is performed in this stage, please refer back to the high level process.

    为什么要执行这一步

    如果将原始源网格的可通过表面投影到xz平面上,并与上一阶段生成的多边形网格重叠,两者将会非常匹配。但在三维空间中,多边形网格可能无法充分遵循源网格的高度轮廓 。这个阶段增加了高度细节,这样细节网格(detail mesh)将在所有轴上与源网格的表面相匹配。为了实现这一点,我们遍历所有多边形并在多边形与源网格过度偏离时沿着多边形的边和其表面插入顶点。

    在下面的例子中,楼梯附近的多边形网格在xz平面上匹配,但在y轴上偏差很大。

    (更多…)
  • 【译】NMGen - 凸多边形生成

    【译】NMGen - 凸多边形生成

    本页描述了构建导航网格的第四个阶段,即从由轮廓表示的简单多边形生成凸多边形。这也是我们从体素空间回到向量空间的地方。

    源数据类:ContourSet
    构建类:PolyMeshFieldBuilder
    数据类:PolyMeshField

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

    概述

    本阶段的主要任务如下:

    • 轮廓的顶点在体素空间中,这意味着它们的坐标采用整数格式并表示到高度场原点的距离。因此轮廓顶点数据被转换为原始源几何体的向量空间坐标。
    • 每个轮廓完全独立于所有其他轮廓。在此阶段,我们合并重复的数据并将所有内容合并到一个单一网格中。
    • 轮廓只能保证表示简单的多边形,包括凸多边形和凹多边形。凹多边形对导航网格来说是没有用的,所以我们根据需要细分轮廓以获得凸多边形。
    • 我们收集指示每个多边形的哪些边连接到另一个多边形的连接信息(多边形邻居信息)。

    坐标转换和顶点数据合并是相对简单的过程,所以我不会在这里讨论它们。如果您对这些算法感兴趣,可以查看文档详尽的源代码。这里我们将专注于凸多边形的细分。对每个轮廓会执行以下步骤:

    1. 对每个轮廓进行三角面化(triangulate)。
    2. 合并三角形以形成最大可能的凸多边形。

    我们通过生成邻居连接信息来结束这个阶段。

    (更多…)
  • 【译】NMGen - 轮廓生成

    【译】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 - 区域生成

    【译】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 - 体素化过程

    【译】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.

    (更多…)