NavMesh的生成原理


本篇内容介绍了“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的生成原理”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注开发云网站,小编将为大家输出更多高质量的实用文章!

相关推荐: 多线程如何减少上下文切换以及避免死锁的方法有哪些

本篇内容主要讲解“多线程如何减少上下文切换以及避免死锁的方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“多线程如何减少上下文切换以及避免死锁的方法 香港云主机有哪些”吧!到此,相信大家对“多线程如何减少上下…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 08/06 21:29
Next 08/06 21:29

相关推荐