寻路 Waypoint 与 NavMesh 比较

article/2025/10/13 9:57:23

正文

1. WayPoint寻路


下图是一个典型的路点寻路

 NAV导航网格寻路(1) - 竹石 - 游戏...

另一种方法是使用多边形来记录路径信息,它可以提供更多的信息给ai角色使用。下图就是一个navigation mesh。

NAV导航网格寻路(1) - 竹石 - 游戏...

 

以下列出几个WayPoint的不足之处:

  1. 一些复杂的游戏地图需要的WayPoint数量过于庞大
  2. 有时会使角色走“Z”型路径

如下图A点和B点之间的路径

NAV导航网格寻路(1) - 竹石 - 游戏...

NAV寻路如下图

NAV导航网格寻路(1) - 竹石 - 游戏...

下图是路点寻路,如黄线,会产生“Z”字形

NAV导航网格寻路(1) - 竹石 - 游戏...

下图为文章开始时展示的地图的比较,红线是wayPoint寻路,蓝线是nav。

NAV导航网格寻路(1) - 竹石 - 游戏...

3. 不能进行动态修正,如果地图中有动态障碍,处理起来会很困难

     如要实现即时战略游戏中,一辆在路上行走的坦克会挡住你军队的去路,这个移动的坦克就是一个动态障碍。

4. 不能根据角色的特性(不同宽度、高度等)改变路径

    如一个狭窄的通道,普通的人能够通过,而一辆马车的宽度超过通道宽度,应该不能通过。

 5. 不能保存地形的附加信息,如地表高度、地面特征(水面、沙地等)

     比如一个游戏中的角色在走到沙地上时会降低移动速度,或走在一个斜坡上时人物会发生倾斜等。

 

 

2. NavMesh寻路:

 

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

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

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

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

NAV导航网格寻路(2) -- 寻路方法 - 竹石 - 游戏...

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

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

NAV导航网格寻路(2) -- 寻路方法 - 竹石 - 游戏... 

二.  生成路径点

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

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

 

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

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

NAV导航网格寻路(2) -- 使用A*寻路 - 竹石 - 游戏...

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

NAV导航网格寻路(2) -- 使用A*寻路 - 竹石 - 游戏...

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

NAV导航网格寻路(2) -- 使用A*寻路 - 竹石 - 游戏...

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

NAV导航网格寻路(2) -- 使用A*寻路 - 竹石 - 游戏...

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

NAV导航网格寻路(2) -- 使用A*寻路 - 竹石 - 游戏...

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

NAV导航网格寻路(2) -- 使用A*寻路 - 竹石 - 游戏...

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

NAV导航网格寻路(2) -- 使用A*寻路 - 竹石 - 游戏...

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

NAV导航网格寻路(2) -- 使用A*寻路 - 竹石 - 游戏...

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

NAV导航网格寻路(2) -- 使用A*寻路 - 竹石 - 游戏...

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

NAV导航网格寻路(2) -- 使用A*寻路 - 竹石 - 游戏...

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

 

 

 

