NavMesh生成研究(五):细节网格生成

Unity NavMesh 导航系统 NavMesh(导航网格)是一个由多个三角形网格组成的表面,它描述了游戏世界中所有可行走的区域。通过在场景中生成一个 NavMesh,Unity 可以计算出角色从一个位置移动到另一个位置的路径,避开障碍物并遵循场景的地形。NavMesh 的工作原理类似于一个地图,指示哪些区域是可行走的,哪些区域是不可达的。基于该网格,游戏角色可以进行路径寻找(pathfinding),并通过计算出最短路径来自动移动。 阅读详情

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

这篇文章描述了构造导航网格过程中的第五步,也就是最后一步:带有高度细节信息的三角网格的生成。

源数据类:PolyMeshField 和 OpenHeightField
构造类:DetailMeshBuilder
数据类:TriangleMesh

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

为什么需要这一步

如果源网格的可行走表面被投影到xz平面上,且被前一个步骤中生成的多边形网格覆盖,那么这两者能很好地匹配。但是在3维空间中,多边形网格可能不会与源网格的高度轮廓恰好一致。这一阶段增加了高度细节,使得细节网格能够在三维上匹配源网格的表面。为了实现这个目标,我们遍历所有的多边形,只要多边形过度偏离源网格,就在多边形的边和内部插入顶点。

在下面的例子中,靠近楼梯的多边形网格在xz平面上匹配,但是在y轴上偏离了很多。

这里写图片描述

当高度细节加入后,在y轴上匹配得更好了。

这里写图片描述

从技术上来说,这一步对于寻路不是必需的。我们真正所需的只是一个凸多边形网格,它用来生成寻路算法相关的图——上一阶段中创建的多边形网格已经提供了所有必要的数据。某些场合尤其如此——例如使用物理或者射线将寻路代理放置在源网格的表面上。事实上,Recast Navigation的Detour库只使用了多边形网格做寻路。当前步骤中生成的高度细节是可选的,若包括进去,则只是用于优化各种Detour函数计算出的顶点位置。

同时需要注意的是,这个过程也只是生成对原始网格表面的一个更好估算。体素化决定了无法得到完全精确的位置。除此以外,考虑到性能和内存的影响,高度细节过多往往会比过少更糟糕。

第一步:高度补丁(height patch)

你这样就以为无需体素空间和高度域了?不完全是这样。为了加入高度细节,我们需要能够确定多边形的表面是否与覆盖它的开放高度域区间离得足够远。高度补丁就是用于这个目的。它包含与一个多边形相交的每个开放高度域格子位置的期望高度。基本上,它是开放高度域某一部分的简单裁剪,带有下列特征:

  • 它只包含单个多边形的AABB包围盒的高度信息。
  • 它只包含每个格子位置的底部高度(无区间)。
  • 它只对每个格子位置有单个高度(无覆盖)。

这里写图片描述

总览

当前阶段的主要步骤如下:对于每个多边形来说,

  1. 对多边形的外边采样。若这条边偏离高度补丁大于contourMaxDeviation值,则添加顶点。
  2. 对多边形执行德劳内三角化(Delaunay triangulation)。
  3. 对多边形的内部表面采样。若表面偏离高度补丁大于contourMaxDeviation值,则添加顶点。对于任何新顶点更新三角化。

    给多边形的边添加细节

这一步更好地匹配数据在高度补丁里的多边形的边的高度。它是两个采样过程的第一步,第二步是处理多边形表面。

接下来从2D角度看。在下面一组图中,我们从沿y轴上升的那一侧来看网格。

对于多边形的每条边:基于contourSampleDistance的值将边切割成线段。例如:如果边长10个单位,采样距离是2个单位,那么将边切割成5条等长的线段。这里的“采样顶点”并非全部会被用到,它们只是可能的顶点。

这里写图片描述

使用高度补丁数据,将每个采样顶点的高度(y值)快照到高度域中。

这里写图片描述

检查采样顶点到原始边之间的距离。若超过最大偏离,则插入离原始边最远的采样顶点。

