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

javascript :实现凸多边形的凸包问题算法(附完整源码) 阅读详情

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

这篇文章描述了导航网格构建过程中的第四步:从代表轮廓的简单多边形生成凸多边形。从这一步开始,我们离开体素空间,回到向量空间。

源数据类:ContourSet
构造器类:PolyMeshFieldBuilder
数据类:PolyMeshField

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

概述

这一阶段的主要工作如下:

  • 轮廓(contour)的顶点位于体素空间中,这就意味着它们的顶点是整数格式,且代表着离高度域原点的距离。因此轮廓的顶点数据要被转换成源几何体(source geometry)的向量空间坐标。
  • 每个轮廓与其他轮廓完全独立。在这一阶段中,我们将重复的数据合并,并将所有数据汇总到一个网格中。
  • 轮廓只保证可以代表简单多边形,即同时包括凸多边形(convex polygon)和凹多边形(concave polygon)。而后者对于导航网格是没有作用的。因此我们将根据实际需求将轮廓分割成凸多边形。
  • 我们收集多边形之间邻接边的信息(多边形邻接信息)。

坐标转换和顶点数据合并是相对简单的过程。因此我们不再赘述。如果你对这些算法感兴趣,可以去查阅有完整文档的源代码。我们将重点放在凸多边形的分割上。对每个轮廓执行如下步骤:

  1. 三角化每个轮廓。
  2. 将三角形合并成最大可能的凸多边形。

在生成邻接连通信息之后,我们结束这一阶段。

三角化

三角化的实现过程是:遍历轮廓的所有边,对于每组三个顶点,判断是否能形成一个有效的内部三角形。对于所有潜在的候选者,选取形成最短新边的那一个。新的边被称作是“分割边”,或者简称“分割”(partition)。对剩余顶点继续这个过程,直至三角化完成。

为了提升性能,三角化在轮廓的xz平面投影下进行。

分步骤阐述:找到可能的分割方案。

这里写图片描述

选取最短的分割并形成三角形。除去无效的分割,生成新的可能的分割。

这里写图片描述

继续分割:

这里写图片描述

……直到三角化完成。

这里写图片描述

检测合法的分割

两个算法被用来判断一组三个顶点是否可形成有效的内部三角形。第一个执行速度快,而且能很快剔除那些完全位于多边形以外的分割。如果分割位于多边形内部,那么另一个更昂贵的算法被用来确保它不与任何现存的多边形边界相交。

内部角算法

这个算法有一点难描述。因此这里举了一些例子。首先是一个有效的分割。对于顶点A、B、C而言,AB是一种可能的划分:

这里写图片描述

从顶点A出发顺着相邻边界发出两条射线。如果分割的终点(顶点B)位于内部角中,那么这就是一个可能的有效分割。

这里写图片描述

第二个例子是同样的场景、不同的顶点。因为分割的终点(顶点B)位于内部角之外,所以它不可能是有效的分割。

这里写图片描述

边相交算法

这个算法容易理解多了。它仅仅是遍历多边形中所有的边,并检查可能的分割是否与它们中的任何一个相交。如果有,那么就不是一个有效分割。

只有两个算法都通过,才能认为分割是有效的。

合并成凸多边形

合并只能发生在由同一轮廓生成的多个多边形之间。不要尝试去合并两个相邻轮廓里的多边形。

请注意我已经切换到通用的形式“多边形”,而非三角形。最初的合并针对的都是三角形,但随着合并过程的深入,非三角形的多边形也可能被合并。

这个过程如下:

  1. 找到所有能够被合并的多边形。
  2. 从这个列表中,选取两个有最长公共边的多边形合并。
  3. 重复直至再没有可合并的多边形。

两个多边形想要合并,需要满足以下所有条件:

  • 多边形共享一条边。
  • 生成的多边形仍然是凸多边形。
  • 生成的多边形边数不多于参数maxVertsPerPoly