在继续下面的nav网格生成算法之前,先介绍一下涉及到的计算几何知识。这里只罗列出结论,要详细了解参考相关书籍。

  • 矢量加减法:
     设二维矢量P = ( x1, y1 ),Q = ( x2 , y2 ),则矢量加法定义为: P + Q = ( x1 + x2 , y1 + y2 ),同样的,矢量减法定义为: P - Q = ( x1 - x2 , y1 - y2 )。显然有性质 P + Q = Q + P,P - Q = - ( Q - P )。
  • 矢量叉积
    设矢量P = ( x1, y1 ),Q = ( x2, y2 ),则矢量叉积定义为由(0,0)、p1、p2所组成的平行四边形的带符号的面积,即:P × Q 的标量大小 = x1*y2 - x2*y1,其结果是一个矢量。
  • 折线段的拐向判断:
      折线段的拐向判断方法可以直接由矢量叉积的性质推出。对于有公共端点的线段p0p1和p1p2,通过计算(p2 - p0) × (p1 - p0)的符号便可以确定折线段的拐向:
      若(p2 - p0) × (p1 - p0) > 0,则p0p1在p1点拐向右侧后得到p1p2。
      若(p2 - p0) × (p1 - p0) < 0,则p0p1在p1点拐向左侧后得到p1p2。
      若(p2 - p0) × (p1 - p0) = 0,则p0、p1、p2三点共线。
  • 判断两线段是否相交:
      我们分两步确定两条线段是否相交:
      (1)快速排斥试验
        设以线段 P1P2 为对角线的矩形为R, 设以线段 Q1Q2 为对角线的矩形为T,如果R和T不相交,显然两线段不会相交。
      (2)跨立试验
         如果两线段相交,则两线段必然相互跨立对方。若P1P2跨立Q1Q2 ,则矢量 ( P1 - Q1 ) 和( P2 - Q1 )位于矢量( Q2 - Q1 ) 的两侧,即( P1 - Q1 ) × ( Q2 - Q1 ) * ( P2 - Q1 ) × ( Q2 - Q1 ) < 0。上式可改写成( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) > 0。当 ( P1 - Q1 ) × ( Q2 - Q1 ) = 0 时,说明 ( P1 - Q1 ) 和 ( Q2 - Q1 )共线,但是因为已经通过快速排斥试验,所以 P1 一定在线段 Q1Q2上;同理,( Q2 - Q1 ) ×(P2 - Q1 ) = 0 说明 P2 一定在线段 Q1Q2上。所以判断P1P2跨立Q1Q2的依据是:( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) >= 0。同理判断Q1Q2跨立P1P2的依据是:( Q1 - P1 ) × ( P2 - P1 ) * ( P2 - P1 ) × ( Q2 - P1 ) >= 0。
    NAV导航网格寻路(3) -- 一些必要的计算几何知识 - 竹石 - 游戏...
  • 凸多边形
    假设我们在一个多边形上(包括多边形的边界及边界围封的范围)任意取两点并以一条线段连结该两点,如果线段上的每一点均在该多边形上,那么我们便说这个多边形是凸的。
  • 凸包
    给定平面上的一个(有限)点集(即一组点),这个点集的凸包就是包含点集中所有点的最小面积的凸多边形。
    NAV导航网格寻路(3) -- 一些必要的计算几何知识 - 竹石 - 游戏...
  • 点在凸多边形中的判断
    假设多边形是凸的,而且顶点p0,p1,...,pn按顺时针方向排列,则点在多边形任意一边 pi-1, pi 的右面。
  • Voronoi图及对偶图
    NAV导航网格寻路(3) -- 一些必要的计算几何知识 - 竹石 - 游戏...
  • Delaunay三角剖分(Voronoi对偶图)
    NAV导航网格寻路(3) -- 一些必要的计算几何知识 - 竹石 - 游戏... 
    在实际中运用的最多的三角剖分是Delaunay三角剖分,它是一种特殊的三角剖分。先从Delaunay边说起:
        【定义】Delaunay边:假设E中的一条边e(两个端点为a,b),e若满足下列条件,则称之为Delaunay边:存在一个圆经过a,b两点,圆内(注意是圆内,圆上最多三点共圆)不含点集V中任何其他的点,这一特性又称空圆特性。
        【定义】Delaunay三角剖分:如果点集V的一个三角剖分T只包含Delaunay边,那么该三角剖分称为Delaunay三角剖分。
    以下是Delaunay剖分所具备的优异特性:
        1.最接近:以最近临的三点形成三角形,且各线段(三角形的边)皆不相交。
        2.唯一性:不论从区域何处开始构建,最终都将得到一致的结果。
        3.最优性:任意两个相邻三角形形成的凸四边形的对角线如果可以互换的话,那么两个三角形六个内角中最小的角度不会变大。
        4.最规则:如果将三角网中的每个三角形的最小角进行升序排列,则Delaunay三角网的排列得到的数值最大。
        5.区域性:新增、删除、移动某一个顶点时只会影响临近的三角形。
        6.具有凸多边形的外壳:三角网最外层的边界形成一个凸多边形的外壳。
  • 多边形裁剪
    NAV导航网格寻路(3) -- 一些必要的计算几何知识 - 竹石 - 游戏... 

    Weiler-Athenton算法

–主多边形:被裁剪多边形,记为A

–裁剪多边形:裁剪窗口,记为B

多边形顶点的排列顺序(使多边形区域位于有向边的左侧 )外环:逆时针 ;内环:顺时针

主多边形和裁剪多边形把二维平面分成两部分。

内裁剪:A∩B

外裁剪:A-B


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

裁剪结果区域的边界由A的部分边界和B的部分边界两部分构成,并且在交点处边界发生交替,即由A的边界转至B的边界,或由B的边界转至A的边界。

如果主多边形与裁剪多边形有交点,则交点成对出现,它们被分为如下两类:

进点 :主多边形边界由此进入裁剪多边形内  如,I1,I3, I5, I7, I9, I11

出点 :主多边形边界由此离开裁剪多边形区域. 如, I0,I2, I4, I6, I8, I10 
NAV导航网格寻路(3) -- 一些必要的计算几何知识 - 竹石 - 游戏...

算法步骤

