【笔记】寻路技术整合

pathfinding,先用unity navmesh烘培,再用lockstepengine里的工具导出    然后test find 
#游戏地图的划分
Grid (方格)
Navigation Mesh(导航网格)

#寻路算法:
1.a*+堆排序+路径平滑(启发式和代价累计)

2.Dijkstra算法

3.Floyd-Warshall algorithm

4.集群寻路
https://wuzhiwei.net/group-path-movement/  有demo
https://www.zhihu.com/question/20298134/answer/22861904
https://blog.csdn.net/zjq2008wd/article/details/51192765
Flocking Behavior,在对于一大群单位的寻路,计算量是很大的,而且往往会有很多的重复,这些都是可以避免的。
如果单位的移动是利用Steering Behavior [9] 来实现的话,那么就可以为其中一个单位,称之为Leader,计算路径(例如用导航网格),然后其他单位按照以下Flocking原则来移动:
    1. 分离,避开相邻单位
    2. 一致,和整体的移动方向一致,这里应该是Leader的移动方向3. 聚合,向整体的平均位置靠拢这样的话,就可以降低寻路的计算量,并且得到更加真实的群体单位行进效果。
    Steering Behavior:将一个单位考虑成一个受力点,通过增加不同的力,如吸引的,排斥的等等,实现如搜索、逃跑、躲避障碍和Flocking等行为。
    Steering behaviors—避墙avoidance wall    http://blog.sina.com.cn/s/blog_71f1fb370100ycwz.html
AStar和Flocking Behavior结合
    AStar是为了得出一系列的点,然后单位从一个点移动到另一个点。
    而Flocking Behavior可以看作是另外一层,它不知道AStar的存在,只是跟着大队走(还需要躲避障碍物)


5.组
对于不用Steering Behavior的一大群单位,
可以将他们设为一个组,计算这个组的路径(并且要考虑到这个组的半径以便通过转角位),
然后给每个单位offset一个适当的距离,

6.分块寻路。将地图分成多个Chunk,在chunk上设置门,先在多个chunk之间找到chunk之间的通路,再在每个chunk的范围内寻路
在规模宏大的地图中,为了进一步提高寻路速度,可以在编辑地图时将一些节点处理成一个Chunk,它有入口和出口,并且不同Chunk之间需要连接起来。从A点移动到B点,首先先在Chunk之间做寻路,得到一系列的Chunk,在Chunk 1的时候只需要在Chunk 1中寻路,去到Chunk 2的时候就只在Chunk 2中寻路。它本质上是将地图分为两种维度,一种是粗略的Chunk,一种是Chunk里面的节点(可以是方块,路径点,导航网格),并分开进行处理。有种空间分割(Space Partition)的味道在里面。

7.JPS算法

8.Flow Field PathFinding(场寻路算法)
http://leifnode.com/2013/12/flow-field-pathfinding/

8.Machine learning机器学习’,‘Deep learning深度学习’,‘Artificial Neural Network神经网络’

9.A* Pathfinding Project 3.1.4    
动态避障
https://blog.csdn.net/Kathy_unity/article/details/81211208
unity新版本nav
https://blog.csdn.net/weixin_33841503/article/details/85921626

10.避障机制(VO与RVO算法,RVO2)
https://zhuanlan.zhihu.com/p/88155091
    VO与RVO算法的理解:一个是相对运动的概念,一个是相对大小的概念。这里打2个比方,第一个比方就是生活中如果B相对A运动,那其实站在B的角度也可以看做A相对应B运动,第二个比方就是,如果足球半径变小了,球门只需要缩小足球半径缩小的部分,那你原本踢不进去的球就还是不能踢进去。
    有两个前提,再说VO,就可以推导出把A的半径缩到0,B扩大A的半径以后以A做顶点,扩大后的B作为截面,就可以算出在一个圆锥体内的速度是都会碰撞的,然后把B的速度加给A,A以这个速度为基准进行调整,这个圆锥体就是VO的范围。
    然后RVO的概念就是假设双方都是同时计算避障的,那只需要偏移一半的角度就可以了,所以把VO算出来的偏移量和原始速度加起来取一个平均值,就是可以得到的最小避障角度。【类似实时碰撞中球和球碰撞可简化为点和球碰撞】

11.大兵团会战中的AI寻路模块
https://zhuanlan.zhihu.com/p/88155091
大兵团战斗寻路一般分两块,一块叫大寻路,一块叫小寻路。
大寻路就是战斗队伍解散前,大量个体作为一个集团进行大范围长线路的战场移动,这个时候一般会保持队形,所有个体使用相同的移动命令,个体如果在静态的navmesh上移动,一般就是VO加A星算法,就可以解决问题了。
小寻路就是战斗接触发生后,战斗队伍解散,个体作为一个集群开始往前运动,这个时候个体一般需要遵循集群运动理论。
在大量单位模拟同类操作的过程中,可以用Flow Field PathFinding算法来解决大量单位带来的寻路消耗(Dijkstra算法预先生成代价表,之后用查表寻路)
集群运动理论,参考的是 http://www.red3d.com/cwr/boids/ 这篇论文。下面一句话总结一下这篇论文的内容:一个集群在向目标移动的过程中,其中单个个体一般遵循三个运动规律:1.同向性。2.向心性。3.避堵性。下面我们来一个个详细说明这3个概念。
在详细说明这三个概念前,我们还要明确一些前提,在一个大型群体中,单独的个体只能感知到附近区块的属性,不能感知到整个群体的属性。单个个体只关心距离他最近的目标位置,不会去关注其他更远的目标位置。单个个体运动过程中,如果发现前方有障碍,优先避障。
同向性
同一个区块中的个体,会倾向于向同一个方向前进,如果单个个体的方向和群体的平均方向不一致,单个个体会向群体方向去修正自己当前的方向。
向心性
单个个体总是趋向于移动到当前区块最中心的位置(当前集群的平均位置)去。
避堵性
单个个体总是趋向于移动以降低拥挤度,这条和上一条其实是个逆向的过程。其实很好理解,如果没有这条,那所有的个体就挤到一堆去了,这条保证了群体移动的时候的稀疏性。
计算的时候一般就是首先用一个数据结构把当前所有个体分到一个个区块中去,然后计算每个区块中的一些需要的值缓存起来,然后再根据这些缓存的值更新当前每个个体的速度,位置,朝向等信息。每个AI逻辑帧算一次即可。

寻路后的路径平滑,采用漏斗算法

12.jps各个版本的效率对比
游戏场景使得起点和终点差距200个格子,寻路104次。结果:<

你可能感兴趣的:(笔记)