GAMES104:16 游戏引擎的玩法系统:基础AI-学习笔记

文章目录

  • 一,寻路/导航系统Navigation
    • 1.1 Walkable Area
      • 1.1.1 Waypoint Network
      • 1.1.2 Grid
      • 1.1.3 Navigation Mesh
      • 1.1.4 Sparse Voxel Octree
    • 1.2 Path Finding
      • 1.2.1 Dijkstra Algorithm迪杰斯特拉算法
      • 1.2.2 A Star(A*算法)
    • 1.3 Path Smoothing
  • 二,Steering系统
  • 三,Crowd Simulation群体模拟
    • 3.1 群体模拟模型
      • 3.1.1 微观方法:基于规则的模型
      • 3.1.2 宏观方法
      • 3.1.3 综合方法
    • 3.2 避免碰撞
      • 3.2.1 基于力的模型
      • 3.2.1 基于速度的模型--速度障碍法
  • 四,Sensing环境感知
  • 五,经典决策算法
    • 5.1 有限状态机(Finite State Machine)
      • 5.1.1 层次有限状态机(HFSM)
    • 5.2 行为树(Behavior Tree)
      • 5.2.1 可执行结点
      • 5.2.2 控制结点
      • 5.2.3 黑板(Blackboard)
  • QA

AI分为16、17两节课讲,大纲如下:
在这里插入图片描述


一,寻路/导航系统Navigation

  • 基本思路:
    在这里插入图片描述

1.1 Walkable Area

需要让ai知道哪些部分可以通过(包含走路、跳、翻越攀爬、载具可过等不同情况,还要考虑物理碰撞)。

其表达方式有Waypoint Network、Grid、Navigation Mesh、Sparse Voxel Octree(空间八叉树)等。每种方式都尤其优缺点,因此游戏经常使用多种方式结合。

1.1.1 Waypoint Network

早期游戏引擎用的多,通过设置道路关键点(如道路两边)并用算法插值关键点得到路网,寻路时先找到距离当前位置和目标位置最近的路网点,再通过路网连通(就像坐地铁一样),如下图:
在这里插入图片描述
优点是好实现、效率高,缺点是不方便动态更新、总走路中间

1.1.2 Grid

地图网格化,类似光栅化,如下图:
在这里插入图片描述
优点是便于动态更新,缺点是精确度取决于格子大小、存储空间浪费、难以表达层叠结构(比如桥)

1.1.3 Navigation Mesh

现代游戏引擎最普遍的方法,即把地图上所有可通行的区域连起来(用多边形),主要用物理碰撞与预测路线,既可以解决路线僵硬问题,又能应对层叠结构

优点是支持3d、精确、灵活、动态,缺点是生成Navigation Mesh的算法非常复杂,并且只能“寻路”,不能飞机3d空间导航

  • 怎么生成Navigation Mesh呢?

现在基本都是自动生成,用一些开源库如recast,voxelization后去计算可通行区域;然后再通过计算离边缘最近的edge voxel,得到一个类似距离场的东西;再找到每个区域距离边缘最远的中心点,用洪水算法向外扩散,直到覆盖所有区域,在通过进一步处理(比如连通区域变为凸多边形之类,比较复杂),这就是我们的生成的Mesh了

  • Polygon Flag

通过地形标签生成不同区域的mesh
在这里插入图片描述

  • Tile
    那如果地图在动态变化怎么办,比如路障被用户打掉了。可以使用Tile把地图分块,部分地图更新后只需要重新计划该块tile即可

1.1.4 Sparse Voxel Octree

把空间体素化,通过求交导航。可以表达3d空间的导航,主要用于航空航天游戏。但缺点是存储消耗大
在这里插入图片描述

1.2 Path Finding

以上每种方式都可以把各个几何元素的中心连接为点图,只要找到最短路径即可。
在这里插入图片描述
这个过程也有几种算法,比如经典的:

  • 深度优先搜索(Depth-First Search):找到一个分支一直走,如果没有路就退回来,直到走到终点为止(时间换空间)
  • 广度优先搜索(Breadth-First Search):每一个step都向全部子节点扩散一步,直到找到终点(空间换时间)

但以上两种方式都比较费,并且不能计算加权最短路径,所以还需要更多算法帮助:

1.2.1 Dijkstra Algorithm迪杰斯特拉算法

可以解决有权图中最短路径问题,参考这个大佬的文章:图论:Dijkstra算法——最详细的分析,图文并茂,一次看懂!
截图自大佬博客:
在这里插入图片描述
但是对于游戏来说,有时候并不需要真的“最优路径”,只要按照大致方向走就行了,所以引入了下边的A Star算法