检查共享边和计算合并边数量都很容易。判断合并后的多边形是否为凸多边形则更复杂一点。这个判断过程的关键是共享的顶点。在合并后,两者都需要检查一下形状。如果都能形成内部锐角1,那么合并后的多边形仍然会是凸多边形。我们对每个共享的顶点做如下操作:

  1. 由共享顶点相邻前后的两个顶点构造一条有向的参考线(directed reference line)。
  2. 如果共享的顶点位于它的参考线左侧,那么就形成了一个锐角。

最好看图说话。第一个例子展示了一个有效的合并。

这里写图片描述

如果共享的顶点被标记为A,那么参考线则定为从顶点A-1到顶点A+1。顶点A处在参考线的左侧吗?

这里写图片描述

现在来看第二个共享的顶点。它是在参考线左侧吗?

这里写图片描述

在这下一个例子中,合并是无效的,因为合并后其中一个共享顶点形成的内部角是钝角2。

这里写图片描述

如果你对于用来检查点相对于有向线位置的算法不熟悉,那么可参见Soft Surfer算法。核心算法由PolyMeshFieldBuilder类中的getSignedAreaX2()函数来实现。

结尾

这个阶段的最后一步是遍历整个网格中的所有多边形,并生成连接信息。

当算法被优化后,从宏观上来讲,只需简单遍历所有的多边形边,并寻找与其有公共顶点的其他多边形。

目前的进展

我们最终回到了向量空间,并得到了一个由凸多边形构成的网格。

这里写图片描述


  1. 实际是指小于180度的角。 ↩
  2. 实际是指大于180度的角。 ↩
ConvexDecomposition:仅标头的C ++库,用于将凹面多边形分解和切成凸面多边形 凸分解 这个图书馆做什么? 这是仅标头的C ++库,用于将凹面多边形分解和切成凸面多边形。 该库还允许用户定义多边形切片(请参阅用法)。 ConcavePolygon类使用递归数据结构存储0或2个子多边形。 切片多边形时,将沿定义的线段拆分生成两个子多边形。 鸣谢:可在此处找到将凹面多边形分解为凸面的算法: : (马克·巴亚齐特)。 凸分解是在O(n * r)时间内完成的,其中n是多边形顶点的数量,r是反射多边形顶点的数量。 安装 要安装此库,只需将ConcavePolygon.h复制到您的项目中并#include“ ConcavePolygon.h”。 用法 示例:创建凹面多边形,分解并获取凸面子多边形 #include "ConcavePolygon.h" #include <vector> int main() { // Create a vector of ve 立即下载

相关推荐

F5 GTM DNS 实战指南:智能DNS的监控与健康检查机制

本文深入解析F5 BIG-IP GTM智能DNS的核心机制,重点阐述其监控与探针两大功能如何协同工作。监控器负责深度检查服务器应用健康,确保服务可用性;探针则实时测量网络路径质量,实现基于延迟的智能流量调度。文章通过实战配置步骤,指导如何构建逻辑架构、建立iQuery通信、配置业务级健康检查及探针,从而构建高可用、高性能的全局负载均衡解决方案。

weixin_29240711的博客 469

Unity使用NaveMesh实现第一人称视角移动

navemesh已经大量使用到游戏中,但大部分寻路都是使用SetDestination函数,给予一个目标点移动,第一人称直接操控移动的文章很少。为了解决这个问题,特此出了这篇文章。这篇博客主要使用NavMeshPath,通过得到移动数组,最终实现正确移动。以上就是今天要讲的内容,本文仅仅简单介绍了NavMeshPath的使用,而NavMeshPath提供了大量能使我们快速便捷地处理数据的函数和方法。(吐槽下~官方总结)

Tel17610887670的博客 1882

unity转微信小游戏:使用CDN加载游戏(微信开发者工具云开发CDN)

unity转微信小游戏:使用CDN加载游戏(微信开发者工具云开发CDN)

会潜水的小火龙的博客 3072

凸包多边形生成算法---快速凸包法

