[转][翻译]A*分层寻路

http://blog.vckbase.com/panic/archive/2005/07/21/9906.html 转自

作者: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)这样的游戏设计了这些。这仅仅取决于你的需要。 

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

现在,祝你好运。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值