NavMesh的生成原理

发布时间:2021-08-26 13:38:41 作者:chen
来源:亿速云 阅读:310

本篇内容介绍了“NavMesh的生成原理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

简述

本篇文章介绍了NMGen的核心处理流程。NMGen用于生成多边形数据,代表了导航网格的表面。有很多种网格生成方式,但是他们都包含了下面的一些步骤。

主要流程如下所示:

1. 体素化。从源几何体构造实心的高度场,用来表示不可行走的空间。

2. 生成地区。将实心高度场的上表面中连续的区间合并为地区。

3. 生成轮廓。检测地区的轮廓,并构造成简单多边形。

4. 生成多边形网格。将轮廓分割成凸多边形。

5. 生成高度细节。将多边形网格三角化,得到高度细节。

一、Voxelization(体素化)

核心类:Heightfield

在体素(体素是空间中的一个有大小的点)化阶段,源几何体被转换成高度场,用来表示不可行走的空间。一些不可走的表面在这个阶段会被剔除掉(比如坡度过大的面 )。

对于源几何体上的每个三角形,使用“保守体素化算法”(Conservative Voxelization)分割成体素,并加入到高度场中。保守体素化算法确保了每个三角形面,都会被生成的体素完全包围。

体素化阶段后,实心高度场(solid heightfield)包含了很多的区间(span),覆盖了源几何体上的所有面。

NavMesh的生成原理

二、Region Generation(生成地区)

核心类:CompactHeightfield

这一阶段的目标是,近一步定义实体表面上哪部分是可以行走的,以及将这些可行走的部分划分成连续的地区,这些地区可以最终构成简单多边形。

首先,将实心的高度场,转换成一个开放的高度场(open heightfield),用来表示实体表面上那些可以行走的部分。一个开放的高度场,表示位于实体空间表面的地表部分。

在下图中,绿色部分代表开放区间(span)中的地表。这相当于是实心高度场上所有可行走的上表面。注意那些墙,桌子下面的区域,以及走廊扶手上那些比较窄的区域,已经在实心高度场生成的时候被剔除掉了。一些不可行走的区域,比如桌面,楼梯扶手,墙边较窄的位置,目前仍然显示为可行走的。

NavMesh的生成原理

然后,进一步剔除掉不可行走的区域。在计算完成的时候,开放区间中那些认为可以行走的部分,应该通过下面的测试: 
+ 该区域不能紧挨着障碍物(如,墙,家具等)(使用WalkableRadius作为距离阀值) 
+ 该区域在表面之上没有足够的开放空间(非碰撞区域)。(人在不碰撞到其他物体的情况下,能够合法的移动)(使用WalkableHeight作为高度阀值)

为剩下的所有区间生成邻接信息,用于把他们合并成一个大的面片。该算法使用一个最大垂直步长(WalkableStep4)来决定哪些区间是可以连在一起的。这允许一些特殊的结构能够被考虑进来,比如楼梯,路边,桌面等。例如,构成阶梯的区间能够当做邻居被连接在一起,而桌面上的区间就不能和地板连接在一起。

下图显示的是地区。注意看阶梯上的那些地区,尽管构成的区间并没有直接相连。也需要注意那些桌子上,楼梯扶手,以及所有其他实心高度场上不可走的面,在这个阶段后已经被成功剔除了(黑色表示被剔除的区间)。

NavMesh的生成原理

在该阶段后,这些相连的地区代表了可行走的面。

三、Contour Generation(生成轮廓)

核心类:ContourSet

轮廓就是沿着地区边缘“行走”,构成简单多边形。这是从体素空间转换回向量空间的第一步处理。

首先,从地区生成非常精细的多边形。

NavMesh的生成原理

然后,使用多种算法来完成下面的步骤:

+ 简化相邻多边形的边缘(地区之间的部分)

+ 简化边界(边界是没有邻接或邻接了障碍物的轮廓)(EdgeMaxDeviation)

+ 优化边界的长度。(边界如果太长,不能得到最优的三角形)

下图展示了执行此算法后的轮廓

NavMesh的生成原理

在该阶段结尾,简单多边形代表了可行走的表面。

四、Convex Polygon Generation(生成凸多边形)

核心类:PolyMesh

许多算法只能用于凸多边形。因此,这一步需要把轮廓构成的简单多边形转换成凸多边形网格。

下图中,你可以看到由轮廓形成的凸多边形。

NavMesh的生成原理

在该阶段的结尾,一个凸多边形网格代表了可以行走的表面。

五、Height Detail Generation(生成高度细节)

核心类:PolyMeshDetail

在这最后的阶段,凸多边形网格会被Delaunay三角化算法三角化,于是可以增加高度的细节。在多边形的内部或者边缘添加顶点,来确保网格与原始几何体表面等价。(DetailSampleDistance和DetailMaxDeviation)

NavMesh的生成原理

“NavMesh的生成原理”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

推荐阅读:
  1. RSA令牌动态口令生成原理
  2. 生成树原理

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

上一篇:JVM垃圾回收算法的概念介绍

下一篇:linux怎么查找目录下的所有文件中是否含有某个字符串

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》