NAV导航网格寻路
- 格式:docx
- 大小:980.28 KB
- 文档页数:46
nav用法
导航菜单(Nav)用法详解
导航菜单(Nav)是网页设计中常见的一种组件,用于为用户提供网页内部链接的可视化方式。
以下是导航菜单的常见用法和设计原则。
1. 导航菜单的位置:通常导航菜单放置在网页的顶部或侧边栏,以便用户方便地找到并浏览网站的不同部分。
2. 菜单项的设计:菜单项应该简洁明了,并且用词准确,以便用户快速理解和选择。
可使用常见的页面标题,如首页、产品、服务、关于我们等。
3. 高亮当前页面:为了帮助用户了解自己所处的页面位置,导航菜单通常会高亮显示当前所在的页面,可以使用不同的颜色或其他视觉效果来实现。
4. 下拉菜单:如果网站拥有较多的页面或者细分的内容,可以使用下拉菜单来展示更多选项。
下拉菜单可以嵌套多个层级,使得用户可以更清晰地浏览和选择内容。
5. 响应式设计:随着移动设备的普及,导航菜单需要适应各种屏幕尺寸。
在响应式设计中,可以使用折叠菜单、隐藏菜单或滑动菜单等方式来确保在小屏幕上也可以轻松导航。
6. 导航菜单的样式:导航菜单的样式应该与整个网站的风格一致,不仅可以提升用户体验,也有助于建立品牌形象。
可以使用各种视觉效果,如渐变、阴影、图标等来增加菜单的吸引力。
总之,导航菜单在网页设计中起到了连接不同页面和内容的重要作用。
通过良好的设计和合理的布局,可以提升用户的导航体验,使其更加方便地浏览和访问网站的各个部分。
WayPoint寻路下图是一个典型的路点寻路另一种方法是使用多边形来记录路径信息,它可以提供更多的信息给ai角色使用。
下图就是一个navigation mesh。
以下列出几个WayPoint的不足之处:1.一些复杂的游戏地图需要的WayPoint数量过于庞大2.有时会使角色走“Z”型路径如下图A点和B点之间的路径NAV寻路如下图下图是路点寻路,如黄线,会产生“Z”字形下图为文章开始时展示的地图的比较,红线是wayPoint寻路,兰线是nav。
3. 不能进行动态修正,如果地图中有动态障碍,处理起来会很困难如要实现即时战略游戏中,一辆在路上行走的坦克会挡住你军队的去路,这个移动的坦克就是一个动态障碍。
4. 不能根据角色的特性(不同宽度、高度等)改变路径如一个狭窄的通道,普通的人能够通过,而一辆马车的宽度超过通道宽度,应该不能通过。
5. 不能保存地形的附加信息,如地表高度、地面特征(水面、沙地等)比如一个游戏中的角色在走到沙地上时会降低移动速度,或走在一个斜坡上时人物会发生倾斜等。
NAV导航网格寻路(2) -- 寻路方法2010-05-25 14:01:35| 分类:Game Tec |举报 |字号订阅竹石nav寻路一般包含两部分,首先是使用工具根据地图信息生成寻路用的nav mesh,接下来就是在游戏中根据生成的nav mesh来自动寻路。
一般人首先关心的就是寻路方法,所以这里把顺序颠倒下,先说寻路。
一. 使用A*寻找所经过网格路径下图为一个已经生成nav网格的地图,深红色区域为不可行走区域,浅红色区域为可以行走的区域。
如下图,现在如果要寻找从A点到B点的路径,首先要从所有可行走的网格中找到一条最优的网格路径(图中紫色的网格),然后再根据这些网格生成所需要的路径点。
计算最优网格路径的方法可以使用流行的A*,也可以使用其它方法。
A*算法网上很多就不说了,至于三角网格的A*实现因为涉及网格的数据结构会在系列的最后给出。
unity navmesh寻路原理Unity NavMesh寻路原理NavMesh寻路是Unity引擎中用于实现游戏角色自动寻路的一种常用技术。
NavMesh是一个由三角形网格组成的地图,其中每个三角形都被分配了一个代表可行走区域的标记。
在游戏中,角色需要根据目标位置自动寻找可行走路径,并且避免与障碍物相撞。
下面将介绍Unity NavMesh寻路的原理。
1. NavMesh生成NavMesh的生成是寻路系统的第一步。
在Unity中,我们可以通过在场景中挂载NavMeshAgent组件并设置其参数来生成NavMesh。
NavMeshAgent组件会根据场景中的地形以及设置的导航区域来生成NavMesh。
导航区域可以手动设置,也可以通过NavMeshObstacle组件自动生成。
2. 寻路算法Unity使用A*算法来进行寻路。
A*算法是一种常用的启发式搜索算法,用于在图形中找到最短路径。
它通过评估每个节点的估计成本来选择下一个最佳节点,并在搜索过程中动态调整路径。
3. 导航网格NavMesh在寻路过程中使用导航网格来表示可行走区域和障碍物。
导航网格是由多个三角形组成的网格,每个三角形都被分配了一个代表可行走区域的标记。
当角色移动时,寻路系统会根据导航网格计算出最佳路径。
4. 寻路计算在寻路计算中,NavMeshAgent组件会根据起始位置和目标位置,使用A*算法在导航网格上进行搜索。
搜索过程中,它会评估每个节点的代价,并选择代价最低的节点作为下一个移动的目标。
通过逐步移动到每个目标点,角色就能够找到一条到达目标位置的最佳路径。
5. 避障处理在寻路过程中,NavMeshAgent会根据场景中的障碍物动态调整路径。
当角色与障碍物相撞时,寻路系统会重新计算路径,并选择绕过障碍物的最佳路径。
这样可以确保角色能够平滑地绕过障碍物而不是直接穿过它们。
6. 动态更新在游戏中,角色的目标位置可能会发生变化,需要进行动态更新。
Unity3D架构设计NavMesh寻路Unity3D架构设计NavMesh寻路发表于由国庆闲来没事把NavMesh巩固⼀下。
以Unity3D引擎为例写⼀个底层c# NavMesh寻路。
因为Unity3D中本⾝⾃带的NavMesh寻路不能很好的融⼊到游戏项⽬当中,所以重写⼀个NavMesh寻路是个必经之路。
NavMesh在很多游戏中应⽤⼴泛,不同种类的框架下NavMesh寻路发挥的淋漓尽致。
与传统的A星寻路相⽐,NavMesh不仅减少了内存空间占有量,加快了寻路速度,还可以加⼊寻路⾓⾊的宽⾼限制,以及动态物体寻路等功能,基本上适应了⼤部分项⽬变化多端的需求。
我把写NavMesh的过程分成好⼏个部分,⼀⼀进⾏描述:⼀.⾸先要理解NavMesh核⼼算法。
NavMesh的核⼼算法就是⽤三⾓形代替传统寻路的⽅格,⽤计算拐点优化寻路路径来代替合并路径直线。
如下图1NavMesh寻路:以及如下图2传统的⽅格寻路:看到两者的差别了吧,NavMesh已三⾓形为寻路块,⽽传统以⽅格为寻路块。
其实两者都使⽤A*寻路,但就是其⽹格⽣成不⼀样,导致当有⼤范围寻路时,其效率和要求也不⼀样。
拐点计算优化路径就是到达⽬的地需要经过的⼀堆三⾓形中计算出最简洁的移动⽅式。
其核⼼算法就是从当前点到另⼀个三⾓形中的点之间的线段,与这条线段相交的线段全部是路径所穿越的线段,就是拐点,把所有的拐点找出来,并得到⼀条最长的拐点,那个拐点就是最佳的拐点位置。
三.NavMesh类设计详解(这⾥只设计2D的寻路,对于3D⽅向的寻路,其实是可以2D寻路代替的):1.所有类都在同⼀的命名空间NavMesh内 namespace NavMeshTriangle 三⾓形基础类NavTriangle 寻路三⾓形类 (继承Triangle)Line2D 线段类Polygon 多边形类Seeker 寻路主算法类—————————————– 让⼤家久等了 ————————————在寻路前,我们需要建⽴MESH三⾓形⽹格,这是NAV_MESH的重点之⼀。
Unity3D实现NavMesh导航⽹格寻路NavMesh(导航⽹格)是3D游戏世界中⽤于动态物体实现⾃动寻路的技术。
NavMesh系统是⼈⼯智能的⼀种,它使⽤⼀个添加在游戏对象上或者作为游戏对象⽗物体的名为“导航⽹格代理”(NavMeshAgent)的组件来控制该游戏对象寻找能够通过的路径,并最终到达⽬的地。
⾃动寻路还可以实现绕过障碍、爬上与跳下障碍物、按类别寻找属于⾃⼰的道路、动态设置道路中的障碍等技术。
下⾯⽤⼀个简单的Demo来介绍NavMesh的应⽤:1.在Scene场景中添加Cube设置场景,如图所⽰:2.选择除了主⾓、⽬标以及摄像机、直线光以外的所有物体,在Inspector窗⼝的右上⾓勾选Static,成为静态物体,并设置成Navigation Static静态类型。
3.在主窗⼝中选择[Window]→[Navigation],打开Navigation窗⼝。
该窗⼝⽤于⽣成路径寻找所需要的导航⽹格结构,代理将根据该导航⽹格进⾏寻路计算。
确保勾选了“Navigation Static”。
点击Bake进⾏烘培。
4.选择需要寻路的游戏对象,为它添加⼀个NavMeshAgent组件。
5.编写寻路代码,新建⼀个脚本://寻路⽹格导航using UnityEngine;using System.Collections;public class DemoNavigation : MonoBehaviour{private NavMeshAgent agent; //导航代理public Transform TransHero;// Use this for initializationvoid Start(){agent = this.GetComponent<NavMeshAgent>();if (agent && TransHero){agent.SetDestination(TransHero.transform.position);}}}运⾏结果:这样就实现了NavMesh导航⽹格寻路。
unity⾃带寻路(导航)系统NavMesh导航⽹格本⽂为⼤家分享了unity⾃带寻路(导航)系统的具体代码,供⼤家参考,具体内容如下⼀、介绍unity官⽅⽂档:导航⽹格(即 Navigation Mesh,缩写为 NavMesh)是⼀种数据结构,⽤于描述游戏世界的可⾏⾛表⾯,并允许在游戏世界中寻找从⼀个可⾏⾛位置到另⼀个可⾏⾛位置的路径。
该数据结构是从关卡⼏何体⾃动构建或烘焙的。
我们可以这么理解:它是unity官⽅⾃带的⼀种寻路系统。
我们可以通过它来制作简单的寻路,⽐如可以制作点击某个位置,让⾓⾊⾃动的绕开障碍⾛到⽬标点的效果,⽐如可以制作敌⼈AI,让它可以通过NavMesh绕开障碍追击我⽅单位。
甚⾄可以在NavMesh中设置传送门,跳跃的起点落点,让这些效果也参与寻路的计算,成功计算出导航的捷径。
⼆、简单使⽤介绍简单搭⼀个场景,创建player和target//蓝–Player 红–Target点击window–windows–Navigation在Player⾝上挂载Nav Mesh Agent组件导航⽹格代理 (NavMesh Agent) 组件可帮助您创建在朝⽬标移动时能够彼此避开的⾓⾊。
代理使⽤导航⽹格来推断游戏世界,并知道如何避开彼此以及移动的障碍物。
点击地⾯cube,点击Static旁边⼩箭头,设置为Navigation Static点击Navigation,点击Bake可以看到场景中物体可以移动的敌⽅被烘焙成蓝⾊如果此处未烘焙成功,⾸先检查是否将地⾯设置成Static再看Scene窗⼝Gizmos设置,或许是已经烘焙成功了但是没有显⽰写⼀个简单的脚本挂载在Player⼩球⾝上,告诉它它的⽬标点在哪获取到Agent组件,通过agent.destination设置⽬标点,记得将⽬标点的蓝⾊⽅块拖拽进脚本using UnityEngine;using UnityEngine.AI;public class Player : MonoBehaviour{private NavMeshAgent agent;public Transform target;void Start(){agent = GetComponent<NavMeshAgent>();agent.destination = target.position;}}这样的话就实现了⼀个简单的寻路⼩demo三、功能详细介绍(unity2019.4)导航⽹格代理 (NavMesh Agent)Agent Type 来⾃Navigation,可以设置多个不同的Type。
ue5 代理与寻路组合的使用方式
在Unreal Engine 5(UE5)中,代理(Agents)和寻路(Navigation)是两个重要的功能,它们可以组合使用以实现更复杂的游戏逻辑。
代理是一种智能的实体,它们可以在游戏世界中自主移动和行为。
代理可以由玩家控制,也可以根据预设的规则自动行动。
在UE5中,代理可以由蓝图或C++代码创建和管理。
寻路是UE5中的一个导航系统,它可以帮助代理找到从起点到终点的最短路径。
寻路系统基于网格地图(NavMesh),它是一种在游戏世界中表示可通行区域的特殊数据结构。
代理与寻路组合使用的方式如下:
1. 创建代理:首先,你需要创建一个代理,可以使用蓝图或C++代码来创建代理对象。
代理对象可以包含代理的属性和行为。
2. 创建导航网格:在UE5编辑器中,使用NavMesh工具创建导航网格。
导航网格是一种数据结构,用于表示游戏世界中的可通行区域。
你可以使用NavMesh工具手动绘制导航网格,或者使用AI避障等插件自动生成导航网格。
3. 配置寻路系统:在UE5编辑器中,选择要使用寻路的代理对象,然后在属性检
查器中配置寻路系统。
你可以设置起点和终点,以及代理的移动速度、加速度等参数。
4. 运行游戏:在游戏运行时,代理将根据寻路系统的配置自动计算最短路径,并按照路径移动。
通过将代理与寻路组合使用,你可以实现更复杂的游戏逻辑,例如NPC自动寻路、玩家角色自动寻路等。
同时,你还可以根据需要自定义代理的行为和寻路算法,以适应不同的游戏场景和需求。
navmesh 寻路算法步骤-回复Navmesh寻路算法步骤导言:Navmesh(Navigation Mesh)是游戏开发中常用的寻路算法,它通过将场景网格化来实现寻路效果,其优点是可以处理复杂的场景以及障碍物,使得角色可以在场景中自由移动,提高游戏的可玩性。
本文将详细介绍Navmesh寻路算法的步骤。
1. 场景建模:Navmesh寻路算法需要基于地图的场景建模来进行寻路。
首先需要确定寻路的起点和终点,然后将场景的地形通过网格划分成一系列三角形,这些三角形就构成了Navmesh的基本单位,也称为导航网格。
2. 导航网格生成:根据场景的地形和导航需求,生成导航网格是Navmesh寻路算法的关键步骤。
在该步骤中,需要通过一系列的算法和规则来生成导航网格。
常见的生成方法有:手动生成、自动生成和混合方法。
手动生成方式是通过编辑器手动绘制三角形,然后连接起来形成导航网格。
自动生成方式是通过算法在地图上自动生成导航网格,常用的自动生成算法有Delaunay三角剖分算法、Voronoi图算法等。
混合方法是手动生成和自动生成的组合,即可以通过手动编辑一部分导航网格,然后通过算法自动生成其余部分。
3. 导航网格优化:生成导航网格后,需要进行优化处理,以提高寻路算法的效率和准确性。
常见的导航网格优化方法有:合并小三角形、合并共线三角形、三角化等。
合并小三角形是将面积过小的三角形合并成邻接的大三角形,减少导航网格的复杂度。
合并共线三角形是将共线的三角形合并成一个更大的三角形,以缩小导航网格的规模。
三角化是将导航网格中存在凹多边形的部分进行三角化,以确保寻路算法能够正确处理复杂的几何形状。
4. 寻路图生成:导航网格生成完成后,需要生成一个寻路图,以进行路径搜索。
寻路图主要包括节点和连接关系。
节点是导航网格的基本单位,连接关系表示两个节点之间是否存在通路。
生成寻路图的方式有多种,常见的方法有:A*算法、网格图优化等。
A*算法是一种常见的启发式搜索算法,通过评估启发式函数的值来选择最优的路径。
一、介绍navmesh寻路算法1.1 什么是navmesh1.2 navmesh寻路算法的作用1.3 navmesh寻路算法的应用领域二、navmesh寻路算法的基本原理2.1 基于图的路径规划2.2 navmesh网格的构建2.3 寻路算法的实现三、navmesh寻路算法的步骤3.1 准备工作3.2 寻路起点和终点的指定3.3 寻路算法的执行3.4 路径的优化和平滑四、常用的navmesh寻路算法4.1 A*算法4.2 Dijkstra算法4.3 Floyd-Warshall算法五、navmesh寻路算法的优缺点5.1 优点5.2 缺点六、navmesh寻路算法在游戏开发中的应用6.1 游戏场景中的角色移动6.2 路径规划和本人行为控制6.3 实际应用案例分析七、结语一、介绍navmesh寻路算法1.1 什么是navmeshnavmesh是一种用于游戏开发中角色寻路的网格数据结构,它以三角形网格的形式表示游戏场景中的可行走区域,可以用于快速、高效地进行路径规划和寻路。
1.2 navmesh寻路算法的作用navmesh寻路算法可以帮助游戏中的角色实现智能的移动和路径规划,使游戏中的NPC、玩家角色等能够根据场景的实时变化自动调整移动路径,提升游戏的真实感和趣味性。
1.3 navmesh寻路算法的应用领域navmesh寻路算法广泛应用于游戏开发中,特别是3D游戏中的角色移动、本人行为控制等方面,也被用于虚拟仿真、建筑规划等领域。
二、navmesh寻路算法的基本原理2.1 基于图的路径规划navmesh寻路算法基于图的路径规划原理,将游戏场景中的可行走区域表示为一个有向图,角色的移动路径即为在这个图中的一条最优路径。
2.2 navmesh网格的构建navmesh网格的构建是navmesh寻路算法的基础,它通过对游戏场景中的可行走区域进行采样、三角化等处理,生成一个表示可行走区域的三角形网格。
2.3 寻路算法的实现navmesh寻路算法的核心是寻路算法的实现,常用的寻路算法包括A*算法、Dijkstra算法、Floyd-Warshall算法等,它们通过对navmesh网格进行搜索和路径评估,找到从起点到终点的最短路径。
NAV导航网格寻路介绍WayPoint寻路下图是一个典型的路点寻路另一种方法是使用多边形来记录路径信息,它可以提供更多的信息给ai角色使用。
下图就是一个navigation mesh。
以下列出几个WayPoint的不足之处:1. 一些复杂的游戏地图需要的WayPoint数量过于庞大2. 有时会使角色走“Z”型路径如下图A点和B点之间的路径NAV寻路如下图下图是路点寻路,如黄线,会产生“Z”字形下图为文章开始时展示的地图的比较,红线是wayPoint寻路,兰线是nav。
3. 不能进行动态修正,如果地图中有动态障碍,处理起来会很困难如要实现即时战略游戏中,一辆在路上行走的坦克会挡住你军队的去路,这个移动的坦克就是一个动态障碍。
4. 不能根据角色的特性(不同宽度、高度等)改变路径如一个狭窄的通道,普通的人能够通过,而一辆马车的宽度超过通道宽度,应该不能通过。
5. 不能保存地形的附加信息,如地表高度、地面特征(水面、沙地等)比如一个游戏中的角色在走到沙地上时会降低移动速度,或走在一个斜坡上时人物会发生倾斜等。
寻路方法nav寻路一般包含两部分,首先是使用工具根据地图信息生成寻路用的nav mesh,接下来就是在游戏中根据生成的nav mesh来自动寻路。
一般人首先关心的就是寻路方法,所以这里把顺序颠倒下,先说寻路。
一. 使用A*寻找所经过网格路径下图为一个已经生成nav网格的地图,深红色区域为不可行走区域,浅红色区域为可以行走的区域。
如下图,现在如果要寻找从A点到B点的路径,首先要从所有可行走的网格中找到一条最优的网格路径(图中紫色的网格),然后再根据这些网格生成所需要的路径点。
计算最优网格路径的方法可以使用流行的A*,也可以使用其它方法。
A*算法网上很多就不说了,至于三角网格的A*实现因为涉及网格的数据结构会在系列的最后给出。
二. 生成路径点nav寻路最常用的就是光照射线法了,这个在neoragex2002的blog上有讲,这里就不说了/neoragex2002/archive/2007/09/09/887556.html另一种方法就是拐角点法,如下图下图的5个凸多边形是已经生成的导航网格,多边形外部的区域为不可行走区域,current为起点,goal为终点,从图中就可以看出最短路径为图中红线,蓝色圈出的点为我们需要找出的点。
所有多边形顶点均按逆时针方向存储(这些均在生成导航网格时处理,以后会讲到)。
(1)下图显示出各区域之间的入口,即多边形的临边。
由图中可以看出每个临边均为起点穿出该多边形区域的边,故以下称该边为穿出边。
(2)首先找到起始点所在的多边形和穿出边的两个端点,由起点连接两个端点,形成两个线段lineLeft 和lineRight。
如下图。
绿色圈表示左点,红色表示右点(左点、右点是根据多边形顶点保存顺序而来)。
(3)继续找到下一个穿出边的两个端点,判断新的左点是否在lineLeft 和lineRigh之间,如果在,则更新lineLeft为起点到新左点的线段。
同样处理新穿出边的右点,如下图该步最后得到两个新的线段,如下图。
(4)继续判断下一个穿出边的两个端点,如下图,新的左点在lineLeft和lineRight 的外面,则不更新线段。
下图说明新的右点在两条直线之间,更新lineRight。
该步最后得到两个新的线段,如下图。
(5)继续循环判断下一个穿出边的两个端点,该穿出边的两个端点都在lineRight的右侧,表示lineRight的终点即为路径的一个拐角点。
(6)循环以上步骤都可以找到从起点到终点的一条完整路径。
一些必要的计算几何知识在继续下面的nav网格生成算法之前,先介绍一下涉及到的计算几何知识。
这里只罗列出结论,要详细了解参考相关书籍。
矢量加减法:设二维矢量P = ( x1, y1 ),Q = ( x2 , y2 ),则矢量加法定义为:P + Q = ( x1 + x2 , y1 + y2 ),同样的,矢量减法定义为:P - Q = ( x1 - x2 , y1 - y2 )。
显然有性质P + Q = Q + P,P - Q = - ( Q - P )。
∙矢量叉积设矢量P = ( x1, y1 ),Q = ( x2, y2 ),则矢量叉积定义为由(0,0)、p1、p2和p1+p2所组成的平行四边形的带符号的面积,即:P × Q = x1*y2 - x2*y1,其结果是一个标量。
显然有性质P × Q = - ( Q × P ) 和P × ( - Q ) = - ( P × Q )。
∙折线段的拐向判断:折线段的拐向判断方法可以直接由矢量叉积的性质推出。
对于有公共端点的线段p0p1和p1p2,通过计算(p2 - p0) × (p1 - p0)的符号便可以确定折线段的拐向:若(p2 - p0) × (p1 - p0) > 0,则p0p1在p1点拐向右侧后得到p1p2。
若(p2 - p0) × (p1 - p0) < 0,则p0p1在p1点拐向左侧后得到p1p2。
若(p2 - p0) × (p1 - p0) = 0,则p0、p1、p2三点共线。
∙判断两线段是否相交:我们分两步确定两条线段是否相交:(1)快速排斥试验设以线段P1P2 为对角线的矩形为R,设以线段Q1Q2 为对角线的矩形为T,如果R和T不相交,显然两线段不会相交。
(2)跨立试验如果两线段相交,则两线段必然相互跨立对方。
若P1P2跨立Q1Q2 ,则矢量( P1 - Q1 ) 和( P2 - Q1 )位于矢量( Q2 - Q1 ) 的两侧,即( P1 - Q1 ) × ( Q2 - Q1 ) * ( P2 - Q1 ) × ( Q2 - Q1 ) < 0。
上式可改写成( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) > 0。
当( P1 - Q1 ) × ( Q2 - Q1 ) = 0 时,说明( P1 - Q1 ) 和( Q2 - Q1 )共线,但是因为已经通过快速排斥试验,所以P1 一定在线段Q1Q2上;同理,( Q2 - Q1 ) ×(P2 - Q1 ) = 0 说明P2 一定在线段Q1Q2上。
所以判断P1P2跨立Q1Q2的依据是:( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) >= 0。
同理判断Q1Q2跨立P1P2的依据是:( Q1 - P1 ) × ( P2 - P1 ) * ( P2 - P1 ) × ( Q2 - P1 ) >= 0。
∙凸多边形假设我们在一个多边形上(包括多边形的边界及边界围封的范围)任意取两点并以一条线段连结该两点,如果线段上的每一点均在该多边形上,那么我们便说这个多边形是凸的。
∙凸包给定平面上的一个(有限)点集(即一组点),这个点集的凸包就是包含点集中所有点的最小面积的凸多边形。
∙点在凸多边形中的判断假设多边形是凸的,而且顶点p0,p1,...,pn按顺时针方向排列,则点在多边形任意一边pi-1, pi 的右面。
∙Voronoi图及对偶图∙Delaunay三角剖分(Voronoi对偶图)在实际中运用的最多的三角剖分是Delaunay三角剖分,它是一种特殊的三角剖分。
先从Delaunay边说起:【定义】Delaunay边:假设E中的一条边e(两个端点为a,b),e若满足下列条件,则称之为Delaunay边:存在一个圆经过a,b两点,圆内(注意是圆内,圆上最多三点共圆)不含点集V中任何其他的点,这一特性又称空圆特性。
【定义】Delaunay三角剖分:如果点集V的一个三角剖分T只包含Delaunay 边,那么该三角剖分称为Delaunay三角剖分。
以下是Delaunay剖分所具备的优异特性:1.最接近:以最近临的三点形成三角形,且各线段(三角形的边)皆不相交。
2.唯一性:不论从区域何处开始构建,最终都将得到一致的结果。
3.最优性:任意两个相邻三角形形成的凸四边形的对角线如果可以互换的话,那么两个三角形六个内角中最小的角度不会变大。
4.最规则:如果将三角网中的每个三角形的最小角进行升序排列,则Delaunay三角网的排列得到的数值最大。
5.区域性:新增、删除、移动某一个顶点时只会影响临近的三角形。
6.具有凸多边形的外壳:三角网最外层的边界形成一个凸多边形的外壳。
多边形裁剪Weiler-Athenton算法–主多边形:被裁剪多边形,记为A–裁剪多边形:裁剪窗口,记为B多边形顶点的排列顺序(使多边形区域位于有向边的左侧)外环:逆时针;内环:顺时针主多边形和裁剪多边形把二维平面分成两部分。
内裁剪:A∩B外裁剪:A-B裁剪结果区域的边界由A的部分边界和B的部分边界两部分构成,并且在交点处边界发生交替,即由A的边界转至B的边界,或由B的边界转至A的边界。
如果主多边形与裁剪多边形有交点,则交点成对出现,它们被分为如下两类:进点:主多边形边界由此进入裁剪多边形内如,I1,I3, I5, I7, I9, I11出点:主多边形边界由此离开裁剪多边形区域. 如,I0,I2, I4, I6, I8, I10算法步骤(1)建立空的裁剪结果多边形的顶点表.(2)选取任一没有被跟踪过的交点为始点,将其输出到结果多边形顶点表中.(3)如果该交点为进点,跟踪主多边形边边界;否则跟踪裁剪多边形边界.(4) 跟踪多边形边界,每遇到多边形顶点,将其输出到结果多边形顶点表中,直至遇到新的交点.(5)将该交点输出到结果多边形顶点表中,并通过连接该交点的双向指针改变跟踪方向(如果上一步跟踪的是主多边形边界,现在改为跟踪裁剪多边形边界;如果上一步跟踪裁剪多边形边界,现在改为跟踪主多边形边界).(6)重复(4)、(5)直至回到起点生成nav网格假设上图是一个游戏地图,红色的区域是不可行走的区域,浅灰色区域是可行走区域,要想在游戏中实现nav寻路,必须将可行走区域转化为nav网格并保存为一种固定形式的数据,如下图浅红色的三角形。
nav网格必须是凸多边形,这里使用三角型,当然也可以使用4边形。
下面介绍一种任意多边形的三角化算法。
算法来自论文《平面多边形域的快速约束三角化》作者:曾薇孟祥旭杨承磊杨义军。
详细内容请参考该论文。
先来看几个定义:A. 我们称点p3 为直线p1p2 的可见点,其必须满足下面三个条件:(1)p3 在边p1p2 的右侧(顶点顺序为顺时针);(2)p3 与p1 可见,即p1p3 不与任何一个约束边相交;(3)p3 与p2 可见B. DT点在一个约束Delaunay三角形中,其中与一条边相对的顶点称为该边的DT点。