NavMesh,关于导航网格的创建

[unity3d]recast navigation navmesh 导航网格 寻路算法 源码分析 recast navigation navmesh导航网格算法源码分析 Author: 林绍川 recast navigation navmesh是unity3d ue4内置的寻路算法 阅读详情

在《人工智能游戏编程真言》中,有详细的叙述如何建立导航网格,但是却没有一丁点的代码,而且在创建过程中,还有许多细节问题没有解决,在百度文库中有一篇关于AS3建立导航网格的文章,里面也讲的很好,但是那里使用三角形作为节点,这显然对于多边形较多的3D世界不太合适。不过里面的A*寻路算法的相关取值是值得观看的。进行了几个礼拜的编写,导航网格稍微能看我先给几张截图,让大家有个底!可以生成多边形的网格节点,而且可以自动生成相邻连接,支持鼠标直接点选节点并且显示(渲染)其和其有连接的节点,以及加入物体后分裂受影响的节点,以及裁去小面积节点,但是没有3-2合并,在后面会完善。我经过三张地图的测试,感觉还不错

这张图是原网格模型,这里用的是OBJ文件格式模型,可以用3DMAX直接导出,obj文件加载器要自己些,推荐书籍有《DirectX+游戏开发终极指南》,《focus on 3d model》,场景自己用3DMAX制作,这里的场景比较粗陋,但是可以用来测试。

最初直接把全部三角形当作节点加入NavMesh中,这里面就是画出的节点,注意这里不是用线框模式渲染出来的,而是渲染的NavMesh,整个NavMesh包含一个导航节点链表(每个节点包括一个顶点索引数组,指向后面顶点数组的位置,就是这个节点所有顶点的索引集合。还有一个法线索引,主要是为了减小存储空间,就像《真言》里说的),顶点数组(包含顶点位置,还有指向的导航节点的指针的链表,这里可以知道哪些节点包含了此顶点,这个在合并的时候很有用哦,而且真言里也讲了极大的缩小合并时间),法线数组(法线值,因为游戏中,能走的面片法线很多相同的,基本都是指向Y轴)。现在是把你的OBJ模型里面可走(表示面法线值不会很离谱)的三角形,用你的OBJ加载器把纯三角形(只包含位置,DX中要使顶点序为顺时针)一个一个的加到NavMesh中,在加之前判断法线是否过陡或向下的那种,假如法线测试通过,那么在法线数组中查找是否有相近的法线值,并设置法线索引,假如没有那么在法线数组中假如当前法线,并且设置当前节点的法线索引。然后在设置节点的顶点索引,对当前三角形的每个顶点检查是否在顶点数组中(这里使用的是两点的最小距离小于某个值我们就把它们看作相同的顶点),假如在那个当前节点加入一个顶点索引(注意顶点中的节点链表要加一个指向当前节点的指针),假如不在数组内,那么我们在顶点数组中加入当前点,并把索引加入节点的索引数组中。最后把当前节点的指针加入节点链表中。加入全部三角形之后我们渲染当前节点,得到上图的结果。全是三角形,注意这里不是线框显示的哦!

接下来是合并相邻且能构成凸体的节点,我们循环所有的顶点,由于我们的顶点保存了所有指向本顶点的节点,那么我们对顶点内的某两个节点进行查找,假如两个节点有两组相同的顶点索引那么这两个节点送入合并函数中,首先我们要看两个顶点合并后是否为凸体,这里用个最简单的方法,就是检查合并点处的两个内角相加是否大于平角(180度),假如两个合并点都没有大于平角,那么我们合并他们。这里不给出合并的具体过程,因为要点太多,所以可以留言问。

这里知道没有节点合并,那么表示合并结束,注意最外循环检查有没有节点合并。渲染后见上图,可以看见可以保证凸体(注意,千万不能有重叠三角形,否则会失败,所以要单层,或者是层高很能很小)。

上图是用鼠标拾取节点的效果,这里没有什么优化,一个一个的遍历节点,不过这里用AABB来排除了大量的节点,然后对射线与节点的所有三角形(扇形)进行检测,对有碰撞的节点进行排序,取最前的节点,返回碰撞点

这里是生成连接的结果,这里只谈如何生成有相邻边的生成,阶梯和跳跃的连接也用类似的方法实现,只是投影在某个面上进行分析而已。