(1)建立空的裁剪结果多边形的顶点表.

(2)选取任一没有被跟踪过的交点为始点,将其输出到结果多边形顶点表中.

(3)如果该交点为进点,跟踪主多边形边边界;否则跟踪裁剪多边形边界.

(4) 跟踪多边形边界,每遇到多边形顶点,将其输出到结果多边形顶点表中,直至遇到新的交点.

(5)将该交点输出到结果多边形顶点表中,并通过连接该交点的双向指针改变跟踪方向(如果上一步跟踪的是主多边形边界,现在改为跟踪裁剪多边形边界;如果上一步跟踪裁剪多边形边界,现在改为跟踪主多边形边界).

(6)重复(4)、(5)直至回到起点


http://chatgpt.dhexx.cn/article/aAYPFBg5.shtml

相关文章

CARLA 笔记(07)— 地图和导航(Landmarks、Waypoints、Lanes、Junctions、Environment Objects、路径点导航、地图导航、分层和非分层地图)

1. 地图 地图包括城镇的 3D 模型和道路定义。地图的道路定义基于 OpenDRIVE 文件&#xff0c;这是一种标准化的带注释的道路定义格式。 OpenDRIVE 定义道路、车道、路口等的方式决定了 Python API 的功能以及做出决策背后的原因。 1.1 更换地图 要改变地图&#xff0c;世界…

【Autoware】三、ROSBAG生成waypoint

1.启动Autoware cd ~/autoware.ai/ source install/setup.bash roslaunch runtime_manager runtime_manager.launch2.切换到Simulation模块 点击右侧的Ref&#xff0c;选择文件&#xff1a; /.autoware/sample_moriyama_150324.bag点击Play按钮以后&#xff0c;立马点击Paus…

