寻路建模的三种方式比较

路点寻路(unity3D) 路点寻路 第一步:现在场景上确认几个定点,并用Gizmos画出路线 首先在场景中确定几个空节点,放在一个父节点下面 将脚本绑在该父节点上 画出来的效果: public class WayPoint : MonoBehaviour { //用一个数组对点进行存储 Transform[] points; public Transform[] Points { get { if(points == null) 阅读详情
AI摘要

本文对比了游戏寻路中格子、路点、导航网格三种主流建模方式。分析了它们的优缺点,如格子易实现但开销大,路点开销低但需人工参与,导航网格精确但实现复杂。还给出了不同应用场景下的选择建议,帮助开发者选合适方案。

概述

本文对于游戏寻路中主流的三种建模方式做了比较,分析各自的适用范围和优缺点。这三种建模方式包括:格子(Grid)、路点(Waypoint)、导航网格(Navmesh)。

写这篇的原因是项目里需要选择一种合适的寻路实现方案,查阅了大量的文章和算法后,结合着自己的思考和实践,在此做个小结。

这里的建模指的是为地图寻找一个空间表征(spatial representation)1,即把原始地图转换成计算机数据结构表示的模型,用于后面的寻路。注意它与寻路算法2是不同的概念,例如:Grid和Navmesh是两种不同的建模方式,但是建模完成后,都可以用到A*算法。

下面是三种建模方式的图形化表示,一目了然,分别是:(a) 原版地图,(b) 格子,(c) 路点,(d) 导航网格。

这里写图片描述

先来一个简单而粗略的比较,后面再分头细说:

  • 实现复杂度:导航网格 > 格子 > 路点
  • 内存和计算开销3:格子 > 导航网格 > 路点
  • 表达精确性:导航网格 > 格子 > 路点

格子(Grid)

这种方法将原始地图分割成许多的小格子,在计算机中表示为一个二维数组,用0和1分别表示障碍和可行走区域。

格子的优点
  • 容易实现。
  • 容易动态修改。如果需要动态加入障碍,只需要确定障碍物会占用哪些格子,再重新寻路即可。
格子的缺点
  • 内存和计算开销大。越大的地图,所需格子就越多,相应的内存占用和寻路计算开销就会越大。另外,格子的大小选择也是一个问题,定得小了,内存和计算开销大;定得大了,又会缩减可行走区域,导致可行走边界不够精确。
  • 可能需要做额外平滑。如果按照格子来寻路,最后生成的路线很可能会出现90度的拐角,甚至可能有连续的多个,这种急转弯会使得游戏寻路表现得“不够自然”。这时还需要做额外的平滑。
  • 不太适合3D地图。格子最早是针对2D地图寻路提出的,不涉及高度信息,因此没有导航网格中的maxClimb、agentHeight等参数,更没有考虑分层地图。当然也不是完全不能做,只是更复杂。

路点(Waypoint)

这种方法会在地图中标注一些路点,寻路只能发生在路点和路点之间,在计算机中表示为一张连通图。

路点的优点
  • 实现简单。
  • 内存和计算开销低。路点只使用到了真实可行走区域的一小部分,与格子相比,牺牲了路线的灵活性,换取较低的内存和计算开销。
路点的缺点
  • 需要人工参与。因为需要人工标注路点位置和可行走路线。
  • 局限性较大。首先,路点的灵活性较低,寻路必须沿着预先定义好的路线前进,使用时有时会发现:明明有看上去更直接的路线,却偏偏只能绕远路走折线;其次,对于起始点不在路点图中的情况,还需要找到最近的路点先移动过去;最后,路点不考虑实际的底层地图,所以在移动过程中有可能出现被物体阻挡卡住的情况。

导航网格(Navmesh)

这种方法使用一系列算法将原始地图转换成三角形网格的集合,网格和网格之间构成连通关系用于寻路。在计算机中表示为顶点的集合,以及三个顶点索引一组(边)的集合。

导航网格的优点
  • 能精确地表征世界。虽然导航网格也做不到百分百还原真实地图,但是它无疑比格子和路点都更精确。首先,它引入了高度信息,使得表示3D地图成为可能;其次,它在应用agentRadius、agentHeight等参数时用到了体素(voxel)4,这是一种比格子更小的计量单元,使得计算可行走范围时更加精确。
  • 内存和计算开销小。导航网格将地图抽象成三角网格,也就是顶点和边的集合。理论上,这种建模方式的复杂度介于路点和格子之间。
导航网格的缺点
  • 复杂,难以实现和修改。自己从头实现一个导航网格系统无疑是非常复杂的,这需要很多几何算法的知识。好在现在有一些开源的实现,如crisis的引擎工程师实现的recast-navigation5。但如果想在它基础上去修改和定制,还是要花费不少功夫。
  • 建立网格的过程耗时耗内存。与格子和路点不同,前两者从原始地图建模的过程几乎是瞬间完成的,而建立导航网格则是一个相对复杂和耗时的过程,其中体素化这一步又会占用不少内存(完成后会释放掉)。好的网格导航实现可以将建网格和动态加入障碍的时间代价控制在几毫秒的级别。通常的程序实现会在第一次寻路前就寻找时机建好网格。

总结

每种建模方式都有自己的优点和缺点,应具体根据应用场景选择合适的方式。

如果开发时间有限,需要在可能动态变化的2D地图中寻路,地图不会太大,内存充足,且对行走区域的精确度没有太高要求,首选格子。

如果开发时间有限,寻路线路相对固定(典型的如塔防游戏),不用考虑真实地形的影响,优先考虑路点。

如果开发时间充裕,地图很大,对表征真实世界的精确度要求很高,那么最好选择导航网格。


  1. 本文写作过程中参考了《游戏人工智能》中的《选择一个寻路空间表征》一文。 ↩
  2. 游戏中的常用寻路算法参见文章。 ↩
  3. 这里只针对寻路本身,不包括建模的过程,否则导航网格的开销会更大 ↩
  4. 参见我翻译的有关体素化的文章。 ↩
  5. 参见我写的专栏:recast源码解析。 ↩
介绍如何在 Unity 利用稀疏体素化八叉树 (SVO) 和专门的 A* 寻路算法在 3D 中进行寻路。 2. 通过将你的世界分成几个较小的区域,你可以在大小和遍历时间方面获得更好的结果,因为这些区域通常不需要互连的寻路(例如,想象一下 roguelike 游戏中的独立房间)。另外,请注意应用此解决方案的数据:如果你的世界有许多重叠的单元格和相邻的空闲单元格,从而阻止八叉树将节点组合成更大的节点,那么你最好只使用统一的网格,因为它更适合问题域。这不仅会导致过多的内存需求,以便在大空间中拥有均匀的网格,还会导致更糟糕的寻路运行时间,因为大多数单元是空的,但在遍历中无法跳过。如何在三维空间中烘焙导航网格? 阅读详情

相关推荐

游戏开发实战:用A*算法实现NPC智能寻路(C++完整代码分享)

本文详细介绍了在游戏开发中,如何使用C++实现A*算法为NPC构建智能寻路系统。内容涵盖从网格地图的数据结构设计、A*算法的核心原理与完整C++代码实现,到性能优化技巧及路径平滑处理,旨在帮助开发者打造高效、自然的NPC移动体验。

gg901的博客 886

寻路问题--如何找到一条从起点坐标到终点坐标的路径?

一,寻路问题介绍 正如组合问题与动态规划的联系之应用提到的从起点(0,0)到终点(X,Y)一共有多少种走法。与之相似的另一个问题是如何找到从(0,0)到(X,Y)的路径? 首先对问题建模。使用一个矩阵(二维数组)的下标 表示 各个点的坐标。矩阵元素只取 0 或者 1,0 表示此坐标是一个可达的正常顶点;而 1 则表示这是一个不可达的障碍顶点。比如 如下矩阵: {0,0,1,1,0}{1,0,...

weixin_30885111的博客 1130

Unity A*寻路算法实战:从原理到动态演示的完整实现

本文详细讲解了Unity中A*寻路算法的核心原理与完整实现。通过生活化比喻拆解F=G+H公式与Open/Closed列表的工作机制,并提供了从创建网格数据模型、封装AStarWrapper核心类到实现动态可视化演示的完整C#代码。文章还探讨了性能优化技巧,如使用优先队列、处理动态障碍物及不同启发函数的选择,帮助开发者打造高效、智能的游戏角色移动系统。

weixin_29303701的博客 1024

动态路点_Kenney_新浪博客

项目使用的寻路方式是路点,有点老土呵呵。最近策划提到使用动态路点的需求,故研究之。 Unreal中虽然有动态路点(PathNode_Dynamic),但是不管是Epic的官方文档还是游戏代码基本没有提及,没有使用,真不知道Epic怎么想的(官方讲解了NavigationMesh动态阻挡的使用,但是关于NavigationPoint只字未提),不得已研究了下路点的寻路算法。 经研究发现...

计算机技术交流 95

PRM路径规划算法:从数学建模到机器人寻路的实战指南

路径规划是机器人、自动驾驶等领域的核心问题,旨在为智能体在复杂环境中寻找一条从起点到终点的安全高效路线。其基本原理是将连续空间中的运动问题转化为离散空间的图搜索问题。传统搜索算法如A*在环境复杂时面临计算爆炸或无法求解的挑战,而采样规划算法通过概率化思想提供了解决方案。这类算法的技术价值在于能够有效处理高维空间和复杂障碍物场景,将确定性问题转化为概率可解问题,显著提升了规划效率与可行性。在应用场景上,它广泛适用于无人机巡检、机械臂运动、物流配送优化及灾害救援路线规划等。概率路图法(PRM)作为采样规划的经典

weixin_33462167的博客 313

Unity场景道路制作全流程解析:建模、贴图、寻路与性能优化

游戏场景中,道路系统不仅是视觉引导线,更直接影响角色移动、寻路逻辑与渲染性能。其核心原理在于通过网格模型、UV贴图与碰撞体共同构建可通行的物理路径,同时需要配合导航网格烘焙才能让AI角色正常行走。在大型开放场景中,道路制作需综合考虑ProBuilder/Spline等工具选型、地形贴合、材质防拉伸以及阴影距离控制等工程细节,合理规划后能有效减少Draw Call与物理开销,避免遮挡剔除失效导致的性能骤降。从城市街道到野外山路,不同环境对路面结构和资源占用要求各异。围绕Unity场景道路制作,内容涵盖路面建模

weixin_34162228的博客 396

Unity 路点寻路,自带的导航网格寻路,A* Pathfinding project 区别

引言 寻路系统是当今众多游戏中不可或缺的功能模块。比如格子游戏中的格子寻路,塔防怪物的行进路径,捕鱼游戏中的鱼群路径,RPG游戏中的怪物AI等,不同的需求对应的寻路策略的选择也不尽相同。 正文 在Unity3D中我们一般常用的寻路策略有: 1.路点寻路(WayPoint) 路点寻路是最简单,易理解,易操作的(如下图):需要预先设置好路径点坐标集合。然后对象按照规定的坐标集...

qq_37896049的博客 5238

A*寻路算法深度解析与AS3实战实现

在A*算法中,每个节点需保存以下核心属性:xy: 表示该节点在网格中的行列坐标;gCost: 从起点到当前节点的实际移动代价;hCost: 启发式估计从当前节点到目标点的距离;fCost: 综合评估值,即;parent: 指向路径回溯时的前驱节点,用于最终重构路径;isWalkable: 布尔值,标识该节点是否可通过;inOpenList: 标记节点所属列表状态,避免重复插入。这些字段共同构成了完整的节点状态模型。

weixin_32312889的博客 817

【转载】寻路建模的三种方式比较

原文链接:https://blog.youkuaiyun.com/needmorecode/article/details/82050409 概述 本文对于游戏寻路中主流的三种建模方式做了比较,分析各自的适用范围和优缺点。这三种建模方式包括:格子(Grid)、路点(Waypoint)、导航网格(Navmesh)。 写这篇的原因是项目里需要选择一种合适的寻路实现方案,查阅了大量的文章和算法后,结合着自己的思考和实践,在此做个小结。 这里的建模指的是为地图寻找一个空间表征(spatial representation),即

Currybeefer的博客 836

C++实现游戏开发中的高效寻路算法实战

寻路算法旨在从起点到目标点之间找到一条最优或可行路径,其本质是图论中的最短路径问题。在离散空间中,环境被抽象为由节点(Node)和边(Edge)构成的图结构,每个节点代表一个位置状态,边表示可通行关系,边上可附加权重(Weight)表示移动代价(如距离、地形难度)。通过系统化搜索策略,算法评估从起始节点到各节点的累计代价,最终确定最低成本路径。为便于管理,定义一个结构体封装节点信息:int x, y;Point pos;// 用于最小堆参数说明pos。

weixin_35006125的博客 643

Code Composer Studio 12.0.0版本 官方例程导入实战指南

本文详细介绍了在Code Composer Studio 12.0.0版本中,如何利用内置的Resource Explorer工具高效导入官方例程的完整实战指南。通过分步讲解定位开发板、导入工程、配置编译器及调试验证等关键操作,帮助开发者快速上手TI微控制器开发,避免常见错误,有效提升学习与开发效率。

weixin_29169899的博客 122

unity 游戏中的寻路与导航系统(5种寻路算法详解)

1.了解游戏中常见的驯鹿方式 2.寻路方案选择 3.NavMesh 寻路 4.任务目标追踪 5.常见的寻路方式-建模方式 寻路建模 Grid WayPoint NavMesh

lfanyize的博客 2万+

使用trae自动生成前后端分离的web应用程序

使用ai自动生成前后端分离的web应用程序

一介书生 2525

浅析游戏开发中的寻路算法

寻路算法是一个发展了很久很久的方向,除了上面列出的这三种比较有代表性的算法以外,还有非常非常多的其它算法,不过思路大部分比较类似,都是在前人的基础上做的一些改进。在游戏开发中寻路是个偏前端的问题,除了 SLG 游戏以外,寻路一般都是在前端实现的,后端只会拿前端得到的路径判断一下点的合法性就行了。但是寻路算法的复杂性还并不是这些算法的理解,而是要搞定策划的需求,很多时候高效简洁的实现可能无法满足策划的想法,要在算法的基础上做各种贴近业务的定制化修改。

m0_73915763的博客 2318

大模型面试题52:LLM如果在训练过程中loss值出现spike应该怎么办?

小白急救:停更→回滚→降LR→裁剪梯度,先保住训练不崩溃;进阶排查:查数据→查优化器→查硬件,找到spike的根因并解决;深层预防:预处理保守配置+训练中实时监控,从源头规避spike。先止损,再溯源,最后预防。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1170

《RT-Thread入门与实战》第1章:RT-Thread概述与核心优势

2006年由熊谱翔发起2017年成立上海睿赛德电子科技公司2021年成为国内首个通过ISO 26262 ASIL-D认证的RTOS。

2301_79143213的博客 986

游戏和地理空间应用中的寻路

随着时间的推移,研究人员和工程师开发了一系列优化方法和算法变体,这些方法可以显著减少搜索时间和内存占用,同时保持路径最优性,或至少产生可接受的近似值。在这种情况下,像 A* 或跳跃点搜索这样的纯在线算法通常速度不够快,尤其是在需要在广阔的搜索空间内实时响应的情况下。虽然这类路径在节点成本方面是最优的,但在连续空间中却并非最佳——尤​​其是在游戏或机器人技术中,因为这些技术的运动方向不受网格方向的限制。例如,它在解谜游戏、迷宫或基于图块的二维地图中效果很好,因为在这些情况下,所有移动的代价都是相同的。

gis收藏家的博客 874

LIN协议V2.2A版介绍

IN 协议规范2.2A 版(2010 年 12 月发布)是面向低成本汽车网络的标准,核心采用单主多从架构,支持最高20kbit/s速率,通过单总线实现通信;定义了完整的协议栈(含协议层、传输层、物理层等),规定了帧结构(含 Break 字段、Sync 字节、保护标识符 PID、数据字段、校验和)、5 类帧类型(无条件帧、事件触发帧等)及调度表机制以保障确定性传输;

qflook的博客 319

Unity动态寻路新选择:OpenPath网格化A*寻路方案详解

在游戏开发中,寻路算法是实现智能角色移动的核心技术,其中A*算法因其在网格化空间中的高效路径搜索能力而被广泛应用。其原理是通过评估节点代价,在起点与终点间寻找最优路径,技术价值在于平衡了路径质量与计算效率。在实时策略、塔防等需要处理大量动态障碍物的游戏场景中,传统寻路方案常面临性能瓶颈。OpenPath作为一个基于网格的A*寻路库,通过数据驱动和模块化设计,为Unity开发者提供了高度可配置的解决方案,尤其擅长处理动态障碍物和复杂地形,有效解决了NavMesh在动态更新上的性能开销问题。

weixin_30897079的博客 323

SPRD Android 14 通过属性控制系统设置显示双栏或者单栏

SPRD Android 14 通过属性控制系统设置显示双栏或者单栏

m0_60898338的博客 1118

【定位模块算法】amcl(蒙特卡洛)粒子滤波定位算法(附C++代码)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言(1)amcl定位框架介绍(2)amcl定位框架组成(1)ROS-TF坐标转换树【ROS的工具】(2)robot_pose_ekf扩展卡尔曼位姿估计算法(3)定位amcl自适应蒙特卡洛定位,adaptive monte carlo localizaion**(3)amcl定位节点的订阅与发布(4)amcl定位功能包用法(1)编写amcl节点相关的launch(amcl_omni.l

qq_35635374的博客 4402

基于SDF的碰撞和寻路

SDF ,即有号距离场 Signed Distance Function,简单介绍如下:有号距离场是一种用于表示三维空间中每个点与一个几何形状之间的相对位置关系的函数。对于空间中的任意点,有号距离场返回一个实数,这个实数表示该点与几何形状的相对位置:正数表示点在几何形状的外部,负数表示点在内部,零表示点恰好在几何形状上。有号距离场图则是将这种函数的值以图形的形式表示出来。在图中,每个点的位置表示它对应的有号距离场的值。

魔术师Dix的博客 2253

**发散创新:AI寻路之旅——深度探究代码实现与路径设计**随着人工智能技术的飞速发展,AI寻路算

本文简要介绍了AI寻路技术的实现过程,包括编程语言的选择、代码实现、实际应用场景以及流程图与图标设计等方面。未来,我们将看到更加智能、更加高效的AI寻路技术,为我们的生活带来更多便利和乐趣。在自动驾驶中,我们可以使用AI寻路技术来实现车辆的自动行驶和避障。在AI寻路技术的实现过程中,我们通常会选择Python作为主要的编程语言。此外,我们还会使用到C++、Java等其他语言,以实现更高效、更快速的运算。为了更好地理解AI寻路的整个过程,我们可以使用流程图、状态图等图标来设计整个系统的架构和流程。

yzbABC1234的博客 347

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

数字孪生项目中的导航片及寻路实现算法的探索

导航片可以是一个mesh面,一个gltf,也可以是其他任意一个形状的东西,具体取决于项目的需求和建模人员选择的实现方式。A*算法等寻路算法可以在这样的网格上进行,以确定从一个网格到另一个网格的路径。在上一篇文章中我们讲了在智慧矿山等项目中的巷道人员定位实现,其中提到了导航片和寻路这两个点,博主在在一开始的时候也是对这两个概念非常感兴趣,于是在项目开发过程中也做了一些研究。对比上面的四种,我们可以得出结论,跳点算法是相对高效的寻路算法,但是,在项目中,路网并没有网格信息,所以再看,A。

weixin_44803406的博客 2056

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

寻路问题——找到从起点到终点路径

一,寻路问题介绍正如组合问题与动态规划的联系之应用提到的从起点(0,0)到终点(X,Y)一共有多少种走法。与之相似的另一个问题是如何找到从(0,0)到(X,Y)的路径?首先对问题建模。使用一个矩阵(二维数组)的下标 表示 各个点的坐标。矩阵元素只取 0 或者 1,0 表示此坐标是一个可达的正常顶点;而 1 则表示这是一个不可达的障碍顶点。比如 如下矩阵:{0,0,1,1,0}{1,0,0,0,0}...

wh1132633619的博客 9027
上一篇: NavMesh生成研究(五):细节网格生成
下一篇: 【游戏圈一周精选】:论网游数量与青少年视力的关系
长三月
博客等级 码龄9年 228粉丝 80原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值