关于直接相邻的方法是:每两个节点只有一个连接(这里凸体能很好的支持此特性,至于其它特殊连接,我们用手动设置方式来生成,后话),对所有节点遍历

然后检查是否已有连接,有的话直接跳过,假如没有的话计算两个节点的AABB(这里会在xz面放宽一点,你懂得)假如不相交,跳过。如果相交,检查两个节点的每条边(线段表示)相互关系,我们目的是要找出共线且重合的两个线段。假如满足那么两个节点相邻,相互加入连接。

上图是连接生成后,拾取节点(黑色)及其邻接节点(红色)。这里还需要保存邻接的两个顶点,在A*寻路时很有用。在这里你可以自己弄一下关于阶梯和跳越的连接,提示,把节点投影到xz检查节点的相邻性,不过这里对于两个节点高度差太大那么忽略,阶梯是可以直接抬脚走所有你要设定抬脚的最大高度和跳跃的最大高度。

下图是其它连接的加入:抬脚的连接、跳跃的连接

这里黑色是当前节点,红色是邻接节点,深蓝色是抬脚连接的节点

这里包含了跳跃和直接相邻连接,黑色是当前节点,红色是直接相邻的节点,蓝色是跳跃的连接节点

 

这是加入物体的原始情况

现在暂不说寻路,现在目地是在有新的物体加入世界怎么去获取分裂节点并分裂。我这里使用的是遍历每一个节点,计算节点AABB(适当拉伸)与新加物体AABB的碰撞情况,注意假如AABB高度相对于节点高度(节点内所有顶点高度的平均值)较高(例如可以蹲下走过去、可以站着走过去),那么不要分裂节点,假如AABB间有碰撞,那么分裂该节点,这里的方法可以是《真言》里的(这里会增加顶点数),也可以只取节点中点和每两个相邻顶点的三角形。我们用《真言》里的,当然《真言》里分裂节点时情况有点出入,这里我们要处理的情况是(1)节点面积太小而且节点和物体有碰撞,那么删掉节点(2)假如节点在物体AABB内,那么删掉(3)假如物体和在节点内或者节点和物体有相交,那么分裂。反复迭代,最后合并细碎节点

这是分裂节点后的图,这里没有合并细碎节点,合并的函数也是我们上面合并的函数,只要重新调用就可以合并很多小节点。

 

 

下面是几张AStar关于网格导航寻路的图

 

普通直接相邻连接寻路

 

这个是有阶梯的情况,当然由于一些节点的连接人工没有删掉所以有点问题(主要是自动生成连接时,没有考虑节点投影重合问题),但是删掉后就会有比较好的路径。

 

 

有跳跃连接的情况,注意这里的台阶都是很高的,他们的连接是跳跃的连接

游戏思考17:寻路引擎recast和detour学习二:recast导航网格生成流程\源码剖析流程\局限性,附录计算点线面举例代码 网格导航的生成和局限性、流程和代码解析 阅读详情

相关推荐

Unity --- 导航网格 与 导航的使用

当我们角色的重心(中心)部分来到边框线的时候(如下图的胶囊),我们的角色(圆柱体人)的边缘就和整个地图的边缘重合了,此时圆柱体人再往前移动一步的话就会导致角色(圆柱体人)掉出地图,所以边框外的部分都被识别为不可行走,所以会没有网格覆盖。所谓的代理半径和代理高度,其实这些参数都是一个圆柱体的参数,AI算法会根据这些参数生成一个圆柱体,而这个圆柱体就是用来作为人形模型的替代品的(也就是所谓的代理)有了导航组件的话,我们的游戏物体将会具有自动绕过障碍物的能力,以及在绕过障碍物的前提下计算最短路径的能力。...

qq_51947882的博客 3008

了解导航网格 Navigation Mesh

原文:https://www.jianshu.com/p/490a9128b248 这篇文章,首先会介绍什么是导航网格,它在 3D 游戏中起到了什么样的作用。然后会介绍目前导航寻路最常用的第三方开源库RecastNavigation。接下来,就是重点讲怎样利用 RecastNavigation 来生成导航网格,并且利用这些导航网格来进行寻路。最后,会讲到 RecastNavigation 的局限...

Chydison 4546

Unity【Tutorial——Beginner——Unity NavMesh】

