本篇内容介绍了“NavMesh的生成原理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
本篇文章介绍了NMGen的核心处理流程。NMGen用于生成多边形数据,代表了导航网格的表面。有很多种网格生成方式,但是他们都包含了下面的一些步骤。
主要流程如下所示:
1. 体素化。从源几何体构造实心的高度场,用来表示不可行走的空间。
2. 生成地区。将实心高度场的上表面中连续的区间合并为地区。
3. 生成轮廓。检测地区的轮廓,并构造成简单多边形。
4. 生成多边形网格。将轮廓分割成凸多边形。
5. 生成高度细节。将多边形网格三角化,得到高度细节。
一、Voxelization(体素化)
核心类:Heightfield
在体素(体素是空间中的一个有大小的点)化阶段,源几何体被转换成高度场,用来表示不可行走的空间。一些不可走的表面在这个阶段会被剔除掉(比如坡度过大的面 )。
对于源几何体上的每个三角形,使用“保守体素化算法”(Conservative Voxelization)分割成体素,并加入到高度场中。保守体素化算法确保了每个三角形面,都会被生成的体素完全包围。
体素化阶段后,实心高度场(solid heightfield)包含了很多的区间(span),覆盖了源几何体上的所有面。
二、Region Generation(生成地区)
核心类:CompactHeightfield
这一阶段的目标是,近一步定义实体表面上哪部分是可以行走的,以及将这些可行走的部分划分成连续的地区,这些地区可以最终构成简单多边形。
首先,将实心的高度场,转换成一个开放的高度场(open heightfield),用来表示实体表面上那些可以行走的部分。一个开放的高度场,表示位于实体空间表面的地表部分。
在下图中,绿色部分代表开放区间(span)中的地表。这相当于是实心高度场上所有可行走的上表面。注意那些墙,桌子下面的区域,以及走廊扶手上那些比较窄的区域,已经在实心高度场生成的时候被剔除掉了。一些不可行走的区域,比如桌面,楼梯扶手,墙边较窄的位置,目前仍然显示为可行走的。
然后,进一步剔除掉不可行走的区域。在计算完成的时候,开放区间中那些认为可以行走的部分,应该通过下面的测试:
+ 该区域不能紧挨着障碍物(如,墙,家具等)(使用WalkableRadius作为距离阀值)
+ 该区域在表面之上没有足够的开放空间(非碰撞区域)。(人在不碰撞到其他物体的情况下,能够合法的移动)(使用WalkableHeight作为高度阀值)
为剩下的所有区间生成邻接信息,用于把他们合并成一个大的面片。该算法使用一个最大垂直步长(WalkableStep4)来决定哪些区间是可以连在一起的。这允许一些特殊的结构能够被考虑进来,比如楼梯,路边,桌面等。例如,构成阶梯的区间能够当做邻居被连接在一起,而桌面上的区间就不能和地板连接在一起。
下图显示的是地区。注意看阶梯上的那些地区,尽管构成的区间并没有直接相连。也需要注意那些桌子上,楼梯扶手,以及所有其他实心高度场上不可走的面,在这个阶段后已经被成功剔除了(黑色表示被剔除的区间)。
在该阶段后,这些相连的地区代表了可行走的面。
三、Contour Generation(生成轮廓)
核心类:ContourSet
轮廓就是沿着地区边缘“行走”,构成简单多边形。这是从体素空间转换回向量空间的第一步处理。
首先,从地区生成非常精细的多边形。
然后,使用多种算法来完成下面的步骤:
+ 简化相邻多边形的边缘(地区之间的部分)
+ 简化边界(边界是没有邻接或邻接了障碍物的轮廓)(EdgeMaxDeviation)
+ 优化边界的长度。(边界如果太长,不能得到最优的三角形)
下图展示了执行此算法后的轮廓
在该阶段结尾,简单多边形代表了可行走的表面。
四、Convex Polygon Generation(生成凸多边形)
核心类:PolyMesh
许多算法只能用于凸多边形。因此,这一步需要把轮廓构成的简单多边形转换成凸多边形网格。
下图中,你可以看到由轮廓形成的凸多边形。
在该阶段的结尾,一个凸多边形网格代表了可以行走的表面。
五、Height Detail Generation(生成高度细节)
核心类:PolyMeshDetail
在这最后的阶段,凸多边形网格会被Delaunay三角化算法三角化,于是可以增加高度的细节。在多边形的内部或者边缘添加顶点,来确保网格与原始几何体表面等价。(DetailSampleDistance和DetailMaxDeviation)
“NavMesh的生成原理”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。