RTS核心技术:流场寻路详解(Flow Field Pathfinding)
RTS里面经常会有很多角色,群体一起寻路到目的地附近,这种寻路是如何实现的,今天给大家详细的讲解基于流场寻路的算法。在本教程中,我将解释向量场寻路及其相对于Dijkstra等传统寻路算法的优势。对Dijkstra算法和势场的基本理解将有助于理解本文,但不是必需的。
寻路的问题有很多种解决方案,如AStar等, 每种寻路的方案都各有优缺点,大部分的寻路,都是角色要从A点走到B点,然后调用寻路算法找出一条路径出来。通常情况下这样是不会有问题的,但是对于像RTS这种游戏需要做群体寻路,从A点到B点一群角色走过去,如果每个角色都单独寻路,这样性能开销会比较大,所以今天我们为了解决这个问题,介绍基于流场向量的寻路。它的原理是把目标点的流场计算出来,所有移动的目标共用这个流量场。接下来本文讲详细的介绍流场寻路的核心技术与步骤。(本文是将地图基于网格来讲解的,你也可以用到其它的地方,不限于网格)。
基于流场寻路的算法的主要步骤
基于流场寻路的算法主要包含以下三个步骤:
(1) 遍历游戏地图种的每个块,计算出来当前块到目标的距离,称为"Heatmap"热度图;
(2) 为每个地图块,根据Heatmap生成一个向量场,指定了每个块到目标的方向 称为"Vector Field";
(3) 到目的地的每个角色,都共用这个向量场来移动导航到目标点;
生成Heatmap
Heatmap 是指从目标点到地图上每个图块的路径距离。路径距离不同于欧几里德距离,它是通过可穿越地形的最短的两点之间距离来计算。如下图,你可以看到从目标点(用红色标记)到地图任意的点(用粉色标记)的路径距离和线性距离之间的差异。不可行走的块以绿色绘制。如图,路径距离(以黄色显示)为9,而线性距离(以浅蓝色显示)约为4.12。每个图块左上角的数字显示由Heatmap生成算法计算出的到目标的路径距离。注意两点之间可能有一个以上的路径距离, 我们只算最短的那个距离。经过算法第一步,我们把地图上的每个块到目的地的最短距离都计算了出来,生成了Heatmap。
Heatmap生成算法是一种 wavefront 算法。它从值为0的目标开始,然后向外流动以填充整个可遍历区域。 wavefront 算法有两个步骤:
(1)从目标开始,并用0的路径距离标记它。
(2)获取每个标记的图块的未标记邻居,并用前一个图块的路径距离+1标记它们。
(3) 标记完所有地图的块后,算法结束。
注: wavefront 算法是在网格上执行广度优先搜索,并存储沿途到达每个块所需的步骤。这种算法有时也称为brushfire算法。
Vector Field 生成
现在已经计算了从每个块到目标的路径距离,我们可以很容易地确定接近目标需要采取的路径。通常计算一次Vector Filed,然后让所有要寻路的对象在运行时引用该Vector Filed。
Vector Field 简单地存储了一个向量,该向量指向每个地图块走向目的地的方向(朝向目标)。这里是向量场的可视化,向量从图块的中心沿着最短路径指向目标,形成了一个流场。(红色为原点,白色的线为方向,大体趋势都指向目标点)。
这个向量场里面的每个向量,是通过Heatmap计算出来的,具体的计算Vector向量方式如下:
Vector.x = left_tile.distance - right_tile.distance, 向量x为左边的块-右边的块;
Vector.y = up_tile.distance - down_tile.distance,向量y为上边的块-下面的块;
每个块的distance,就是上面Heatmap种计算出来的数值。
如果当前块的(左/右/上/下)不可行走(障碍物等),则使用与当前块的距离来代替缺少的值。一旦粗略计算了路径向量,就对其进行归一化,以避免以后出现不一致。
角色移动导航
现在矢量场已经计算出来了,计算探路者的运动就很容易了。假设vector_field(x,y)返回我们之前在tile(x,y)处计算的向量,并且移动速度大小一直,则计算tile(x,y)处移动速度的伪代码如下所示:
velocity_vector = vector_field(x, y) * desired_velocity
当我们导航的时候,只要沿着向量方向移动就可以了,很容易就实现了流场移动, 同时多个角色目标寻路的时候,只要计算一次。
如上图,紫色的点,水平不可以移动,上下两个块的距离都是一样的,这样就导致了不唯一性,一半这种情况,我们会随机选着一个方向,这样导致的结果可能就是我们选择的路径不一定是最短的,所以流场寻路又是基于局部最优解的。要解决这样的问题,还有一个好的方法,就是把块分小,降低这样的几率。
当然把块分小,计算量也会增大。
这边有个游戏开发学习交流小组大家可以一起来学习交流
好今天的流场寻路的内容就分享到这里了,我这边实现了一个C++版本的流场寻路的代码,大家可以参考一下,需要的可以关注我们,备注“csdn流场寻路”即可获得寻路代码。
RTS核心技术:流场寻路详解(Flow Field Pathfinding)相关推荐
- 游戏中的人工智能之流场寻路
流场简介 流场,一般为网格图,网格中的每一个节点包含一个向量,该向量是物体在该位置时期望的速度. 流场寻路 利用流场的速度信息指导大量物体同时进行寻路.换句话说,如何生成可以寻路的流场,才是问题的关键 ...
- Java stream流式计算详解
Java stream流式计算详解 1. Stream概述 1.1 Stream简介 1.2 Stream分类 2. Stream操作 2.1 Stream创建 2.2 Stream无状态操作 2.3 ...
- moba寻路_游戏中的人工智能之流场寻路
流场简介 流场,一般为网格图,网格中的每一个节点包含一个向量,该向量是物体在该位置时期望的速度. 流场寻路 利用流场的速度信息指导大量物体同时进行寻路.换句话说,如何生成可以寻路的流场,才是问题的关键 ...
- 微商八大途径吸粉、引流客源技巧详解!
微商八大途径吸粉.引流客源技巧详解! 2017年之后,微商在这个互联网黄金时代的背景下,正在继续发展壮大,从事微商的创业小伙伴们也越来越多.不过许多刚开始进入微商这一领域的小伙伴们都会有吸粉和引流方面 ...
- java IO流基础 万字详解(从拷贝文件到模拟上传头像)
目录 一.前言: 二.IO流简介: 1.什么是IO流? 2.IO流能干什么? 3.IO流的分类: 4.IO流体系: 三.字符流读写文件: 1.普通字符流读取文件: 前言: ①以单个字符读取: 代码演示 ...
- 性能百万/s:腾讯轻量级全局流控方案详解
作者:莫家文,腾讯事务型开发工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 原文链接:http://wetest.qq.com/lab/view/320.html WeTest ...
- 性能百万/s:腾讯轻量级全局流控方案详解【转自Wetest】
阿里用的方案是在nginx中配置限流(限流功能模块是自己开发的),流量统计线上是有监控打通的,具体的限流值是通过线上流量表现+线下性能测试(模拟线上场景)测试得出的. 全新的全局流控实现方案,既解决了 ...
- flink大数据处理流式计算详解
flink大数据处理 文章目录 flink大数据处理 二.WebUI可视化界面(测试用) 三.Flink部署 3.1 JobManager 3.2 TaskManager 3.3 并行度的调整配置 3 ...
- TS流PAT/PMT详解
原文 :http://www.cnblogs.com/shakin/p/3714848.html 一 从TS流开始 从MPEG-2到DVB,看着看着突然就出现了一大堆表格,什么PAT.PMT.CAT- ...
最新文章
- python 删除 csv 文件的行
- I am the load of my word
- HTML语言:经典笔记(ZT)
- 解决iptables和vsftpd设置的问题
- C#静态构造函数总结
- Dojo 如何测试 widget 1
- Leetcode 102. 二叉树的层次遍历
- Linux课题实践一
- am335x 电容屏驱动添加。
- Wpf之无法获取鼠标点击事件
- 打造Vim作为前端IDE
- windows平台下CMDER的安装和配置
- 格式化Json字符串工具-HiJson
- php市场调查问卷模板,市场调查问卷范文
- SPSS作业-如何判别是否服从正态分布
- 织梦屏蔽广告法极限词和敏感词插件【防职业举报者恶意投诉被工商部门天价罚款】
- 送货记账软件网络版怎么用
- 【无标题】60秒倒计时
- good man or bad man?
- 3.2.1 LinearLayout(线性布局)