Unity个人学习笔记,资料来源unity官网 官网 全名navigation mesh导航网格,查找一下出现了很多,先学习找到的这个教程好了,起码先明白是什么东西 貌似UI里也有这个记得 Learn how to create AI pathfinding using the Unity NavMesh components! 居然事用来给AI寻找路径的吗 老样子遇到新名词往往可以查找手册NavMesh手册 Mesh手册 先简单说,mesh直译:网格,texture纹理 , material材料 sha

Ashen22的博客 702

建立接近最优的导航网格以及基于导航网格的寻路算法

<br />一种接近最优的导航网格生成算法以及基于导航网格的寻路算法<br /> <br />关键词:导航网格、A*寻路、3D环境中的寻路<br /> <br />提出背景:<br />长距离寻路会出现掉帧现象,为了提高寻路速度,并为3D环境中的寻路方案提供基础算法实现。<br /> <br />目前状况:<br />由于3D游戏对帧率要求很高,而在游戏中进行一次长距离的寻路可能要花费8-10帧的时间,在地图复杂的情况下寻路时间甚至可能会更严重,而在这段时间,渲染循环会暂停渲染并等待寻路结果。会给玩家带来不

Heru 8753

Unity 用户手册用户指南导航网格 (Navmesh) 和寻路 (Pathfinding)

导航网格 (Navmesh) 和寻路 (Pathfinding)(仅限专业版 (Pro)) 导航网格(也称为 Navmesh)是世界几何体的简化表示,被游戏代理用来进行全球导航。通常,代理有一个目标或一个目的地,它试图找到通往该目标或目的地的路径,然后沿着该路径导航到该目标。这个过程称为寻路。请注意,导航网格 (Navmesh) 生成(或烘培)通常由游戏开发者在编辑器内完成,而寻路通常由代理在运

u013951435的专栏 1763

unity自带的导航构建一个简单的地图寻路

1,利用navigation内置的运动控制2,自己控制运动3,运行时构建导航网格重要组件NavMesh Agent(导航网格代理 挂载在怪物上)off-Mesh Link (网格链接)NavMesh Obstacle(障碍,不经常移动勾选Carve)using System.Collections; using System.Collections.Generic; using UnityEngi...

RootTimeYu的博客 3483

UE4 动态创建寻路网格

UE Runtime动态创建导航网格并绘制分析

DuGuYiZhao的博客 3979

Unity RTS导航网格与路径可视化完整教程

Unity的NavMesh系统是游戏开发中的关键组件,尤其在处理复杂游戏环境中角色移动和路径寻找时。通过实现基于网格的导航,NavMesh允许开发者创建一种可行走区域的覆盖,让AI角色知道哪里可以走,哪里不可以走。NavMesh的工作机制首先需要我们构建网格来表示可行走区域,这些网格是根据场景中的几何体进行自动生成的。开发者可以设定不同的导航类型,如步行、车辆等,以适应不同游戏元素的移动需求。

weixin_28713083的博客 766

Unity Navigation 导航、寻路系统

Unity Navigation 导航、寻路系统 概述 了解Navigation的能力范围 Navication系统的构成 NavMesh 导航网格,是unity烘焙出来的数据 NavMesh Agents 帮助角色寻路 Off-Mesh Links 连接2点的组件,也可以用来跨越缝隙 NavMesh Obstacles 移动的或者不动的障碍物 Navication...

TDC的专栏 1634

(10)Proteus 8.9上的STM32仿真系列(HAL)---freertos

实验设计:通过cubemxide生成freertos工程,然后创建一个 pc13 led灯间隔200ms闪烁的任务。非常遗憾的是proteus8.9仿真失败,实物上没有问题,但还是把流程过一遍。 一、原理图 实物是淘宝上stm32f103 c8t6的核心板,proteus上没有这个芯片,这里图上大概表示一下,用的是核心板自带的pc13引脚的led灯。 二、cubemxide配置 1.RCC如之前工程一样配置 2、配置SYS timebase Source不要使用systick,自己选择一个定时器,我这

qq_35442550的博客 7344

java对接海康实现页面实时播放和回放

