NavMesh生成研究(三):轮廓生成

详解Unity中的Nav Mesh新特性|导航寻路系统 (一) 之前我们讲解过Unity的Nav Mesh系统,其中提到过这个新版的Nav Mesh,它解决现有Nav Mesh的几个缺陷,比如无法动态烘焙,无法按照Agent的半径和高度适当的判断可行路径。现在新版Nav Mesh可以彻底解决这个问题!某种意义上讲,它只能算作一个补丁,因为它要依赖于原有的Nav Mesh系统,本篇文章就来讨论一下这个新版NavMesh系统到底是什么。 阅读详情

本文翻译自:http://critterai.org/projects/nmgen_study/contourgen.html

注:因第二步——区域生成的基本内容被我写的原创文章涵盖,因此不再花时间单独翻译,想了解这一步的可参见文章。

概述

这篇文章描述了构造导航网格过程中的第三步:简单多边形(轮廓和凹面)的生成,它们代表着源几何体的可行走表面区域。这些轮廓仍然由体素空间(voxel space)的单位来表示,但是这是从体素空间转向向量空间(vector space)的第一步。

源数据类:OpenHeightfield
构造类:ContourSetBuilder
数据类:ContourSet 和 Contour

如果你需要回忆这一步的大致过程,请回到总体概述。

寻找区域边界

从开放高度域结构迁移到轮廓结构时,最大的概念上的改变是从关注区间(span)的表面改为关注区间的边界(edge)。

对于轮廓来说,我们关心的是区间的边界。有两种类型的边界:区域(region)和内部(internal)。同样作为区间边界,区域边界隔开了不同区域,而内部边界隔开的是同一区域。

下面几个例子为了看得方便,简化成了2D模型。我们稍后会回到3D模型。

这里写图片描述

在这一步中我们想要将边界分成区域边界和内部边界两类。这个信息很容易得到:我们遍历所有的区间,对于每个区间我们检查它所有的邻接区间(axis-neighbours),如果这个领接区间与它不在同一区域类,那么把边界标记为区域边界。

这里写图片描述

寻找区域轮廓

一旦我们知道哪个区间边界是区域边界后,我们就能够沿着边界构建轮廓了。我们再一次遍历所有区间,若它拥有一条区域边界,则:

从面向已知的区域边界开始。将它添加到轮廓中。

这里写图片描述

旋转90度,继续添加区域边界到轮廓中,直到我们找到一条内部边界。前进一步到邻接区间中。

这里写图片描述

再逆时针方向旋转90度,重复执行前面的步骤。反复执行,直到我们回到初始的区间,面对初始的方向。

这里写图片描述

从边界到顶点

如果我们想回到向量空间的话,我们需要的是顶点,而非边界。顶点的(x, z)值很容易确定。对于每条边界,我们取它的顺时针方向的区间的顶角的(x, z)值(从区间内部看)。

这里写图片描述

求顶点y值的过程有一些技巧。在这里我们回到3D模型中。在下面的例子中,应该选取哪个顶点呢?

这里写图片描述

所有的边界顶点有最多4个可能的y值。应选取最高的y值,理由有二:它保证了最终的顶点(x, y, z)在源网格表面之上。再者,它提供了一种通用的选择机制来确保使用这个顶点的所有轮廓将使用同样的高度。

这里写图片描述

简化轮廓

到这一步,我们为所有的区域生成了轮廓。轮廓是由从区间角继承来的顶点构造。下面是一个宏观的视角。

注意有两种类型的轮廓部分。一种是两个相邻区域的入口,另一种则是与“空地”(empty space)相邻。在代码文档中,“空地”被称作“无效区域”(null region)。我也将在这里使用同样的术语。

这里写图片描述

那么真的需要这么多顶点吗?即使在直线轮廓上,每个区间都有构造边界的顶点。显然答案是不需要。唯一必需的顶点是在发生区域连接改变的地方,例如:区域入口的边界上。

这里写图片描述

简化区域-区域入口是件容易的事情。我们先将所有顶点丢弃,只保留必需的(mandatory)顶点。

这里写图片描述

对于到无效区域的连接要稍微复杂一些。这里使用了两个算法。