这里写图片描述

重复距离检查,直到多边形新的部分已完成。

这里写图片描述

三角化

网上有大量关于德劳内三角化的信息,因此我们不再赘述,唯一想说的就是:在给边添加细节后,它被用来对多边形做三角化。到此为止原始多边形不复存在。所有的操作都是针对三角形网格。

这是多个可能的三角化的第一步。从这一步开始,当任意新的顶点加入到网格中时,三角化将会发生。

给内部多边形表面添加细节

到此为止我们从单个多边形得到了较小的三角形网格。(或者,如果原始的多边形就是三角形,而且没有新的顶点在边的细节这一步加入,那么我们仍然拥有一个三角形。)所有的顶点仍然在网格的边上。在这一步中,我们检查网格的内部表面,看它是否与高度补丁中的数据偏离太多。

这里写图片描述

下面一组图仍然是2D的。但是我们切换到xz平面的俯视视角。

添加高度细节到三角形网格的内部表面与添加到边上类似。采样顶点的格子沿着网格的AABB包围盒所在的xz平面被构建。间距基于contourSampleDistance的值。采样顶点的y轴的值被快照存储到高度补丁里的数据中。

网格外部的采样顶点被丢弃掉。

这里写图片描述

在剩余的采样顶点中,找到离三角形网格的表面最远的那个。如果它比contourMaxDeviation的值更远,那么就将它加入网格中,并重新三角化。

这里写图片描述

重复这个过程,直到再没有采样顶点超过contourMaxDeviation的值。

这里写图片描述

结尾

这一步中的其他工作属于事务性工作。由独立多边形创建的细节三角形网格被合并成单个网格,并被加载到TriangleMesh的实例中。整个过程就此完结。我们得到了最终的导航网格。

这里写图片描述

A*插件关于生成导航网格的简单配置及一些参数的干货 生成寻路网格的配置(场景自行搭建) (本文章所使用的A*插件版本为4.1.16) 以下为我搭建的场景(地面10*10,障碍物均为5*5,楼梯每阶高0.3) 创建一个空物体,命名为A*,然后添加上Pathfinder组件 点击Graph,会出现好几种生成寻路网格的方式,这里我会讲我之前在做寻路测试用的两种Grid Graph和Recast Graph。 首先先看一下Gr... 阅读详情

相关推荐

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

格子地图生成导航网格

整理后的: https://www.cnblogs.com/Hichy/p/9145857.html原网页:https://gamedev.stackexchange.com/questions/38721/how-can-i-generate-a-navigation-mesh-for-a-tile-grid1 Use Marching Squares algorithm to...

914

[unity3d]recast navigation navmesh 导航网格 寻路算法 源码分析

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

飞天大蟾蜍的专栏 6368

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

nav寻路一般包含两部分,首先是使用工具根据地图信息生成寻路用的nav mesh,接下来就是在游戏中根据生成的nav mesh来自动寻路。 一般人首先关心的就是寻路方法,所以这里把顺序颠倒下,先说寻路。 一.  使用A*寻找所经过网格路径  下图为一个已经生成nav网格的地图,深红色区域为不可行走区域,浅红色区域为可以行走的区域。 如下图,现在如果要寻找从A点到B点

lienen的专栏 1307

godot_2d_navmesh_generator:Godot插件可从碰撞节点生成2D导航网格

Godot 2D Navmesh生成器 一种用于根据2D场景中的碰撞数据生成导航网格的工具。 在Godot 3.2.3中实施和测试。 PR很受欢迎,但是不能保证会Swift进行审查。 安装 如果您的Godot项目是通过Git跟踪的,建议将其安装为。 这意味着您可以轻松提取更新。 从您的项目根目录: git submodule add https://github.com/samuelbigos/godot_2d_navmesh_generator addons/godot_2d_navmesh_generator 如果您不在Git上进行跟踪,请下载回购协议并将其放置在“ addons / godot_2d_navmesh_generator”目录中。 用法 将NavigationPolygonInstance添加到场景中()。 在检查器菜单中,添加一个新的NavigationPol