前言:之前已经写过一篇关于视频的文章,因为觉得有很多优化的地方,也谢谢同行们加我微信跟我提了一些需求和意见,所以在过年的假期重新写了一个比较能扩张的版本。 上一个版本的连接:https://blog.youkuaiyun.com/weixin_45848110/article/details/119363602 与之前的版本不同之处: 1.不需要安装ffmpeg 2.不需要安装nginx 3.直接运行jar即可 4.之前是完全脱离海康sdk,回放的录像是保存到本地服务,现在是直接在海康硬盘录像机获取录像回放 5.实时播

weixin_45848110的博客 1万+

unity3d NavMesh导航网格学习笔记之什么是导航网格系统

1、什么是导航网格系统? unity3d 的NavMesh导航系统是一种用于动态物体自动寻路的技术。动态物体就是在游戏中可以运动的物体,一般是有生命的游戏角色,比如玩家英雄、怪物等。很多rpg游戏、实时对战游戏都是使用导航寻路,鼠标右击地图上的某点,游戏角色自动找出到达该地点的最佳路线,然后以一定速度前往该目的地,这就是导航寻路。静态物体就是游戏地图中位置和形状稳定的、可以形成导航网格的物体,常见...

wutaikun的博客 3399

别再死磕SPWM了!手把手教你用STM32实现SVPWM驱动PMSM电机(附代码)

本文详细介绍了如何使用STM32实现SVPWM驱动PMSM电机,对比传统SPWM方案,SVPWM在电压利用率、电流THD、转矩脉动和稳态温升等方面均有显著提升。通过克拉克变换优化、扇区快速判断和矢量作用时间补偿等核心算法,结合STM32硬件加速技巧,实现高效电机控制。附代码示例,助力开发者快速掌握SVPWM技术。

weixin_28733777的博客 274

NavMesh 导航网格神级插件发布!高效实现 3D 自动寻路

寻路是游戏开发中不可忽视的功能之一,NavMesh 导航网格寻路则被广泛用于在复杂的 3D 游戏世界中实现动态物体自动寻路。开发者 iwae 创作了插件 Easy NavMesh,在 Cocos Creator 3.x 中实现了完善的 3D 自动寻路功能。导航网格(Navigation Mesh,简称 NavMesh)能够存储可行走区域的网格信息,用以在复杂的 3D 空间中实现导航寻路等功能。导航...

Cocos的博客 2517

PLC模拟量输入电路设计:±10V与±20mA信号调理全解析

在工业自动化和数据采集系统中,模拟量输入是连接物理世界与数字控制的核心桥梁。无论是变送器输出的4-20mA电流环,还是伺服驱动与信号发生器提供的±10V电压信号,PLC和采集模块都需要在复杂现场环境下稳定、精准地完成信号采集。理解信号体制的原理——电流环抗长线干扰、电压环响应快——是设计模拟输入前端的基础。通过精密电阻网络实现分压与采样,利用运放完成双极性到单极性的电平搬移,配合TVS与滤波电路保障可靠性,并经过ADC量化与校准流程,最终构建出兼顾精度、成本和工业级鲁棒性的完整信号链路。本文面向硬件工程师与

weixin_29163797的博客 300

23、OpenMP常见用例与标准循环级示例详解

本文详细介绍了OpenMP的三种典型用例:循环级OpenMP、高级OpenMP和MPI+OpenMP,适用于不同层次的并行需求。重点讲解了循环级OpenMP在向量加法、流三元组和模板计算中的应用示例,并探讨了首次触摸优化、线程绑定、NUMA架构影响等关键性能优化策略。通过实际代码演示和性能分析,帮助开发者快速掌握OpenMP的基础并行化方法,并为后续高性能优化提供指导。

fanta的博客 87

UNITY NAVMESH 导航网格

我们做游戏时常要用到寻路, 比如敌人被玩家攻击后, 要跑到玩家身边 近战攻击玩家。 NAVMESH 就可解决这种寻路的问题。 我们打开UNITY(我的UNITY版本是2019 .2.1F1), 在窗口 --》AI--》导航 中打开 NAVMESH 窗口 导航窗口会出现在右边 然后我用CUBE 搭了一个场景, 两层,上层是一个H型 的地面, 下层是一个方型的地面,...

smartfeng_bnf的博客 1028

多模态大模型在AI人工智能领域的创新实践探索

