基于NavMesh的A*寻路算法

基于NavMesh的A*寻路算法

代码工程目录:

链接:https://pan.baidu.com/s/1anKCGe5EMigeeb1wfydrYA 
提取码:kebz 

一、导入数据生成NavMesh导航轮廓

1、由文本导入数据,数据要求:可走轮廓的最外围为顺时针方向,障碍物为逆时针方向,顶点不可有重复的,各障碍物不可叠加;

2、使用扫描线算法划分三角形,生成多边形轮廓;

3、将生成轮廓顶点信息转换为逆时针存储。

二、NavMesh导航网格的构建

1、在第一步生成的基础上构建多边形轮廓对象;

2、根据输入的轮廓三角形化,划分为紧凑拼接的三角形;

3、合并三角形,合并中先判断合成之后的多边形是否为凸多边形,是则合并,不是则跳过。

4、生成一个rcPolyMesh对象,包含顶点信息及多边形信息,npolys为多边形的数量,polys为多边形的数据,存放的为对应的多边形定点索引,nvp为多边形最大的顶点数。

 

三、寻路算法的实现(Dijkstra)(红色)

1、根据生成的rcPolyMesh,计算邻接信息(int二维数组),生成邻接矩阵,邻接的权值用所在多边形的最低点和最高点所连接对角线的长度。

2、鼠标左键点击确定起点,右键点击确定终点,点击鼠标的中间开始寻路。

3、根据起点和终点的位置确定两点分别在的多边形,使用顶点与多边形的边进行叉乘运算,若都在边得左侧,则点位于该多边形中。

4、根据Dijkstra算法得出一条最短路,找出所有邻接多边形的公共边,使用拐点发优化路径。

 

四、            优化(A*)(绿色)

1、根据生成的rcPolyMesh,计算邻接信息(bool二维数组)和多边形重心位置(Vec3),重心计算方式为;

2、鼠标左键点击确定起点,右键点击确定终点,点击鼠标的中间开始寻路;

3、根据起点和终点的位置确定两点分别在的多边形,使用顶点与多边形的边进行叉乘运算,若都在边得左侧,则点位于该多边形中;

4、A* 中所用估值函数为位置上两方向的增量(dx+dy),两多边形间的花费近似为两多边形重心的位置,得到路径后用拐点法优化。

 

 
 

注:两种寻路算法在出现扁长形多边形时,可能搜出的路径不是最优,当两种算法路径一样时,红色的被覆盖只能看见绿色的。

 

 基于NavMesh的A*寻路算法_第1张图片

   基于NavMesh的A*寻路算法_第2张图片

 

基于NavMesh的A*寻路算法_第3张图片

基于NavMesh的A*寻路算法_第4张图片

参考文献:

1、多边形生成三角形:http://sites-final.uclouvain.be/mema/Poly2Tri/poly2tri.html(网页很旧了 可能打不开需要资料者留下邮箱)

2、凸多边形网格构建:recastnavigation https://github.com/memononen/recastnavigation

3、凸多边形网络三角形划分:http://www.critterai.org/nmgen_polygen

4、路径优化拐点法: http://www.navpower.com/gdc2006_miles_david_pathplanning.ppt

你可能感兴趣的:(基于NavMesh的A*寻路算法)