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

news2024/11/19 2:32:12

文章目录

  • 一,寻路/导航系统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.coloradmin.cn/o/2200237.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docsify搭建个人博客

前提:电脑安装了Node.js 安装到本地 CMD命令下输入node -v查看是否已经安装了Node.js 安装docsify-cli工具:npm i docsify-cli -g 使用git下载docsify-Plus项目,Gitee地址:https://gitee.com/librarycodes/docsify-plus cd…

基于SpringBoot的国家基础信息管理功能的设计与实现

目录 前言 一、标准信息参考 1、信息来源 二、后台基础信息的维护管理 1、实体类和Mapper类 2、业务层和控制层设计 3、前端界面实现 三、管理页面效果 1、列表管理界面 2、国家信息调整 四、总结 前言 在之前的博客中,我们基于GeoTools工具实现了全球各个…

Base64字符串转图片在线工具

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 基本原理 Base64编码,作为一种将二进制数据转换为文本格式的方法,其核心在于利用64个可打印字符来表征任意的二进制信息。这一编码方式的出现&#…

应急响应:DHCP$DNS劫持实战

目录 DHCP DHCP安全性: DHCP常见的攻击手段: DNS DNS常见的攻击方式: DNS&DHCP攻击实战演练: 环境配置: 利用: 排查: 防御: DHCP 介绍: DHCP(…

【Redis】Set类型的常用命令与应用场景

目录 1.命令小结 2.命令解析 3.编码方式与应用场景 1.命令小结 (1)set的特点 1)set中存放的数据也都是String类型 2)set集合中的元素是无须的 3)set集合中的元素是唯一的,不可重复 (2&a…

苦瓜检测系统源码分享

苦瓜检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision 研究…

以光塑形:光固化3D打印机原理图文解析

公众号端: 光固化打印机介绍https://mp.weixin.qq.com/s?__bizMzkwMjc0MTE3Mw&mid2247484073&idx1&sn0d0fd026b373b06cd7c340ec8f56a006&chksmc0a1af73f7d62665a632baebbde4e5e00ffb9c6bd31bf547b4a86855d5524535619a6175a428#rd 光固化打印机…

linux如何与网络时间对齐(雪花算法ID重复)

文章目录 前言一、可能引发什么问题?二、调整步骤1.查看当前系统时间2.修改为中国时区3.同步网络时间4. 雪花id重复 总结 前言 linux服务器是部署服务的不二之选,有个小问题不可忽略: 会发现默认的服务器时间并非中国时区,时间也是相差八小时,中国时区…

python全栈学习记录(二十四)元类、异常处理

元类、异常处理 文章目录 元类、异常处理一、元类1.元类控制类的实例化2.属性/方法的查找顺序3.单例 二、异常处理 一、元类 1.元类控制类的实例化 类的__call__方法会在产生的对象被调用时自动触发,args和kwargs就是调用实例时传入的参数,返回值是调用…

Hotspot是什么?

Hotspot 简单来说,JVM的一种。 一、HotSpot 的官方定义 HotSpot 是 Oracle 公司开发的一个高性能的 Java 虚拟机(JVM)。它通过一系列先进的技术和优化手段,为 Java 应用程序提供高效的运行环境,实现了跨平台的代码执行…

文献下载/影响因子查询/文献检索/文献翻译平台推荐

文献下载平台 科研通 文献互助平台 - 科研通(AbleSci.com) 每天签到可领10积分,右上角求助文献,一篇10积分,基本实现免费下载。 尽量输入doi(类似文献id),如果没有doi则输入标题作者摘要等信息&#xff0…

SpringBoot 整合JPA

spring data jpa JPA(java persistence api) JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。 [1] Sun引入新的JPA ORM规范出于两…

链表Set_LinkList(建立)

用单链保存集合元素,元素由键盘输入。输入以-1结束,将所建链表打印输出。 链表结构如下图所示: 提示: 1.链表中数据元素为整型,typedef int ElemType; 2.用结构体自定义链表结构Set_LinkList ; 3.初始化链表…

【每日刷题】Day135

【每日刷题】Day135 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. LCR 011. 连续数组 - 力扣(LeetCode) 2. 【模板】二维前缀和_牛客题霸_牛客…

基于SSM的共享读书网站

文未可获取一份本项目的java源码和数据库参考。 1.1 题目背景 进入新时代,中国的经济建设和社会发展需要与之相适应的人力资源相匹配。如何提升人力资源的素养,是新时代中国持续发展亟待解决的问题[1]。阅读不失为其中一个有效的手段。有效有益的阅读能…

【每日一题 | 24.10.6】确定字符串是否包含唯一字符

1. 题目2. 解题思路3. 代码实现(AC_Code) 个人主页:C_GUIQU 归属专栏:每日一题 1. 题目 确定字符串是否包含唯一字符 2. 解题思路 题目要求:判断输入的字符串是否唯一,这里想到可以借助布尔数组。 第一…

软件测试外包干了4年,感觉废了....

先说一下自己的情况,大专生,18年通过校招进入湖南某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

【模板进阶】std::conditional

一、 s t d : : c o n d i t i o n a l std::conditional std::conditional的使用 C 11 C11 C11标准引入了 s t d : : c o n d i t i o n a l std::conditional std::conditional,这是一个类模板,用于表现一种编译期间的分支逻辑。 它的实现代码比较简…

【斯坦福CS144】Lab4

一、实验目的 完成一个网络接口实现。 二、实验内容 完成一个网络接口实现,其大部分工作是:为每个下一跳IP地址查找(和缓存)以太网地址。而这种协议被称为地址解析协议ARP。 三、实验过程 在minnow目录下输入git merge origin/check4-startercode获…

[ C++ ] C++ 类和对象 -- 类的六个默认成员函数

目录 1.构造函数 2.析构函数 3.拷贝构造函数 4.赋值操作符重载 5.两个取地址操作符的重载 在C中当你创建一个空类,那这个空类是什么都没有吗?不是的,编译器会默认帮你生成六个成员函数 1.构造函数 构造函数是特殊的成员函数,…