游戏AI
navigation(导航系统)
地图的表达形式, 寻路,路径优化
Map representation:
1.可行走区域(物理碰撞,跳跃距离,攀爬高度)
2.表达形式:waypoint networks(路点网络图),grid(网格),navigation mesh(寻路网格),sparse voxel octree(八叉树)
Waypoint Networks:
设置关键点,在关键点之间通过算法插值一些过路点,过路点插值往两边扩散(因为可行走区域并非一条线)。
任务一条路径,从起点开始,寻找路网中最近的点,在走到离终点最近的点(类似地铁)
寻路只能发生在路点和路点之间,在计算机中表示为一张连通图。点的密度可以代表寻路精度
优点:
1.易实现
2.内存和计算机开销低(路点寻路只是使用到了真是可行走区域的一小部分,与格子相比,牺牲了路线的灵活性,换取交第的内存和计算机开销,只要两个点之间是连通的,那么角色就可以按照点所在的位置到达目标点的位置)
缺点:
1.需要手动插值,不灵活
2.并且表现上npc路径相比于较宽的可行走区域往往是走中间
Grid
优点:
1.易实现
2.容易动态修改
缺点:
1.内存和计算机开销大
2.不适用3d地图。例如桥上桥下都能行走
3.需要额外的平滑处理,角色行走路线可能出现多个90度的拐角
Navigation Mesh
划分必须要凸多边形,不能凹多边形。否则穿过polygon时,可能走到该polyhon之外的区域。并且形成多边形走廊时,穿过的每个凸多边形之间有且只有一条公共边portal
优点:
1.支持3d可行走区域
2.灵活性高
3.可动态修改
4.内存和计算机开销小,一个polygon可能就能全表达一大片可行走区域
5.寻路效率高
缺点:
1.生成非常复杂
2.不支持3d空间(例如空战游戏)
Sparse Voxel Octree
对空间进行八叉树划分,把所有可通行区域用八叉树结构表示。如果区域是整个联通的,用一个很大的Voxel表达,如果是一个边界,则不断地细分
所有的地图表达形式,连接关系都是形成一个图。最终在图上寻找路径
dfs:时间换空间
bfs:空间换时间
dfs和bfs没有办法计算加权最短路径。并且很多时候会找出许多没必要的路径
迪杰斯特拉算法找的一定是最短路径
a星算法相对迪杰斯特拉算法增加了启发函数。当走到一个点时,不仅考虑过去花费的路径成本,还会猜想从当前位置到目标点所需距离。
在选择explored点时,优先选择现在已走过的距离加上预计要走的距离中最近的点,来优先搜索。
并且只要达到目标点,不需要将目标点explored,就停止搜索。
Steering
根据目标位置确定加速度
通过积分反向推导加速度
计算角速度的加速度
Crowd Simulation
Microscopic Models 微观模型
定义每一个的行为,然后合在一起就行了
Macroscopic Models 宏观模型
宏观定义大的运动趋势,每个个体按照这个运动即可
Mesoscopic Models 中观模型
上面两种的混合,可以定义更加复杂的情况
Separation
如果一条鱼离我太近了,我就分开
Cohesion
如果鱼群离我太远了,我就接近
Alignment
和鱼群方向保持一致
微观的结果是不可控的,且不受人影响
定义行走的轨迹,然后生成zone graph
主要表达有规则的行为,比如人类人群行为
把群体分成一个个小族群,小族群受到一个大的指向控制,每个小个体自己的行为仍走微观模型的方向。例如rts寻路
避免碰撞:
两个物体太近时,产生斥力,太远时,产生吸力
对所有的障碍物加距离场,当物体里离障碍物越来越近时,距离场的值越来越小,产生的反向斥力越来越大,然后给个大致的方向。群体便会模拟真实的行为
速度障碍法生成碰撞检测
VO:两个物体运动时,一个物体会在另一个物体的速度域上产生一个障碍,如果我在当前速度上会和障碍形成碰撞,则调整速度
RVO:双方都让
ORCA:整体判断
Sensing
Navigation Data寻路数据
Tactical Map战术地图,也就是战术价值很高的点
Smart Object 指的是AI可以交互的物体, 如可以破坏的墙,梯子等
Cover Point掩护点
Influence Map 热力图 对于战场态势的感知
Sight Area 指的是AI的可见区域
引擎端通常开放:
1.sensing精度的选择
2.sensing结果的共享
FSM (有限状态机)和 BT(行为树) 都是Forward 算法,走一步算一步。
Backward的算法:以目标为驱动的反向算法
Hierarchical Tasks Network HTN 任务层次网络
Goal Oriented Action Planning 基于目标驱动行为规划
Monte Carlo Tress Search 蒙特卡洛搜索树
Deep Learning 深度学
当state非常多时,每个state间的设定会非常复杂
层级有限状态机
一种缓冲之举,增加了可读性的同时方便管理。但是子state不好添加额外条件或者飞线,所以反应速度比较慢
状态机是对AI逻辑的抽象。整个世界AI的逻辑就是在状态里来回切换
分为条件判断节点和动作执行节点
动作节点会返回成功,失败和运行中
Sequence:顺序执行。当走到该条件时,要依次把子树全部执行一遍。如果有任何一个子树返回running时,sequence节点被访问时也是返回running
Selector:根据条件去尝试所有的子节点,优先执行在前面的子节点。前面的子节点成功了,Selector节点也执行成功。
Paraller:并行执行
每次需要从根节点开始Tick,是BT效率低的地方,同时Running的节点会不止一个。
并且Running的节点需要有被打断的能力。
BT每次Tick的成本很高,所以有些引擎通过添加Event来激活部分或者整个Tree达到效率优化的效果,缺点是设计师必须要非常清楚自己在做什么,否则非常容易出Bug
Decorator,优化行为树
Precondition 装饰器,对BT优化
Blackboard:用于不同分支交换信息