游戏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:用于不同分支交换信息
 
 
 