第五篇:AWS deepracer student 赛道分析(Ace speedway)最佳路径,数据分析,waypoint分析(初步

文章目录 前言一,为什么需要分析赛道二&#xff0c;分析赛道需要的东西三&#xff0c;如何获得waypoint数据四&#xff0c;正式开始1.获取waypoint的数据2.处理数据 三&#xff0c;导入excel表绘图1.将txt文件导入excel表2.插入散点图3.成品图带有标识的版本最佳路径图&#xf…

unity3d WayPoint路点寻路,AI

前言 一个简单的人工智能WayPoint WayPoint: 游戏中敌人根据几个巡逻点自动巡逻&#xff0c;在巡逻过程中&#xff0c;时刻监听英雄&#xff08;敌人&#xff09;和自己距离是否达到追击范围&#xff08;不巡逻&#xff0c;追击英雄&#xff09;&#xff0c;在追击过程中&…

Unity中的AI算法和实现1-Waypoint

本文分享Unity中的AI算法和实现1-Waypoint 在Unity中, 我们有一些有趣且常见的AI算法可以研究和使用, 其中最常见的就是怪物的简单AI, 比如在RPG游戏里, 怪物在某些点定点巡逻, 当玩家进入检测区域时, 怪物会主动追击玩家, 追击到玩家后对玩家进行伤害, 或者在超过最大距离后脱…

统计中的“不相关”与“线性无关”

以上思维导图&#xff0c;看完即可理解。下述是文字介绍。 这二者是统计新手与老手都很容易混淆的两个概念&#xff0c;以下辨明一下&#xff1a; 两变量“不相关” 不相关是指二者互相独立&#xff0c;没有相关关系。注如森林里每棵树的树叶个数与村子里每个村民的体重...二…

辨析“正交”与“不相关”。

①不相关的定义是&#xff1a; ②正交的定义是&#xff1a; 若两个向量的点积为零&#xff08;即对应元素相乘之后求和为零&#xff09;&#xff0c;则称两个向量正交。 ③一对正交向量一定是不相关的&#xff0c;即正交的两个向量中&#xff0c;一个向量绝不可能用另一个向量…

【数理统计】随机变量X和Y独立一定不相关,不相关不一定独立

假设(X,Y) 均匀分布在单位元 x 2 y 2 1 x^2 y^2 1 x2y21上&#xff1a; X和Y的&#xff08;线性&#xff09;相关系数是0。为什么呢&#xff1f;直观来说&#xff0c;因为是个圆&#xff0c;如果你画一条线性回归的线&#xff0c;线的斜率是正的还是负的都不合适&#xf…

mysql的相关子查询和不相关子查询

概念介绍 嵌套在其他查询中的查询即子查询&#xff0c;子查询也叫内部查询。子查询中有相关子查询和不相关子查询&#xff1a;相关子查询是指查询结果依赖于外部查询的子查询&#xff0c;外部查询每执行一次&#xff0c;内部子查询也会执行一次&#xff1b;而不相关子查询是指…

MySQL中不相关子查询和相关子查询

嵌套在其它查询中的查询称之为子查询或内部查询。 包含子查询的查询称之为主查询或外部查询 student表 course表 score表 不相关子查询 内部查询的执行独立于外部查询&#xff0c;内部查询仅执行一次&#xff0c;执行完毕后将结果作为外部查询的条件使用 select * from sco…

《数据库系统概论》之相关子查询与不相关子查询

文章目录 前言数据表一、子查询&#xff08;subquery&#xff09;二、不相关子查询&#xff08;unrelated subqueries&#xff09;1.概念2.查询逻辑 三、相关子查询&#xff08;related subqueries&#xff09;1.概念2.查询逻辑3.带有EXISTS谓词的子查询 总结 前言 开篇感言 …

变量之间的相关性研究

目录 1 什么是相关性&#xff1f;协方差及协方差矩阵相关系数&#xff08;1&#xff09;简单相关分析&#xff08;2&#xff09;偏相关分析&#xff08;3&#xff09;复相关分析&#xff08;4&#xff09;典型相关分析 2 对已有数据的预分析2.1 绘制变量相关的热力图2.2 对热力…

独立=>不相关

独立 ⇒ \Rightarrow ⇒不相关 文章目录 独立 ⇒ \Rightarrow ⇒不相关判定定理独立性 F ( x , y ) F X ( x ) F Y ( y ) F(x,y)F_X(x)F_Y(y) F(x,y)FX​(x)FY​(y)证明不独立只需要用P(AB)≠P(A)P(B)举反例离散型连续型 不相关 ρ x y 0 \rho_{xy}0 ρxy​0(协方差为0) 性质…

MySQL 不相关子查询怎么执行?

1. 概述 从现存的子查询执行策略来看&#xff0c;半连接 (Semijoin) 加入之前&#xff0c;不相关子查询有两种执行策略&#xff1a; 策略 1&#xff0c;子查询物化&#xff0c;也就是把子查询的执行结果存入临时表&#xff0c;这个临时表叫作物化表。 explain select_type …

为什么相关不等于因果

为什么相关不等于因果 十九世纪末&#xff0c;荷兰出现了一个奇怪的现象&#xff1a;人口出生率与当地白鹳的数量同步增长。鹳鸟送子的传说由此而来。虽然这个故事逐渐消失在民间传说中&#xff0c;但现实生活中类似的相关性无处不在。二十世纪和二十一世纪的新研究一再证实&a…

独立正交不相关定义关系

一、“独立”、“不相关”和“正交”的定义 假设X为一个随机过程&#xff0c;则在t1和t2时刻的随机变量的相关定义如下&#xff08;两个随机过程一样&#xff09;&#xff1a; &#xff08;1&#xff09;定义Rx&#xff08;t1&#xff0c;t2&#xff09;E{X&#xff08;t1&…

不相关、独立、正交的区别与联系

1.相关定义说明&#xff1a; 随机过程&#xff1a;X(t)和Y(t)互相关函数&#xff1a;Rxy&#xff08;t1&#xff0c;t2&#xff09;E{X&#xff08;t1&#xff09;Y&#xff08;t2&#xff09;}互协方差函数&#xff1a;Cxy&#xff08;t1&#xff0c;t2&#xff09;E{[X&…

不独立 ≠ 不相关 (Independent ≠ Uncorrelated)

在数学期望的性质里有一个性质:随机变量X和Y相互独立&#xff0c;有&#xff1a;E(XY) E(X)E(Y). 事实上这里成立的充要条件是X和Y不相关即可。 那么问&#xff0c;相互独立与不相关的关系是什么呢&#xff1f; 独立性是指两个变量的发生概率一点关系没有&#xff1b;而相关…

View For EasyUI 后台模板html

ViewUI For EasyUI View For EasyUi是基于EasyUI-1.5x开发的前端UI框架主题皮肤&#xff0c;包含所有EasyUI的全部组件美化&#xff0c; 还有各种插件&#xff0c;各种优化 &#xff0c;完全使用矢量图标&#xff0c;每一个小图标都是矢量图标&#xff0c;支持无限放大和颜色设…

easyui了解

目录 一、框架概述 1、什么是Easyui&#xff1f; 2、EasyUI的常用组件 3、EasyUI的特点 缺点 使用&#xff1a; 4、EasyUI的目录说明 4.1 下载路径 4.2 必须的基础支持库 4.3 目录说明 二、WEB项目搭建EasyUI环境 1.EasyUI入门示例 1.1 标准开发步骤 1.2 代码模板 …