1448•纯粹素数

纯粹素数是这样定义的:一个素数,去掉最高位,剩下的数仍为素数,再去掉剩下的数的最高位,余下的数还是素数。对于每一个数(无论质数合数)x,筛掉所有小于x最小质因子的质数乘以x的数。但我们知道,我们选择的那个质数必须小于那个合数的最小质因子。p3,因为p2>p1,所以这样是筛不到的。唯一会筛的是第一种:p1和p2*p3。c,s肯定小于刚才那个合数,说明肯定对于它已经筛过,然后a肯定小于s,因为s=b。p3,并且保证p1<p2<p3。我们知道,筛掉这个合数的机会有:p1和p2。c,并且a是最小的因子。

SSL_bin的博客 591

Three.js导航网格实现教程【NavMehs】

导航网格或 navmesh是一种用于虚拟环境中路线规划的数据结构,在游戏开发中特别有用。它由一组代表地图区域的凸多边形组成,多边形的边用额外的连接信息进行了注释,显示了游戏角色可以穿越的区域。正如你在下图中看到的,导航网格提供了世界上障碍物的简化表示,允许路线规划算法快速有效地计算出最佳路径。我不会在这篇文章中过多地谈论导航网格背后的理论,网络上有很多很好的资源;维基百科条目是一个很好的起点。相反,我将专注于构建导航网格的技术。

新缸中之脑 2579

N5105核显直通PVE:从黑屏到HDMI输出的完整指南

PCI直通能让虚拟机独占物理设备,但核显直通远没有独显那么轻松。Intel核显与CPU、显示输出链路的强耦合使UEFI引导、GOP驱动、驱动签名等环节都成了黑屏陷阱。在PVE虚拟化环境中,通过IOMMU开启、vfio-pci绑定、OVMF固件和Q35机型配合,可以绕过KVM检测,让Windows虚拟机正确驱动核显,从HDMI口输出画面,并解锁Intel Quick Sync硬解能力。这种方案尤其适合N5105等低功耗迷你主机,可作为客厅HTPC、本地视频硬解或依赖硬件加速的轻量工作台。本文基于N5105平台

weixin_31082403的博客 375

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

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

Heru 8753

实战指南 | Adjust 与 Facebook、Google Ads 自归因配置全流程解析

本文详细解析了Adjust与Facebook、Google Ads自归因配置的全流程,帮助移动应用出海推广者解决广告归因难题。通过自归因功能(SAN),开发者可以获取更准确的数据、简化配置流程并扩大安装来源覆盖,显著提升广告效果监测和ROI计算效率。

weixin_42528780的博客 539

SAP公司间外协业务流程以及配置说明

SAP公司间外协业务流程以及配置说明

竹大的博客 7168

Unity 3D基础:NavMesh导航网格的烘焙与使用

本文是《Unity工程师成长之路教程》系列中关于NavMesh导航网格的基础教学。文章系统讲解了NavMesh的核心概念、技术原理及实践应用,包括导航网格的烘焙流程和使用方法。通过代码示例和架构图解,详细演示了如何在Unity中实现角色导航功能,涵盖了组件化设计、生命周期函数等关键技术点。文章还提供了环境准备步骤和基础应用示例,帮助开发者快速掌握这一重要技能,为游戏开发中的路径规划和AI行为实现奠定基础。

输出倒逼输入,写作驱动成长。 2899

XCP实战系列介绍09-基于Vehicle Spy进行XCP测量步骤详解

详细介绍如何使用Vehicle Spy进行XCP测量

initiallizer的博客 1393

导航网格NavMesh

导航网格(Navigation Mesh,简称 NavMesh)是游戏开发、机器人路径规划等领域中用于角色或物体寻路的一种重要技术。下面从基本概念、生成过程、优势、局限性以及应用场景等方面进行详细介绍。

游戏全栈,技术合作 1368

置顶必读(1) | 《YOLOv26实战:从入门到深度优化》专栏导读与完整目录导航(持续更新中)

