NAV导航网格寻路(2) -- 寻路方法

这篇是转的文章,原文http://blianchen.blog.163.com/blog/static/1310562992010324046930/

nav寻路一般包含两部分,首先是使用工具根据地图信息生成寻路用的nav mesh,接下来就是在游戏中根据生成的nav mesh来自动寻路。

一般人首先关心的就是寻路方法,所以这里把顺序颠倒下,先说寻路。

一.  使用A*寻找所经过网格路径

下图为一个已经生成nav网格的地图,深红色区域为不可行走区域,浅红色区域为可以行走的区域。

如下图,现在如果要寻找从A点到B点的路径,首先要从所有可行走的网格中找到一条最优的网格路径(图中紫色的网格),然后再根据这些网格生成所需要的路径点。

计算最优网格路径的方法可以使用流行的A*,也可以使用其它方法。A*算法网上很多就不说了,至于三角网格的A*实现因为涉及网格的数据结构会在系列的最后给出。

二.  生成路径点

nav寻路最常用的就是光照射线法了,这个在neoragex2002的blog上有讲,这里就不说了

http://www.cnblogs.com/neoragex2002/archive/2007/09/09/887556.html

另一种方法就是拐角点法,如下图

下图的5个凸多边形是已经生成的导航网格,多边形外部的区域为不可行走区域,current为起点,goal为终点,从图中就可以看出最短路径为图中红线,蓝色圈出的点为我们需要找出的点。所有多边形顶点均按逆时针方向存储(这些均在生成导航网格时处理,以后会讲到)。

(1)下图显示出各区域之间的入口,即多边形的临边。由图中可以看出每个临边均为起点穿出该多边形区域的边,故以下称该边为穿出边。

(2)首先找到起始点所在的多边形和穿出边的两个端点,由起点连接两个端点,形成两个线段lineLeft 和lineRight。如下图。绿色圈表示左点,红色表示右点(左点、右点是根据多边形顶点保存顺序而来)。

(3)继续找到下一个穿出边的两个端点,判断新的左点是否在lineLeft 和lineRigh之间,如果在,则更新lineLeft为起点到新左点的线段。

同样处理新穿出边的右点,如下图

该步最后得到两个新的线段,如下图。

(4) 继续判断下一个穿出边的两个端点,如下图,新的左点在lineLeft和lineRight的外面,则不更新线段。

下图说明新的右点在两条直线之间,更新lineRight。

该步最后得到两个新的线段,如下图。

(5) 继续循环判断下一个穿出边的两个端点,该穿出边的两个端点在lineRight的右侧,表示lineRight的终点即为路径的一个拐角点

(6) 循环以上步骤都可以找到从起点到终点的一条完整路径。

时间: 2024-07-30 10:13:46

NAV导航网格寻路(2) -- 寻路方法的相关文章

NAV导航网格寻路 一些必要的计算几何知识

转载:http://blog.csdn.net/ynnmnm/article/details/44833007 NAV导航网格寻路 -- 一些必要的计算几何知识 在继续下面的nav网格生成算法之前,先介绍一下涉及到的计算几何知识.这里只罗列出结论,要详细了解参考相关书籍. 矢量加减法: 设二维矢量P = ( x1, y1 ),Q = ( x2 , y2 ),则矢量加法定义为: P + Q = ( x1 + x2 , y1 + y2 ),同样的,矢量减法定义为: P - Q = ( x1 - x2

NAV导航网格寻路(6) -- 寻路实现

这篇是转的文章,原文http://blianchen.blog.163.com/blog/static/13105629920103911258517/ 前面已经介绍了寻路的方法,现在给出我的一个实现. A*寻找网格路径 A*算法就不说了,网上很多,这里只说下三角形网格如何使用A*算法,如下图,绿色直线代表最终路径和方向,路径线进入三角形的边称为穿入边,路径线出去的边称为穿出边.每个三角形的花费(g值)采用穿入边和穿出边的中点的距离(图中红线),至于估价函数(h值)使用该三角形的中心点(3个顶点

NAV导航网格寻路(4) -- 生成nav网格