快速凸包法生成凸包多边形 介绍 快速凸包法,用于寻找一群点集中的凸包点 主要步骤分为两步 求上下左右四个顶点 迭代求出凸包点 Grid grid = new Grid(); 生成grid对象,all_points存放所有散点。 第一步较为简单,对所有点进行排序即可获得。存放在peak_points中。 第二步需要多种进行多种情况的判断,以及迭代求解。 可拆分为三个功能函数,及一个主题函数 函数1—已知三点求三角形面积—用三角形的面积大小判断点距线距离远近 函数2—判断点是否在线的左侧 函数3—迭代

weixin_51205206的博客 3330

5分钟搞定Nano-Banana图片编辑API对接:从Base64编码到生成图片全流程

本文详细介绍了如何快速对接Nano-Banana图片编辑API,基于gemini-2.5-flash-image-preview模型,从环境准备、Base64编码到API调用的全流程。通过实战示例和优化技巧,帮助开发者高效集成AI图片处理能力,提升产品竞争力。

dog123的博客 260

深度学习环境搭建以及DeepLabCut安装过程

文章目录 一、查询电脑硬件 安装GeForce驱动程序 二、环境搭建与软件安装 1.安装CUDA运算平台软件 2.安装cuDNN支持包 3.配置环境变量 三、 DeepLabCut环境配置 1.安装Anaconda 2.创建容器环境 3.激活容器环境 4.安装TensorFlow 5.验证TensorFlow是否安装成功 6...

m0_51136557的博客 3157

多边形寻路算法简单介绍

之前有网友在我这里留言,问我怎样用自己的方法生成NavMesh。我也答应了有空的时候介绍一下,所以写了这篇博客。 在说明生成的方法之前,需要先搞清楚几个概念性的问题: 1、NavMesh是一种寻路的算法,我使用的是凸多边形寻路算法,你可以理解成和A星寻路差不多的算法,并不是只有Unity才有的。 2、我使用的NavMesh寻路算法并不是Unity自带的那一套,而是全部自己写的,所

灵魂之栖 4637

在轻量化与精度之间取得平衡:YOLOv8 + GhostNet 的设计与实验分析

摘要: GhostNet系列(GhostNet、GhostNetv2、GhostNeXt)通过“幽灵特征图”技术,以极低计算量生成丰富特征,为YOLOv8提供轻量化改造方案。该技术能在减少参数量与计算量的同时保持或提升检测精度,适用于边缘设备部署。实现时需替换YOLOv8的Backbone为GhostNet模块,并通过消融实验验证其有效性。实验数据表明,改造后的模型在参数量降低30%的同时,推理速度提升28.6%,mAP@0.5最高提升1.9个百分点,平衡了轻量化与精度,为毕设提供技术创新性与工程落地性的双

m0_64661770的博客 194

多边形分割成若干凸多边形(NavMesh的初步形成)

本文基于 Arkin, Ronald C.的论文 “Path planning for a vision-based autonomous robot”.论文链接部分计算几何的算法基于现任佐治亚理工教授 Ronald C. Arkin,在1986年时发表了一篇叫做Path planning for a vison-based autonomous robot的报告,隶属robotics领域。文章提出了Meadow Map的方法以长时间存储地图。Meadow Map为现代Navmesh系统的雏形,

F_CILF_CIL的博客 5048

