寻路网格简介
寻路网格
寻路网格是对地图用于寻路的简化描述,将地图简化表示成一个个网格区域,每个区域是寻路算法中的一个点,寻路算法负责找到如何从一个点到达另外一个点。
栅形网格
最常见的是寻路网格,也即建立一个二维数组,每个坐标表示长宽都为n米的区域可通行的情况,可以用0表示可通行,1表示有障碍不可通行,n的大小根据项目情况确定,一般可以为1,其大小影响内存。需要在内存占用量与寻路细节间做权衡。
更进一步的,为表示角色在不同区域行走的快慢,可以基于不同区域不同的权重。此时,可用0表示有障碍,1-10等表示区域权重。
网格通常需要在导出场景数据时做数据导出,同时还需要做可视化、扩展编辑支持,以便可以动态调整。因为地形是多样的,没有一个统一的规则可以确保生成的导航网格与地图完全一致。
导出的数据可以是一个bytes文件,也可以是类似地形贴图的一张RGB图片,例如(255,255,255)表示可通行,(0,0,0)表示不可通行,(100,100,100)表示沼泽区域等,图片有更多的数据位,能表示更多丰富的情况。
路点网格
在地图上设置特定的点,点与点之间的连线就是需要行走的路径。
寻路时找到与起始点最近的路点,与目标点最近的路点,根据路点间的连线即可找到一条路径,注意两个路点的连线不一定要是直接,可以做曲线编辑。
路点需要支持可视化的编辑,通常需要专门的地图编辑器,用于增删路点、调整连线、读写数据等。
路点是人工设置的,可以很轻易找到合理的路径,但为应对各种不同的情况,设置大范围可行走区域时,编辑路点的工作量会越来越大。
三角网格
三角网格可以看作对路点网格的优化,可以通过模型Mesh计算出障碍区域的边界,得到可行走和不可行走的区域,可行走的区域是一系列线段连接构成的平面多边形。三角网格中需要将其分解为一系列不相交的三角形。
这涉及平面多边形的三角剖分问题。常见的算法包括耳切法、单调多边形剖分、动态规划方法、Delaunay三角剖分等。
在栅形网格中,一个点表示一个正方形区域;在路点网格中,一个点表示一个路点;在三角网格中,一个点表示一个三角形区域。
其邻近点即为邻近的三个三角形区域,相邻距离可以用两个三角形的中心点距离表示,与目的地的距离可以通过三角形中心点和目标所在三角心的中心点距离来表示
可以结合地形特点划分不同的三角形区域,给予不同权重。
如此,自然也可以利用A*寻路。
体素网格
栅形、路点、三角网格都是2D网格,对高度做了简化的处理,即低洼或凸起不超过一定高度,默认角色可以通行。
如果地形是多层次的,构建多层级2D网格依然无法实现在3D高度上的自由寻路,此时会用到体素网格。
RecastNavigation NavMesh
Unity和UE使用的寻路网格方案,也是目前主流的方案,之后单独做介绍,源码地址如下:
https://github.com/recastnavigation/recastnavigation