第一个是由MatchNullRegionEdges实现的Douglas-Peucker算法。它使用edgeMaxDeviation参数来决定将哪些顶点丢弃以获得简化的线段。它起始于必需的顶点,然后将顶点加回,并确保没有一个起始点与简化边界之间的距离大于edgeMaxDeviation。

一步步讲解:开始时是最简单的可能边界。

这里写图片描述

从简化边界找到最远的点。若它超过了edgeMaxDeviation,则将其加回到轮廓中。

这里写图片描述

重复这个过程,直到再也没有一个顶点与简化边界的距离超过允许值。

这里写图片描述

简化轮廓的一个简单例子:

这里写图片描述

正如之前提到的,另一个算法用于连接到无效区域的边界。第一个算法能够产生长线段,它们会在后面的网格生成过程中用于计算长且薄的三角形。第二个算法由NullRegionMaxEdge实现,它使用maxEdgeLength参数来重新插入顶点,并确保没有一条线段超过最大长度。实现方法是检测到长的边界,将其切成两半。重复这个过程直到再也没有超长的边界。

作为一个对最终网格影响的例子,在处理前:

这里写图片描述

在处理后:

这里写图片描述

目前的进展

在这一步的结尾,我们得到了形状是简单多边形的轮廓。顶点仍然处于体素空间中,但我们已经在返回向量空间的道路上顺利前行。

这里写图片描述

详解Unity中的Nav Mesh新特性|导航寻路系统 (二) 第一篇我们简要概述了新版NavMesh的一些新增功能,以及旧版的对比。本篇我们来讲一讲NavMeshSurface、NavMeshLink这两个组件的参数以及如何应用,接下来就进入正题吧。 阅读详情

相关推荐

navmesh 生成网格信息 总 (更新中 )

The general process is as follows: Voxelization- Create a solidheightfieldfrom the source geometry. 体素化,根据几何体创建solid heightfield(recast里面的rcHeightField) Generate Regions - Detect the top surf...

icebergliu1234的博客 1513

详解Unity中的Nav Mesh|导航寻路系统 (一)

在类RTS、RPG游戏中,都会提供自动寻路功能,当玩家下达指令后,NPC就会自动计算到达目标的路径,实现这种功能的方式有很多种,其中Unity本身也自带了一种导航寻路系统,该系统会将游戏场景中复杂的对象烘焙为网格信息,通过网格来计算NPC抵达目标的最短路径,该系统还支持动态寻路。接下来就详细讲讲NavMesh系统。.........

梦小天幼的博客 1万+

Unity游戏导航轮廓生成:从像素到NavMesh的鲁棒提取方法

在游戏AI寻路中,导航网格(NavMesh)的准确性高度依赖于障碍物在二维平面的精确轮廓表达。这一过程本质是将3D场景的通行语义压缩为2D多边形边界,涉及平面化、二值化、轮廓追踪、简化与定向等关键环节。技术核心在于解决Z轴信息丢失、抗锯齿污染和几何自相交三大陷阱,确保生成的闭合多边形满足NavMesh对顺时针外环、逆时针内环及无自交的硬性要求。实际工程中需结合pixelsPerUnit缩放标尺、形态学闭运算、道格拉斯-普克双阈值简化等手段,在精度与性能间取得平衡。本文聚焦Unity环境下的C#实现,覆盖Ti

weixin_33162074的博客 349

3D寻路系统NavMesh-客户端篇

2D寻路我们一般以A*寻路为主,那么,3D游戏世界呢,NavMesh(导航网格) 是3D游戏世界中主动寻路的一种技术,如果你想让游戏人物能自动绕开障碍物到达目的地.那你就来学习下。

流子的专栏 3625

嵌入式八股文-ARM

嵌入式八股文总结(ARM篇)-优快云博客现象:I2C死锁就是时钟线SCL一直处于高电平,数据线SDA一直处于低电平。从机拉低数据线SDA时(发送应答信号给主机时或发送数据0时)主机意外复位,主机复位后时钟线SCL就为高电平了,此时,SCL为高电平而SDA为低电平,主机就以为有其他设备占有了总线,而SCL为高电平时 数据位SDA不允许有变化,意思是:主机就一直等待时钟线SDA拉高,而从机就一直等待时钟线SCL拉高 就造成了死锁的现象。解决方法:1.选择带有复位功能的从设备,复位后SDA被拉高。