1.2.2 A Star(A*算法)

用的最普遍,是一种启发式算法,通过有选择的节点搜索找到最短路径,因此更快,常用于游戏或机器人导航。
原理是通过计算一个代价函数:f = g(从原点已经走过的路程的代价,一般累计路程距离) + h(到终点还有多远的代价,一般用欧拉距离或x+y),来逐步寻找最优下一步的路径(按照网格或mesh的划分),原理有些类似梯度下降。

在这里插入图片描述

1.3 Path Smoothing

在这里插入图片描述

  • Funnel Algorithm烟囱算法:类似于人走路时对道路的感知,如下图
    1. 从起始点看向下一个三角形,视野卡在三角形两端,如果能全部在视野中,就继续看下一个三角形,更新视野,直到某一个三角形被挡住一部分时,左边被挡沿左视野边走,右边被挡沿右视野边走;
    2. 走到被卡视野的遮挡点后,再重新进行上述过程;
    3. 如果迭代过程中发现终点就在视野里时则直接向终点走。
      在这里插入图片描述
      在这里插入图片描述

二,Steering系统

载具的移动受限于它们的移动能力:油门、刹车、转向等,所以经常会在寻路中被障碍物卡死

  • steer behavior:
    1. Seek/Flee:包括 追踪、巡逻、流场跟随、路径跟随
    2. 速度匹配:快到目标点减速,减速到速度为0时刚好到达目标点,比如火箭发射会用到
    3. 一致性:角速度的加速和减速,比如npc看向主角

三,Crowd Simulation群体模拟

现在的游戏城市环境交互等越来越丰富,那群体模拟必不可少,比如一群鸽子突然飞走,一群npc四散逃跑等。群体模拟需要做到:避免碰撞、成群的来回移动(Swarming)、编队运动(motion in formation)

3.1 群体模拟模型

  • 群体模拟模型大致有三种:

微观方法(Microscopic):自底向上的定义每个个体的行为,合起来就组成了群体行为。
宏观方法(Macroscopic):定义群体宏观的运动趋势,所有个体按照该趋势移动。
综合方法(Mesoscopic):将群体分组。既有宏观的趋势,也有微观的个体行为。

3.1.1 微观方法:基于规则的模型

