基于NavMesh的A*寻路算法

11 篇文章 1 订阅
3 篇文章 0 订阅

基于NavMesh的A*寻路算法

源码地址:https://github.com/WarZhan/NavMeshOpenGL

一、导入数据生成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),两多边形间的花费近似为两多边形重心的位置,得到路径后用拐点法优化。

 
 

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

 

   

参考文献:

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

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值