m0_63127436的博客 1259

Applied Energy期刊小白论文投稿模板-流程经验分享

Applied Energy期刊小白论文投稿模板-流程经验分享,Elsevier期刊(爱思唯尔)投稿流程

zzu_Flyer的博客 4万+

实变函数与泛函分析_实变函数与泛函分析第2章复习2020/09/28

1、 度量空间. 有了距离 , 就有球形邻域 , 就有点列(序列)极限的概念 , 可以定义集合之间的距离, 集合的直径 (理解为啥如此定义了么).2、 点与集合的关系(1)、 内点, 外点, 界点 (内点全体 , 外点全体 , 界点全体 ).(2)、 聚点, 孤立点, 外点 (聚点全体 , 外点全体 ).(3)、 聚点的刻画, 闭包的刻画.(4)、 对偶律...

weixin_39624733的博客 1220

HyperLPR3车牌识别-Android-SDK光速部署与使用

基于深度学习高性能中文车牌识别 High Performance Chinese License Plate Recognition Framework.快速部署AndroidSDK

tunm 6119

NavMesh轮廓提取与边界简化实战

本文介绍了轮廓提取与简化的工程应用和算法流程。首先定义轮廓提取为从多边形区域中找出边界点序列,简化则是去除冗余节点以保留主要形状。常见的应用场景包括NavMesh显示、地图编辑器、AI寻路和碰撞体生成等。算法流程分为轮廓检测(通过查找网格边界边并串联成环)和简化(如Douglas-Peucker和Visvalingam-Whyatt算法)。文章还提供了伪代码示例和工程参数建议,强调了处理多区域和动态障碍时的注意事项。轮廓提取与简化是地图绘制、空间分区和AI寻路的核心技术。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1190

AFC自动售检票系统与人工智能AI结合的关键应用方案

针对售检票、大客流管理、设备运维及服务优化提供了可落地的技术支持和实现细节,可作为地铁智慧交通项目的实践参考

leijinquan01的博客 1513

【UE5】映射方式:动作映射(Action Mappings) 与 轴映射(Axis Mappings)

链接:https://pan.baidu.com/s/1nQHvZXC4BDsfbFWDYZqEfA?按下键盘A键,不要抬起,屏幕左上角打印了一次。(和Unity中的轴映射机制类似)下面我们通过测试更直观的了解一下这。抬起键盘A键,屏幕左上角打印了一次。项目资源文末百度网盘自取。再添加一个按键,选择键盘。键,缩放值设置为 2.0。,框选所有测试节点,按下。的情况下,屏幕一直打印。

weixin_64072619的博客 3503

NavMesh生成研究(一):体素化过程