随着人工智能技术的飞速发展,单一模态的数据处理已经难以满足复杂现实场景的需求。多模态大模型通过融合多种模态的数据,如文本、图像、音频等,能够更全面、深入地理解和处理信息,为人工智能的发展带来了新的机遇和挑战。本文的目的在于深入探讨多模态大模型在AI人工智能领域的创新实践,包括其核心概念、算法原理、实际应用等方面,旨在为相关领域的研究人员和从业者提供全面的技术参考和实践指导。本文的范围涵盖了多模态大模型的基本原理、算法实现、数学模型、项目实战以及实际应用场景等多个方面。

大模型应用工坊 1316

Unity3D 导航网格自动寻路(Navigation Mesh)

NavMesh(导航网格)是3D游戏世界中用于实现动态物体自动寻路的一种技术,将游戏中复杂的结构组织关系简化为带有一定信息的网格,在这些网格的基础上通过一系列的计算来实现自动寻路。。导航时,只需要给导航物体挂载导航组建,导航物体便会自行根据目标点来寻找最直接的路线,并沿着该线路到达目标点。 下面通过一个简单的Sample来介绍NavMesh的应用: 1.在Scene中新建三个...

315

226届数字IC秋招笔试面试全攻略

本文系统介绍了数字IC设计岗位面试的核心技巧,聚焦三大关键环节:自我介绍、项目介绍和技术问题回答。在自我介绍部分,强调1-2分钟结构化表达,突出与岗位匹配的技能和量化成果;项目介绍环节提出"背景-职责-技术-难点-成果"五步框架,建议结合架构图和性能数据展示技术深度;技术问题回答策略包括理解问题、结构化思考、举例说明和诚实应对未知。文章还提供了项目包装方法,指导如何通过量化数据、架构创新展示和技术难点解决方案来突出项目亮点,并附有简历项目描述示例和技术问题回答模板,帮助面试者全方位展示专

2301_79143213的博客 1062

假新闻检测论文分享(25)L-DefenseExplainable Fake News Detection With Large Language Model

现有的假新闻检测工作主要集中在通过深度网络结合多种信息来学习假新闻的潜在特征,如可信度、立场、传播模式、额外知识、域外数据等。尽管他们在探测上取得了成功,但受限于他们的黑箱性质,他们无法提供任何对公众至关重要的理由。为解决这一问题,一些研究致力于可解释假新闻检测(EFND),旨在同时生成准确性预测和解释。许多工作通过注意力机制在相关报道中注意突出特别的单词、短语或句子来提供可解释性。然而,这些工作只发现了对最终预测有高贡献的区域,缺乏直观和可信的解释。

weixin_41964296的博客 732

How are dtLinks created in NavMesh

(Jin Qing’s Column, Nov., 2022) defines a link between 2 polygons. It is an internal data structure.A is owned by its source polygon.The links are used in , to search all the neighbor polygons, from the current best polygon. has 2 required fields:If the l

金庆的专栏 388

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Unity中的导航系统

Unity——NavMesh(导航网格)

weixin_63451038的博客 2442

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

留个档,Unity Navigation. 动态创建NavMesh,动态Bake NavMesh, 动态烘培NavMesh

运行时,动态创建NavMesh,动态Bake NavMesh, 动态烘培NavMesh。根据unity官方的demo,解析一下,发现动态创建NavMesh导航并不难.简化写法如下,是不是需要缓存某些信息,就看具体逻辑实现了。其实只需要 网格信息,还有 需要创建的范围即可。可以认为是固定公式了。

神一般的狄狄的小黑屋 2077

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Unity中初步使用Navmesh寻路系统

效果demo: 一、新建测试场景 测试场景:新建空Navmesh作为路径的容器 二、设置导航路径 在可以通过的物体上勾选Navigation Static,代表参与到导航的烘焙。 三、设置某些不可走的地方 四、添加小人,挂上NavMeshAgent组件 五、利用这个组件控制小人的移动 using UnityEngine; using UnityEngine.AI; public class NavmeshController : MonoBehaviour {

岁月相伴 2831

Unity:Navmesh

NavMesh Method: CalculatePath   计算两点之间的路径和存储路径。 DistanceToEdge 找到最近从一个点的NavMesh NavMesh边缘。 GetLayerCost  取得成本超过一层上的所有代理类型的几何遍历。 GetNavMesh

emoonight的专栏 698
上一篇: TGA文件内部格式详解(转)
GameRefer
博客等级 码龄14年 5粉丝 17原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值