最近调研SLG2.0的战斗原型(即大兵团会战)中的AI寻路模块,经过一周左右的资料阅读与代码学习,大概有了一些心得体会,这里简单写一下。我们说的这种大兵团战斗寻路一般分两块,一块叫大寻路,一块叫小寻路。大寻路就是战斗队伍解散前,大量个体作为一个集团进行大范围长线路的战场移动,这个时候一般会保持队形,所有个体使用相同的移动命令,个体如果在静态的navmesh上移动,一般就是VO加A星算法,就可以解决问题了。
小寻路就是战斗接触发生后,战斗队伍解散,个体作为一个集群开始往前运动,这个时候个体一般需要遵循集群运动理论。
集群运动理论
这里的集群运动理论,参考的是 http://www.red3d.com/cwr/boids/ 这篇论文。下面一句话总结一下这篇论文的内容:一个集群在向目标移动的过程中,其中单个个体一般遵循三个运动规律:1.同向性。2.向心性。3.避堵性。下面我们来一个个详细说明这3个概念。在详细说明这三个概念前,我们还要明确一些前提,在一个大型群体中,单独的个体只能感知到附近区块的属性,不能感知到整个群体的属性。单个个体只关心距离他最近的目标位置,不会去关注其他更远的目标位置。单个个体运动过程中,如果发现前方有障碍,优先避障。
同向性
同一个区块中的个体,会倾向于向同一个方向前进,如果单个个体的方向和群体的平均方向不一致,单个个体会向群体方向去修正自己当前的方向。
向心性
单个个体总是趋向于移动到当前区块最中心的位置(当前集群的平均位置)去。
避堵性
单个个体总是趋向于移动以降低拥挤度,这条和上一条其实是个逆向的过程。其实很好理解,如果没有这条,那所有的个体就挤到一堆去了,这条保证了群体移动的时候的稀疏性。
计算的时候一般就是首先用一个数据结构把当前所有个体分到一个个区块中去,然后计算每个区块中的一些需要的值缓存起来,然后再根据这些缓存的值更新当前每个个体的速度,位置,朝向等信息。每个AI逻辑帧算一次即可。
避障机制(VO与RVO算法)
说起避障机制其实最常见的理论就是http://gamma.cs.unc.edu/RVO/ 上面的一些论文,这些论文要解决的问题就是2个相对运动的球体,需要怎么调整速度才能避免相撞。
还是简述一下,我对这个东西的理解,其实抽象的过程说起来也很简单。一个是相对运动的概念,一个是相对大小的概念。这里打2个比方,第一个比方就是生活中如果B相对A运动,那其实站在B的角度也可以看做A相对应B运动,第二个比方就是,如果足球半径变小了,球门只需要缩小足球半径缩小的部分,那你原本踢不进去的球就还是不能踢进去。有两个前提,再说VO,就可以推导出把A的半径缩到0,B扩大A的半径以后以A做顶点,扩大后的B作为截面,就可以算出在一个圆锥体内的速度是都会碰撞的,然后把B的速度加给A,A以这个速度为基准进行调整,这个圆锥体就是VO的范围。然后RVO的概念就是假设双方都是同时计算避障的,那只需要偏移一半的角度就可以了,所以把VO算出来的偏移量和原始速度加起来取一个平均值,就是可以得到的最小避障角度。这个概念反正就是比较晦涩,理解起来比较烦。具体的数学证明和代码我就不贴了,这里贴一个中文的 https://www.jianshu.com/p/8fc4e90e3850 英文不好的可以看一下。
今天就先聊到这里,后面是不是还要继续写,主要看心情。