zoukankan      html  css  js  c++  java
  • 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结构来存贮,他们组成了紧缩高度场,代表了开放空间。


    1. 译注:实心空间之上的那部分空间
    2. 译注:因为那是悬空的,角色不能站在空中
  • 相关阅读:
    react-native项目之样式总结
    charles捕获手机端请求数据
    git常用命令常用场景
    window.open新打开窗口与新开标签页
    IE浏览器兼容性模式
    atom编辑器社区插件推荐
    操作linux命令
    java.lang.OutOfMemoryError处理错误
    SQLServer中ISNULL、NULLIF和CONVERT函数
    plsql 查询结果窗口 不正常
  • 原文地址:https://www.cnblogs.com/ygxsk/p/7693962.html
Copyright © 2011-2022 走看看