Panic的小屋

国破山河在,城春草木深。
随笔 - 151, 评论 - 1317, 引用 - 22, 文章 - 0

导航

公告

<2005年7月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

留言簿(269)

随笔分类

随笔档案

文章档案

相册

国外好站推荐

工具网页

我的其他网页

我的网友

户外运动

美女的空间

搜索

最新评论

阅读排行榜

评论排行榜

[翻译]A*分层寻路

Posted on 2005-07-21 18:05 Panic 阅读(7053) 评论(4)  编辑 收藏

A*分层寻路

作者:Patrick Lester 2003年1月9日更新
译者:Panic 2005年7月21日
译者序:很久没有翻译文章了,这次找了这个短一些的。这个文章是偶以前翻译的《A*寻路初探》的补充,介绍了A*更进一步的,更实用的方法。

原文链接:http://www.policyalmanac.org/games/twoTiered.htm
以下是翻译正文:

 

在我的主题A* Pathfinding for Beginners中(译者注:译文 A*寻路初探)中,我概述了A*算法,说明了如何创建一个通用的寻路功能。然而仅创建一个寻路功能,用途是很有限的。
考虑如下的RPG场景,一个剑士想找到绕过旁边墙壁的路:

对于这类地图,你可以用不同的方式,密度来放置节点。在这个例子中,我们使用高密度网格,如下:

在这个图中,白色节点是可通过的。没有节点的地方是不可通过的。这个例子还有一些不同的地方。在这个例子中,你可以“穿越”不可通过区域的拐角。同时,“方格”也不再是方格。因为这是一个投影视角的例子,我们在Y(垂直方向)拥有X(水平方向)两倍的节点。这使得正确的投影路径成为可能。

如你所见,用这么密集的节点网络,我们不仅能寻路绕过旁边的墙壁,还能在墙壁和旁边的桶之间找到路径。我们密集的网格也使得绕过底部不可通过的火把成为可能。这总的说来是精确寻路。

好,在短距离上,那的确很酷,但是如果我们要穿越整个地图进行寻路,该怎么办?使用像这么密的网格,轻易就会让你在一条路径上使用A*的搜索节点的数量达到10,000+。这几乎会让任何PC失去响应。

那么我们来看另一种选择。创建一个低密度的网格,就像下面这样,如何?

在这个例子里,节点在等边菱形的中心。菱形之间通过性的数据沿边界存储在同一个数组中,在图片上用小红点表示。要从一个图素移动到它周围8个图素上,相邻的图素必须是可通过的,并且路径没有被挡住。

这个节点网格的密度是先前的72分之一。原来我们需要面对10,000+的节点,而现在,取而代之的是1/72原来的数量,或者说,少于200个。我们的电脑可以轻易处理这个。穿越地图寻路的问题迎刃而解。

合而为一

那么,我们用哪种方法呢?两者!

在给定的搜索中,你得先在地图范围内,用宏观寻路的方法。然后切换到微观寻路,寻找从当前位置到路径上两个宏观节点以外的路径。每次你进入一个宏观菱形“方格”,你应该用微观寻路算法寻路到两个宏观节点之前。这导致浪费了每次微观寻路的后半截路径,但是你有必要这样做以便路径看起来足够好-并且这也不是很严重的浪费,因为你的微观寻路算法只计算了相关的一小段路径。一旦你到达了距离目标2-3宏观节点的地方,你应该完全切换到微观寻路算法,完成到最终位置的寻路。

用这种方法,你将得到更接近现实的快速穿越地图的寻路以及能穿越角落,木桶等等就像最开始那个微观寻路例子的效果。有够酷,哈!

如果你 真的 有野心,你可以开发3种寻路器,如果你的地图实在太大,一个工作在真正的宏观层次,一个在中间层,一个在微观层。专家已经为像帝国时代(Age of Empires)这样的游戏设计了这些。这仅仅取决于你的需要。

好,就这些了。像以前一样,你可以通过这个联系我:

现在,祝你好运。

译者参考文章:
 A*寻路初探
 在A*寻路中使用二叉堆

Feedback

# A*寻路初探 GameDev.net[TrackBack]

2006-04-09 11:48 by 古生物
A*寻路初探 GameDev.net
古生物引用了该文章,地址:http://blog.csdn.net/gsw365/archive/2006/04/09/656063.aspx

# [翻译]A*寻路初探 GameDev.net [TrackBack]

2006-05-25 12:21 by NorthWind
不错的A*算法!
NorthWind引用了该文章,地址:http://blog.csdn.net/realfei83/archive/2006/05/25/754420.aspx

# re: [翻译]A*分层寻路

2007-10-26 09:39 by norman
说得简单,如果大节点中包含了一些障碍物,你到底算他是障碍呢还是可通过区域,这才是问题关键所在

# A*算法程序之二------A*寻路初探[TrackBack]

2007-10-28 17:24 by Horus
A*寻路初探
Horus引用了该文章,地址:http://blog.csdn.net/aifuture/archive/2007/10/28/1851965.aspx
标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]