流场,通常为网格图,网格中的每个节点包含一个向量,该向量是物体在该位置时指望的速度。html
利用流场的速度信息指导大量物体同时进行寻路。换句话说,如何生成能够寻路的流场,才是问题的关键。git
这里有一篇英文的文章和一个示例[3],阅读文章有助理解流场寻路,英文不够好的同窗也能够从例子中获取感性的认识。
流场寻路
在线示例github
流场的简单生成:算法
流场根据迪杰斯特拉图生成的,而迪杰斯特拉图是依据众多智能移动体共同目的地以及节点运动消耗图生成。编程
节点运动消耗图,用0表示可正常经过,用极大值表示障碍物,用其余值表示河水,沼泽,斜坡,树林等地形信息。浏览器
首先,须要依据节点运动消耗图以及众多智能移动体共同目的地生成迪杰斯特拉图。缓存
迪杰斯特拉图中的每一节点包含其距离目的地节点的最少运动消耗。性能
细节就是以目的地为起点进行迪杰斯特拉算法搜索到图中其余全部节点的最短运动消耗,其余非目的地节点保存这到目的节点的最短运动消耗。优化
什么迪杰斯特拉算法,请参看。
迪杰斯特拉算法人工智能
须要注意的是,本文中的例子生成的迪杰斯特拉图,其实使用广度优先算法生成的,这是由于边权值所有为1(路径消耗均为1)。
其次,依据迪解释特拉图生成流场。流场每个节点包含一个指向某个邻居节点的向量,而且该向量所指向的邻居节点,在全部邻居节点中其距离目的路径消耗最少。而向量的大小能够为移动智能体的最大速率,或者单位化。
当位于流场某一位置时,如何选取对应的速度向量,可使用简单的归整法获取速度向量。 也能够采用双线性内插法依据上下左右其余四个节点值来计算[1]。
什么是线性内插?请参看线性内插
流场的生成的速度向量不必定彻底最佳,可使用一些修正算法,好比视线修正法[2],来适当的调节速度向量的方向或者无视流场给出的方向。
流场能够和其余行为结合起来,实现更复杂的组合操控行为。例如,流场+群聚(分离,汇集,对齐)。这一点在Game AI Pro - Efficient Crowd Simulation for Mobile Games给出了具体的实现思路。
“最高指挥官2”和“坚守阵地2”这两款游戏确定是用了流场寻路。最近比较火的“皇室战争”也可能使用流场寻路(固然我猜的)。其实,流场寻路适合两种类型的游戏RTS和MOBA(即时战略和塔防),说白了最适合大量智能运动物体拥有共同目的地寻路。
你们能够轻易的发现,HowToRTS例子有不少明显的问题,我在研究时作了一些优化。包括以下内容:
用浏览器就能够下载HowToRTS示例代码,我建议你们自动动手改一改玩一玩。
参考文献:
[1]Graham Pentheny,Game AI Pro : Efficient Crowd Simulation for Mobile Games
[2]Elijah Emerson,Game AI Pro :Crowd Pathfinding and Steering Using Flow Field Tiles
[3]https://howtorts.github.io/2014/01/04/basic-flow-fields.html
[4]Mat Buckland,游戏人工智能编程案例精粹
[5]Daniel Shiffman,代码本色-用编程模拟天然
[6]http://aigamedev.com/open/tutorial/theta-star-any-angle-paths/
后记
早年的一些RTS,好比红色警惕,帝国时代2,星际争霸都被寻路的性能问题各类折磨。
帝国时代2的农民,反应延迟很是严重(一个接一个的寻路)。
星际争霸一队只有12个单位(同时寻路,但没法支持更多单位同时寻路)。
红色警惕2部队多了直接死机。流场寻路专治RTS寻路各类不服。
原创文章,谢绝转载。