NMGen是一个开源项目,包括Java版的recast静态网格生成代码,以及详细介绍生成过程的文章。因为在阅读过程中觉得对理解recast原理非常有用,所以决定将其翻译在自己blog上。 原blog上完整的目录包括: 高度域介绍(Introduction to Heightfields) 总体过程概述(The High Level Process) 配置参数(Configuration P...

随意的风的专栏 2428

HFSS15 win10_64位破解

HFSS15 win10_64位破解 找到的别人的软件,但在首次安装时失败了,并不能patched。寻找了几种方法,已成功安装。在此写下安装经验,供大家参考。 软件安装包以及破解软件: 链接:https://pan.baidu.com/s/1MMjV_31maU5QD6fmI4zfIA 提取码:yj4q 在安装之前,建议关闭杀毒软件。 Step1:进入HFSS150Win64安装包,点击au...

玉笙寒 4万+

recast 生成navmesh主要流程

参考: critterai http://www.critterai.org recast & Detourhttps://github.com/recastnavigation/recastnavigation 关于理解 NavMesh 生成:  体素http://critterai.org/projects/cainav/doc/html/6fb304...

640

Open3D 曲率下采样

曲率下采样是一种基于几何特征的点云处理技术,通过计算每个点的曲率来判断其所在位置的局部表面特征,从而进行选择性保留。曲率的计算通常基于点的法向量和其邻域点的分布。

纵马踏花向自由 841

YOLOv11涨点改进 | 全网独家创新,注意力改进篇 | TGRS 2025 | 引入APCM自适应像素级协同机制,动态增强目标区域、抑制背景噪声,助力YOLOv11做红外小目标检测有效涨点

本文提出了一种基于APCM模块改进的YOLOv11网络模型,通过像素级局部-全局协同建模增强目标特征并抑制背景噪声。APCM模块采用轻量化设计,无需复杂参数,能有效提升小目标检测性能。文章详细介绍了APCM的原理、优势及其在红外小目标检测中的应用,包括模块结构、核心代码实现和YAML配置文件修改方法。实验结果表明,该方法在NUAA-SIRST和IRSTD-1K数据集上优于现有技术,显著提高了复杂场景下的检测精度与鲁棒性。

Ai缝合怪、助力小伙伴高效发论文 117

Unity-NavMesh详解-其一

注意:Region 虽然是不重叠且没有洞的区域,但仍然有可能是凹多边形,无法保证 Region 内任意两点在二维平面一定可以直线到达。后续需要进行轮廓生成和凸多边形生成,为寻路做准备。在这个阶段结束时,我们有形成简化多边形的轮廓。顶点仍然在体素空间中,但是我们正在回到向量空间的路上。许多算法只能用于凸多边形。因此,这一步将构成轮廓的简单多边形细分为凸多边形网格。这是通过使用一个适用于简单多边形的三角形划分(triangulation),然后再将三角形合并为最大可能的凸多边形来实现的。

lastXuanGod的博客 2231

IEM模型,地表粗糙度模拟

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

NavMesh生成研究(四):凸多边形生成

这篇文章描述了导航网格构建过程中的第四步:从代表轮廓的简单多边形生成凸多边形。从这一步开始,我们离开体素空间,回到向量空间。 源数据类:ContourSet 构造器类:PolyMeshFieldBuilder 数据类:PolyMeshField 如果你需要回忆这一步的大致过程,请回到总体概述。 概述 这一阶段的主要工作如下: 轮廓(contour)的顶点位于体素空间中,这就意味...

随意的风的专栏 1721

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

RecastNavigation-NavMesh生成原理

概述 本篇文章介绍了NMGen的核心处理流程。NMGen用于生成多边形数据,代表了导航网格的表面。有很多种网格生成方式,但是他们都包含了下面的一些步骤。  大体流程如下: 1. 体素化。将源几何体转换成实心的高度场,用来表示不可行走的空间。 对于源几何体上的每个三角形,对应生成体素,并加入到高度场中。 2. 生成区域。将实心的高度场,转换成一个开放的紧缩高度场,用来表示实体表面上那些可以行走的部...

qq826364410的专栏 1232

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【游戏】Navmesh 知识炼化

Recast Navmesh是一个开源3D导航工具集

无尽星空--帝王铠 408

Recast源码解析(二):NavMesh导航网格生成原理(上)

上文说到recast的寻路分为两部分:recast(建网格)和detour(寻路),这里就前面一步谈谈自己结合代码的理解。这里的navmesh指的是solo mesh,也就是静态网格,与能动态添加障碍的tile cache加以区别。后者另外单独撰文介绍。 这里推荐一个网站critterAI(网站地址),里面有两个很好的学习项目:CAINav是一个基于recast开发的可以在Unity运行的导航系...

长三月的游戏开发 2万+

基于NavMesh的A*寻路算法

基于NavMesh的A*寻路算法 代码工程目录: 链接:https://pan.baidu.com/s/1anKCGe5EMigeeb1wfydrYA 提取码:kebz 一、导入数据生成NavMesh导航轮廓 1、由文本导入数据,数据要求:可走轮廓的最外围为顺时针方向,障碍物为逆时针方向,顶点不可有重复的,各障碍物不可叠加; 2、使用扫描线算法划分三角形,生成多边形轮廓; 3、将生...

zhanxi1992的专栏 5851
上一篇: Recast源码解析(二):NavMesh导航网格生成原理(上)
下一篇: NavMesh生成研究(四):凸多边形生成
长三月
博客等级 码龄9年 228粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值