这篇是转的文章,原文http://blianchen.blog.163.com/blog/static/131056299201037102315211/ 假设上图是一个游戏地图,红色的区域是不可行走的区域,浅灰色区域是可行走区域,要想在游戏中实现nav寻路,必须将可行走区域转化为nav网格并保存为一种固定形式的数据,如下图浅红色的三角形. nav网格必须是凸多边形,这里使用三角型,当然也可以使用4边形.下面介绍一种任意多边形的三角化算法.算法来自论文<平面多边形域的快速约束 三角化>作者:曾

NAV导航网格寻路(5) -- 生成网格的一些补充

这篇是转的文章,原文http://blianchen.blog.163.com/blog/static/13105629920103811451196/ 如果你也实现了上一章提到的代码,不难发现对下图的两种情况会出现问题 左面的是两个区域有相交的情况,右面的是多边形本身有自交,在这两种情况下,前面给出的代码均会产生错误的结果. 对于两个多边形相交,可以在生成网格之前先合并多边形,合并后如图 合并算法在前面多边形剪裁处已给出一个,这里只贴上代码: /** * 合并两个多边形(Weiler-Athe

NAV导航网格寻路(7) -- 代码和一些优化

这篇是转的文章,原文http://blianchen.blog.163.com/blog/static/131056299201031293039882/ 这里发不了源码,本系列完整源码可以到http://bbs.9ria.com/thread-49841-1-1.html下. 看下图,最优路径应该是从上面绕过中间阻挡区,而实际寻路产生的路径确是下面.这是由于,在网格面积过大或有某边长度过长时,由于a*中的花费是计算网格的两边中点距离而不实际的路径长度,所以产生的路径偏差较大.所以在一般的网格生

NAV导航网格寻路(1)-- 介绍

这篇是转的文章,原文 http://blianchen.blog.163.com/blog/static/13105629920103211052958/ WayPoint寻路 下图是一个典型的路点寻路 另一种方法是使用多边形来记录路径信息,它可以提供更多的信息给ai角色使用.下图就是一个navigation mesh. 以下列出几个WayPoint的不足之处: 一些复杂的游戏地图需要的WayPoint数量过于庞大 有时会使角色走“Z”型路径 如下图A点和B点之间的路径 NAV寻路如下图 下图是

NAV导航网格寻路(3) -- 一些必要的计算几何知识

这篇是转的文章,原文http://blianchen.blog.163.com/blog/static/13105629920103614613291/ 在继续下面的nav网格生成算法之前,先介绍一下涉及到的计算几何知识.这里只罗列出结论,要详细了解参考相关书籍. 矢量加减法: 设二维矢量P = ( x1, y1 ),Q = ( x2 , y2 ),则矢量加法定义为: P + Q = ( x1 + x2 , y1 + y2 ),同样的,矢量减法定义为: P - Q = ( x1 - x2 , y

A*算法、导航网格、路径点寻路对比(A-Star VS NavMesh VS WayPoint)

在Unity3d中,我们一般常用的寻路算法: 1.A*算法插件 与贪婪算法不一样,贪婪算法适合动态规划,寻找局部最优解,不保证最优解.A*是静态网格中求解最短路最有效的方法.也是耗时的算法,不宜寻路频繁的场合.一般来说适合需求精确的场合. 与启发式的搜索一样,能够根据改变网格密度.网格耗散来进行调整精确度. 使用较好的地方: a.策略游戏的策略搜索 b.方块格子游戏中的格子寻路 2.U3D自带的导航网格系统 U3D内置了NavMesh导航网格系统,一般来说导航网格算法大多是"拐角点算法"

Unity之导航网格寻路相关参数

1.Object(物体)参数面板 Navigation Static:选中该复选框,则表示该游戏对象将参与导航网格的烘焙. Generate OffMeshLinks:选中该复选框,可以自动根据Drop Height(下落高度)和Jump Distance(跳跃距离)的参数设置用关系线来连接分离的网格(模型). NavigationArea:导航区域设置.在默认情况下分为Walkable(行走区域).Not Walkable(不可行走层)和Jump(跳跃层). 2.Bake(烘焙)参数面板 Ag