🏆 本文收录于 《YOLOv26实战:从入门到深度优化》 专栏。 本专栏系统梳理并持续复现 YOLOv26 官方特性、核心改进、多任务支持、部署优化与行业落地,内容坚持 持续更新 + 深度拆解 + 工程落地导向,不仅讲“怎么用”,更讲“为什么这样设计、如何真正落地到项目中”。

**My Coding Family** 9万+

手把手教你学基带SOC芯片(4.4.9)--基带芯片的电源管理实例:高通 Snapdragon 系列实例(十)

Snapdragon 888 通过支持多种深度睡眠模式,如 AOAC 模式、低功耗模式和深度睡眠模式,以及智能电源管理技术,实现了对功耗的精细管理。这些模式不仅延长了设备的电池寿命,还确保了用户在各种使用场景下的良好体验。无论是保持网络连接、限制后台活动,还是完全关闭不必要的功能,Snapdragon 888 都能够灵活应对,提供高效的功耗管理方案。

MHD0815的博客 740

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

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

随意的风的专栏 2428

使用AutoDL云服务器训练YOLO计算机视觉网络模型(AutoDL+Xftp+VS Code),附详细操作步骤

AutoDL AI算力云是一个提供人工智能算力服务的云平台。丰富的GPU资源:提供多种GPU型号,包括NVIDIA的A100A800L40V100RTX 4090RTX 3090等,能满足我们在不同场景下的需求,无论是进行大规模的AI训练还是复杂的科学计算等任务,都可以找到合适的GPU资源。灵活的付费方式:支持按量付费包日包周包月等多种付费模式。对于短期的实验或不确定时长的项目,可以选择按量付费;如果有长期稳定的算力需求,预付费或包周包月则可能更划算,可以根据自己的需求和预算进行选择。集成主流框架:集成了。

Limiiiing的博客 958

Habitat环境学习四:Habitat-sim基础用于导航——使用导航网格NavMesh

在Habitat中如何使用导航网格NavMesh。

qq_43650421的博客 4699

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

IEM模型,地表粗糙度模拟

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

NavMesh,关于导航网格的创建

在《人工智能游戏编程真言》中,有详细的叙述如何建立导航网格,但是却没有一丁点的代码,而且在创建过程中,还有许多细节问题没有解决,在百度文库中有一篇关于AS3建立导航网格的文章,里面也讲的很好,但是那里使用三角形作为节点,这显然对于多边形较多的3D世界不太合适。不过里面的A*寻路算法的相关取值是值得观看的。进行了几个礼拜的编写,导航网格稍微能看我先给几张截图,让大家有个底!可以生成多边形的网格节点,

GameRefer的专栏 2942

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

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

长三月的游戏开发 2万+

温度PID控制PLC程序

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

NavMesh寻路网格自动生成和动态障碍技术、Navmesh入门教程

在之前的自己写的NavMesh网格寻路功能的基础上,做了个寻路网格动态自动生成的功能,突破了Unity的自带寻路不能动态生成寻路网格,一定要先break再用的缺点。 用法很简单,把可以走的地形设置成一个叫做“Walk”的标签,然后不能走的地方设置成叫“cantWalk”的标签,然后就什么都不用管了,直接运行即可。 在没有任何障碍物的情况下,就和之前的寻路一样:

Patrick 3325

寻路网格Nav Mesh的生成原理

文章目录1 简介 这篇文章将会翻译一篇来自布莱金理工学院的论文Towards Real-Time NavMesh Generation Using GPU Accelerated Scene Voxelization的前一小部分。传统的NavMesh生成是在CPU上做的体素化,这篇文章主要讨论的是如何将这部分搬到GPU上做,从而起到加速计算的效果。不过本文只翻译前半部分,前一小部分概述了整个Nav...

Terie的博客 4748

UNITY NAVMESH 导航网格

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

smartfeng_bnf的博客 1028
上一篇: Shader学习笔记(一):Surface Shader
下一篇: 寻路建模的三种方式比较
长三月
博客等级 码龄9年 228粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值