如何在运行时的动态环境中生成二维导航网格?


9

因此,我已经掌握了如何使用A *进行路径查找,并且能够在网格上使用它。但是,我的游戏世界很大,我有很多敌人向玩家移动,而玩家是移动的目标,因此网格系统对于寻路太慢。我需要通过使用导航网格来简化节点图。

我掌握了网格“如何工作”的概念(通过顶点和/或多边形边缘中心找到一条路径)。

我的游戏使用在运行时程序性生成的动态障碍。

我不太了解如何拍摄一个有多个障碍物的飞机,并以编程方式将可步行区域划分为用于导航网格的多边形,如下图所示。

导航网格

我从哪里开始?我怎么知道何时已经定义了一个可行走区域,或更糟糕的是,当我意识到我需要在算法“遍历”地图时细分一个先前定义的可行走区域时?

如果有问题,我正在nodejs中使用javascript。


1
您尝试实现的动态分区将取决于地图元素的具体情况。如示例所示,障碍物元素是否完全由网格对齐的矩形组成?旋转矩形?不规则的多边形?还是具有很多曲线的非多边形形状?您是否有障碍物形状的点/多边形数据?如果是的话,形状数据是按照三角形,矩形,仅是凸多边形还是凸多边形和凹多边形的混合形式?
马修·R

@Matthew我的世界是由凸多边形障碍,无曲线和无凹多边形组成的。每个障碍都存储为多边形对象,其顶点由矢量对象表示。
Stephen

1
对于它的价值,我正在研究基于本文的解决方案: gradworks.umi.com/3493710.pdf如果成功,我将发布我的解决方案。
斯蒂芬

1
导航网格并没有100%告诉您是否可以去某个地方,它只是可步行区域的基本轮廓,您仍然必须对动态对象进行碰撞检查,编辑:雷说的
差不多

@Stephen-请参阅长评论答案。
马修·R

Answers:


3

@Stephen - 长注释 -这纸看起来像它可能是值得一读时,我有一段时间了。基本上,我所建议的是与论文中提到的Hertel-Mehlhorn算法类似的东西(有关此特定算法的参考信息,请参见http://www.bringyou.to/compgeom/)。将地图边(游戏区域的外部边界)细分一些时间以减少在拐角处形成的多个小三角形的出现。这些小三角形可能会成问题,因为它们最终会比您正在执行寻路的对象小。如果您对三角剖分感兴趣的话,Hertel-Mehlhorn用于减少由三角形分区产生的多边形。http://www.personal.kent.edu/~rmuhamma/Compgeometry/MyCG/PolyPart/polyPartition.htm

另外,如果您不想重新发明轮子,我想这个库实际上可以满足您的所有需求:http : //code.google.com/p/polypartition/。它使用包括Hertel-Mehlhorn在内的许多不同选项之一执行三角剖分和归约。这是MIT许可证,这意味着如果有问题,它可以用于封闭源代码和商业项目。

如果您决定继续进行自己的实现,那么我很乐意看到您的想法。


1
好答案,@马修。而且您绝对应该阅读该论文!易于理解并说明了一项出色的技术(尤其是附录A,其中讨论了基于Agent的网格发现/生成)。我正在为javascript编写此算法的版本,并且进展顺利。完成后,我将其发布为答案。
Stephen

@Stephen希望看到这项工作
kevzettler 2014年

@Stephen我也在寻找JavaScript版本
Apolo

6

您可能只考虑分层A *方法,而不是网格。网格的最大优势在于处理未与网格对齐的游戏世界,而不是降低网格的复杂性。

使用分层方法,您可以重复地细分世界(很像四叉树),并在节点之间生成连接信息。然后,您可以快速生成世界大块之间的路径,而仅使用高分辨率网格在较大块内进行路径查找。

分层方法将使性能提高几个数量级,而网格最多只会给您带来小的线性改进。

天真的方法是将您的世界分成X个X个较大的网格对齐块,在它们之间生成连通性信息(例如,从2x1块到3x1到2x2之间是否存在一条路径,并且平均路径的距离是多少) 。

请注意,在某些特定情况下,使用这种方法可能并不总是可以获得理想的路径。生成可变大小的块层可以缓解该问题,但老实说,通常通常更容易避免问题路径的不断制造,并依靠玩家极不可能注意到任何敌人采取次优路径的事实,最简陋的案例。


1
我应该进一步解释:我的游戏不是网格对齐的。我在800 x 600像素区域中构建一个网格,每个像素是网格上的一个空间(我仍在计算A *,因此我尚未考虑这种性能)。我遇到的障碍并不像上述示例中的障碍那么简单,我只是想说明问题。显然,这种比赛环境需要修改,经过一些研究,我认为导航网是正确的方法。
Stephen

3

我认为您可能使这个问题变得过于复杂。您可能不需要即时生成导航网格物体。而是为您的基本世界提供一个静态导航网格。

可以使用转向行为(使用躲避障碍物)解决绕过障碍物的路径。如果您的障碍很大,可能会填满或完全阻止从一个导航多边形到下一个导航多边形的行程,那么可以采取某种方法检查这种极端情况,并重新计算您当前所在的多边形和导航多边形之间的路径。您被阻止的一种。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.