比如动物的群体动力学,用简单规则控制每个个体的运动:

  1. 分离(Separation):避开自己的所有“邻居”(斥力)
  2. 凝聚性(Cohesion:朝向群体的“质心”移动
  3. 一致性(Alignment):和邻近的对象朝向同一个方向移动
    在这里插入图片描述

好处是规则简单,坏处是宏观上是不可控且不怎么受人影响。

3.1.2 宏观方法

从宏观的角度模拟人群的运动,通过设置可通行区域和有势场或流体力学的控制运动,类似粒子系统运动?
在这里插入图片描述

3.1.3 综合方法

结合了宏观和微观方法,把群体分为很多小组,每组分别运动,同时组里的个体也有一点自己的区别。比如红警里圈出一群小兵运动时就是这样。
在这里插入图片描述

3.2 避免碰撞

这部分如果给ai做效率非常低,所以需要用一个碰撞系统帮助ai决策

3.2.1 基于力的模型

相当于使用距离场给障碍物增加一个反向力
在这里插入图片描述
好处:可以被拓展去模拟更慌乱的人群的行为。
坏处:类似于物理模拟,模拟的步骤应该足够小。

3.2.1 基于速度的模型–速度障碍法

类似人眼处理方式:当两个物体在同一速度线上行走,就都靠左边避让一点。
在这里插入图片描述
当参与的对象不止两个时,A 对 B 的避让可能又会影响到 C。所有需要做一些优化:Optimal Reciprocal Velocity Avoidance(ORVA)。其数学复杂度非常高,不过实际中也会用基于力的方式替代(结果没那么丝滑但能用)
在这里插入图片描述

四,Sensing环境感知

对世界的感知是我们和ai决策的依据,感知分为内部和外部信息:

内部的信息包含位置、血量、护甲状态、增益状态、可以被自由获取的东西等等;外部的信息包含静态空间信息如Tactical Map战术地图、掩体等和动态信息如influenceMap人群热力图、视角图、游戏物体等。

在这里插入图片描述
这些非常类似人类对世界的感知(并不是上帝视角),有视觉、听觉并随距离衰减,有活动范围、视野等,但如果感知太多会影响性能,因此一般会取舍几个,并范围内共享信息

五,经典决策算法

  • 经典决策算法有:

有限状态机(Finite State Machine)
行为树(Behavior Tree):AI最核心的体系
层次任务网络(Hierarchical Tasks Network)
目标驱动的行为计划系统(Goal Oriented Action Planning)
蒙特卡洛搜索树(Monte Carlo Tree Search)
深度学习(Deep Learning)

5.1 有限状态机(Finite State Machine)

根据一些条件转换(Transition)一个状态到其他状态
在这里插入图片描述
比如吃豆人的状态机示例:
在这里插入图片描述

  • 好处:容易执行、容易理解、对于简单例子,应对起来非常快
  • 坏处:可维护性差,特别是添加和移动状态;重用性差,不能被应用于其他项目或角色;可扩展性差,很难去修改复杂的案例

5.1.1 层次有限状态机(HFSM)

把状态机分为很多层或模块,每个状态机之间有相互的接口,复杂度可控;虽然能部分解决上述问题,但是会造成一定的性能下降,难以跳模块,反应速度也会下降。15年前的很多游戏就是这么做的,属于“古老”的方法。
在这里插入图片描述

5.2 行为树(Behavior Tree)

行为树和人的思考类似,例如 人碰到一个敌人,会根据自己的状态来选择追击还是撤退。(一些复杂的商业决策也有类似决策树的逻辑)

在这里插入图片描述

5.2.1 可执行结点

条件结点可以立马执行完,而行为结点有一定过程,例如追鬼,首先得有寻路系统,然后还需要转向系统。行为也分为正在进行和失败等几种状态。
在这里插入图片描述

5.2.2 控制结点

在这里插入图片描述

  • Sequence 顺序执行,&&:从左到右便利子节点,如果某个子节点返回 Failure 就停止整个行为,或者时所有子节点都成功执行,返回 Success,并执行该行为。
  • Selector 条件执行,||: 根据条件尝试所有子节点,一旦某个子节点 满足条件,立马作出该决策。
  • Parallel并行执行 :一个 AI 体可以同时进行多个行为,例如对于射击游戏来说可以同时进行移动和射击。
  • Decorator装饰节点:起修饰作用,例如循环执行、执行一次、计时器、定时等。
    在这里插入图片描述
  • 注意行为树tick更新时要每一帧都从根节点开始判断,这一点上也可以优化为正常从上一帧的节点继续,但某些优先级高的event会更新整棵树。

5.2.3 黑板(Blackboard)

用于记录行为状态,用于把数据与逻辑分离
在这里插入图片描述

  • 行为树的好处:

模块化、层级组织(每个子树可以被看作是一个模块)
可读性高
容易维护,并且修改只会影响树的一部分
反应快,每个 tick 会快速的根据环境来改变行为
容易 Debug,每个 tick 都是是一个完整的决策。

  • 行为树的坏处

如果不优化,每个 tick 都从根节点触发,会造成更大的开销
反应性越好,条件越多,每帧的花销也越大

QA

  • 行为树和if else有什么区别:if else就是最简单的行为树,行为树类似goto、jump等语言指令
  • ai如何从环境中提取数据(感知):环境数据类型多数量多,其实很难读取,可以用引擎中的反射等技术解决;ai提取数据时效率其实不高,需要对感知做规划和指令
  • 如何处理垂直邻面的NavMesh生成?根据高度设置为断开的悬崖或是可通过的障碍,如果可以攀爬另说

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/443590.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在不支持WSL2的Windows环境下安装Redis并添加环境变量的方法

如果系统版本支持 WSL 2 可跳过本教程。使用官网提供的教程即可 官网教程 查看是否支持 WSL 2 如果不支持或者觉得麻烦可以按照下面的方式安装 下载 点击打开下载地址 下载 zip 文件即可 安装 将下载的 zip 文件解压到自己想要解压的地方即可。(注意&#x…

Python 工具库每日推荐【Pillow】

文章目录 引言Python图像处理库的重要性今日推荐:Pillow工具库主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:创建图像拼贴案例分析高级特性图像增强图像水印扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeScript 设计模式 专栏,感兴…

深入理解HTTP Cookie

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 HTTP Cookie定义工作原理分类安全性用途 认识 cookie基本格式实验测试 cookie 当我们登录了B站过后,为什么下次访问B站就…

JavaScript 变量的简单学习

目录 1. 变量 1.1 变量是什么 1.2 变量基本使用 1.2.1 声明变量 1.2.2 变量赋值 1.2.3 变量更新 1.2.4 声明多个变量 1.3 变量案例 1.3.1 弹出姓名 1.3.2 交换变量的值 1.4 变量的本质 1.5 变量命名规则 1.6 var VS let 1. 变量 1.1 变量是什么 1.2 变量基本使用 …

Lazada菲律宾本土店选品怎么操作?EasyBoss ERP选品功能来帮你!

由于Lazada本土店在流量、履约速度、类目限制以及回款速度方面的优势,越来越多的Lazada卖家都在考虑转型做本土店,但本土化落地并不是一件容易的事,很多卖家在选品阶段就踩大坑了。 因此,为了选品不踩坑,很多卖家都会…

天海一体,遨游双卫星智能终端扬帆5G智慧海洋

海洋面积占地球表面的70%以上,世界贸易的90%左右由国际海运行业承运。但是,信号覆盖不均、通信延迟高、定位精度不足等问题,严重制约了海洋作业的效率与安全。智慧海洋,通信先行,AORO M5-5G双卫星智能终端应时代需求而…

螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习06(Docker网络连接)

如果要搭建基于docker的私人DC,除了虚拟机网络连接外,就得掌握docker的网络连接。磨刀不误砍柴工,或者说工欲善其事必先利其器,我们先学学典型的docker的网络连接方式。Docker的网络连接有四种:bridge、none、containe…

【10086网上营业厅-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…

【小沐学CAD】ParaView Web的学习笔记(Python)

文章目录 1、简介1.1 visualizer1.2 Divvy1.3 Lite1.4 LightViz1.5 ArcticViewer1.6 HPCCloud1.7 glance1.8 trame 结语 1、简介 https://pvw.kitware.com/ VTK/ParaView Web,用于 Web 数据处理和可视化的框架 ParaViewWeb 是一个 Web 框架,用于在 Web …

大数据-162 Apache Kylin 全量增量Cube的构建 Segment 超详细记录 多图

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

Redis:分布式 - 哨兵

Redis:分布式 - 哨兵 概念哨兵 Docker 搭建哨兵分布式选举流程 概念 Redis 的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工进行主从切换,同时大量的客户端需要被通知切换到新的主节点上,对于上了一定规模…

【LeetCode HOT 100】详细题解之回溯篇

【LeetCode HOT 100】详细题解之回溯篇 回溯法的理论基础回溯法解决的问题理解回溯法回溯法模板 46 全排列思路代码 78 子集思路代码 17 电话号码的字母组合思路代码 39 组合总和思路代码 22 括号生成思路代码 79 单词搜索思路代码 131 分割回文串思路代码 51 N皇后思路代码 回…

打造梦幻AI开发环境:一步步解锁高效配置的魅力

作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注 座右铭: 云端筑梦,数据为翼,探索无限可能,引领云计算新纪元 个人主页:团儿.-CSDN博客 目录 前言&#…

疾病防控|基于springBoot的疾病防控综合系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书(可指定任意题目) 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 在如今社会上,关于信息上面的处理,没有任何…

基于SpringBoot+Vue的农场管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

通过Fiddler抓包采集某音作品列表,视频列表

声明:文章仅用于学习交流,如有侵权请联系删除 今天分享下某音app作品列表采集方法,我只详细说一下大步骤,细节就不多说了,留着大家去试吧 我们通过Fiddler 快捷方式 配置好代理 打开抖音进行抓包,随便找个达人打开主…

计算机的错误计算(一百一十七)

摘要 算式“(5^25*(1/25)^(1/5)*3^25(1/25)^(1/5)*5^25*3^(251/5)-(9/25)^(1/5)*3^25*5^25-(1/25)^(1/5)*3^25*5.0^25*(13^(1/5)-3^(2/5.0)))” 的准确值是0. 但是,Python 与 Excel 均输出了错误结果:一个含有15位整数,一个含有14位整数。 …

stm32学习笔记-RTC实时时钟

文章目录 一、RTC基础知识1.1 RTC简介1.2 RTC的晶振 二、stm32的RTC2.1 RTC和后备寄存器2.2 stm32 RTC结构框图及特性 三、stm32 RTC编程2.1 RTC初始化2.2 RTC控制程序 一、RTC基础知识 1.1 RTC简介 实时时钟的缩写是RTC(Real_Time Clock)。RTC 是集成电路,通常称…

【机器学习】深度学习、强化学习和深度强化学习?

深度学习、强化学习和深度强化学习是机器学习的三个重要子领域。它们有着各自独特的应用场景和研究目标,虽然都属于机器学习的范畴,但各自的实现方式和侧重点有所不同。 1. 深度学习(Deep Learning) 深度学习是一种基于神经网络的…

76.【C语言】perror函数介绍

1.cplusplus的官网介绍 cplusplus的介绍 点我跳转 2.翻译 函数 perror void perror ( const char * str ); 打印错误信息 将errno(最后一个错误数字)的值解释为错误信息,之后把它打印到stderr中(标准错误输出流,通常是控制台)(备注有关"流"的概念在75.【C语言】文件…