Vue3 - 实现用户上传本地视频文件到服务器+上传进度条+暂停续传+中断取消上传等,视频上传后可在线播放预览已上传的视频,视频文件上传视频回显示例代码(支持Element、Antd等upload组件

实现视频上传和视频预览,vue3实现视频上传功能,上传视频回显,视频流上传播放功能,vue与axios上传视频并显示上传进度,upload组件实现视频文件上传视频回显,upload组件实现视频上传及进度条展示,视频上传及实时进度条显示,视频上传过程中如何中断上传,VUE3+element 上传视频,大文件分片上传+断点续传,axios大文件切片上传,Vue3上传视频后如何播放预览,上传本地视频到后端服务器及在线预览播放视频+移除视频+进度条上传,将已选视频上传服务端并可预览视频,详细实现选择视频并上传到服务

🏆 前端领域优质创作者 3114

Python 爬虫实战:京东商品价格与评论数据爬取

本文介绍了使用Python爬取京东商品价格与评论数据的完整流程。主要内容包括: 环境准备:安装requests、BeautifulSoup、pandas等库,建议使用Python 3.8+虚拟环境。 目标分析: 商品列表页(HTML)包含名称、价格、SKU ID等数据 评论数据通过JSON API获取 反爬策略: 随机User-Agent 请求延迟2-5秒 设置必要Cookie 代码实现: 基础配置:设置输出目录、随机UA生成器 搜索列表页爬取:解析HTML获取商品基本信息 评论数据爬取:通过JSON AP

u014481728的博客 421

Unity-NavMesh详解-其一

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

lastXuanGod的博客 2231

C++幂运算全解析:std::pow()函数详解与实战指南

本文详细介绍了C++标准库中的std::pow()函数,包括其基本用法、数学定义和多种重载形式。重点分析了该函数在科学计算、图形处理等领域的实际应用,并提供了性能优化方案如快速幂算法和预计算表。文章还探讨了精度控制、错误处理等关键问题,最后通过一个完整计算器实现展示了综合应用。std::pow()作为基础数学函数,合理使用能显著提升计算效率和代码可靠性。

专注现代C++实战,从核心语法到高性能编程,助力开发者深入掌握系统级编程精髓。 340

recast 生成navmesh主要流程

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

640

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

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

qq_43650421的博客 4699

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...

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

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

随意的风的专栏 2428

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

RecastNavigation-NavMesh生成原理

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

qq826364410的专栏 1232

【游戏】Navmesh 知识炼化

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

无尽星空--帝王铠 408

RecastNavigation-NavMesh生成原理-(二)

本文翻译自CritterAI的文档:http://critterai.org/projects/cainav/doc/html/e72bd1ee-04b0-4bbb-a21d-d8d7ecaa11af.htm RecastNavigation是一款非常强大的寻路系统,被广泛的应用于各大游戏引擎中。如Unreal,Unity等。我之前也尝试看过部分RecastNavigation源码,添加了一些注...

随意的风的专栏 1020

让Unity NavMesh为我所用

Unity里面整合了一个NavMesh功能,虽然让人又爱又恨。 但当你在其他地方需要这个NavMesh的数据时,就更让人欲罢不能了。 比如说服务器需要Unity的NavMesh数据时。 比如说你想将Unity的场景导出到其他引擎时,比如时下流行的H5。 最近我就碰到了这样一个需求,走了一些弯路,研究了Unity的NavMesh 将Unity的NavMesh数据导出 先说...

dianjupi9036的博客 453

UE4 NavMesh学习笔记

学习资料: https://zhuanlan.zhihu.com/p/74537236 https://blog.youkuaiyun.com/u013272009/article/details/80086833 RecastNavigation有哪些内容 主要包含两大类:RecastNavigation = Recast(生成凸多边形,即网格)+ Detour(基于凸多边形集合的A*寻路算法) ...

Haipai1998的博客 3448

寻路 Waypoint 与 NavMesh 比较

正文   1. WayPoint寻路 下图是一个典型的路点寻路   另一种方法是使用多边形来记录路径信息,它可以提供更多的信息给ai角色使用。下图就是一个navigation mesh。   以下列出几个WayPoint的不足之处: 一些复杂的游戏地图需要的WayPoint数量过于庞大有时会使角色走“Z”型路径 如下图A点和

menuconfig的专栏 1万+

导航网格NavMesh

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

游戏全栈,技术合作 1368
上一篇: NavMesh生成研究(三):轮廓生成
下一篇: Shader学习笔记(一):Surface Shader
长三月
博客等级 码龄9年 228粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值