quake aas初探
aas这块数据,从代码上来看,就是用于机器人寻路的。
quake根据bsp树来生成aas
这里简要说明一下bsp树,简单的说,就是利用场景中的每一个面,对空间进行分割(area)。
quake会计算每个空间的连勇性,这样就得到了cluster,每个相连通的area处在同一个cluster里
一般来说,一个场景只有一个cluster
如果存在不连通的情况,说明场景里有port(这个port不是bsp分割中的port概念,而是关卡设计师设计的传送点,门等)
从代码上看是这样。
我们先不考虑有不连通的情况,即假设场景中所有area都是连通的,整个场景只有一个cluster.
再来看quake的机器人自动寻路算法.
首先是机器人要能看到玩家, 有一个AINode_Seek_LTG函数,就是用来确定机器人要走到哪儿goal
确定的方法很简单,机器人是否能"看到"玩家,即机器人与玩家之前,进行一个碰撞检测调用(trace函数)
得到玩家的位置后,就是goal,当时也可以以其它方式确定goal,
goal就是目标坐标所在的area
确定了移动的目标坐标,就开始计算移动到目标area的最佳路径
在bspc这个程序中,quake会预先生成area的连通数据(前面说过了基于bsp)
机器人所在的位置orig(是一个area),遍历该area的reachability(也是一个area),计算该reachability与goal之间的最小距离
(其实代码中是计算时间,每种地形会有一个时间加权,这里简单描述,就认为地形加权都是一样的,时间就是距离)
quake会缓存route,何谓route,也就是某个cluster中的某个area到该cluster中其它area所花的时间.
因为有一定的计算量,所以要保存每次计算结果.
所以,在路之前,先把goal的route数据计算出来并缓存,这样就得到goal与当前cluster中所有area的距离(我们假设只有一个cluster)
再回到机器人处于位置orig area的reachability area,取到goal最小的距离的那个reachability.
作为机器人移动的依据。
goal不变的情况下,第二次寻路就可以直接用缓存中的数据了。
现在再来看场景中有两个cluster的情况,
这种情况下,如果goal与orig不在同一个cluster,自然先移动到port,原理其实一样,相当于插入一些过渡性的goal.
基于bsp的渲染与碰撞检测,以及aas 雷神引擎的三个重要的元素