Games104——游戏引擎Gameplay玩法系统:基础AI

这里写目录标题

  • 寻路/导航系统Navigation
    • Walkable Area
      • Waypoint Network
      • Grid
      • Navigation Mesh(寻路网格)
      • Sparse Voxel Octree
    • Path Finding
      • Dijkstra Algorithm迪杰斯特拉算法
      • A Star(A*算法)
    • Path Smoothing
  • Steering系统
  • Crowd Simulation群体模拟
    • 群体模拟模型
      • 微观方法:基于规则的模型
      • 宏观方法
      • 综合方法
    • 避免碰撞
      • 基于力的模型
      • 基于速度的模型–速度障碍法
  • Sensing环境感知
  • 经典决策算法
    • 有限状态机(Finite State Machine)
      • 层次有限状态机(HFSM)
    • 行为树(Behavior Tree)
      • 可执行结点
      • 控制结点
      • 黑板(Blackboard)

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

寻路/导航系统Navigation

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

Walkable Area

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

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

Waypoint Network

早期游戏引擎用的多,通过设置道路关键点(如道路两边)并用算法插值关键点得到路网,寻路时先找到距离当前位置和目标位置最近的路网点,再通过路网连通(就像坐地铁一样),如下图:
在这里插入图片描述

优点是好实现、效率高,缺点是不方便动态更新、总走路中间

Grid

地图网格化,类似光栅化,如下图:
在这里插入图片描述

优点是便于动态更新,缺点是精确度取决于格子大小、存储空间浪费、效率比较低、难以表达层叠结构(比如桥)

Navigation Mesh(寻路网格)

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

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

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

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

  • Tile
    那如果地图在动态变化怎么办,比如路障被用户打掉了。可以使用Tile把地图分块,部分地图更新后只需要重新计划该块tile即可
    在这里插入图片描述
    把空间分成一个个Tile,当Tile改变时只需要更新这个Tile即可

  • Off Mesh Link
    建立一些手动的连接点和连接线可以让寻路变得更加复杂,增强拓展性
    在这里插入图片描述

Sparse Voxel Octree

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

Path Finding

以上每种方式都可以把各个几何元素的中心连接为点图,只要找到最短路径即可。
在这里插入图片描述
所谓寻路问题主要就是解决两个问题:

  1. 找到一条起点到终点的道路
  2. 尽可能的少走弯路

这个过程也有几种算法,比如经典的:

深度优先搜索(Depth-First Search):找到一个分支一直走,如果没有路就退回来,直到走到终点为止(时间换空间)

广度优先搜索(Breadth-First Search):每一个step都向全部子节点扩散一步,直到找到终点(空间换时间)
但以上两种方式都比较费,并且不能计算加权最短路径,所以还需要更多算法帮助:
在这里插入图片描述

Dijkstra Algorithm迪杰斯特拉算法

可以解决有权图中最短路径问题,参考这个大佬的文章:图论:Dijkstra算法——最详细的分析,图文并茂,一次看懂!
截图自大佬博客:
在这里插入图片描述

但是对于游戏来说,有时候并不需要真的“最优路径”,只要按照大致方向走就行了,所以引入了下边的A Star算法

A Star(A*算法)

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

在这里插入图片描述

Path Smoothing

把无效的运动尽可能踢掉

Funnel Algorithm烟囱算法:类似于人走路时对道路的感知,如下图:
在这里插入图片描述
在这里插入图片描述

从起始点看向下一个三角形,视野卡在三角形两端,如果能全部在视野中,就继续看下一个三角形,更新视野,直到某一个三角形被挡住一部分时,左边被挡沿左视野边走,右边被挡沿右视野边走;
走到被卡视野的遮挡点后,再重新进行上述过程;
如果迭代过程中发现终点就在视野里时则直接向终点走。

Steering系统

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

steer behavior:

  • Seek/Flee:包括 追踪、巡逻、流场跟随、路径跟随
  • 速度匹配:快到目标点减速,减速到速度为0时刚好到达目标点,比如火箭发射会用到
  • 一致性:角速度的加速和减速,比如npc看向主角
    在这里插入图片描述

Crowd Simulation群体模拟

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

群体模拟模型

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

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

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

  • 分离(Separation):避开自己的所有“邻居”(斥力)
  • 凝聚性(Cohesion:朝向群体的“质心”移动
  • 一致性(Alignment):和邻近的对象朝向同一个方向移动

在这里插入图片描述

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

宏观方法

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

综合方法

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

避免碰撞

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

基于力的模型

相当于使用距离场给障碍物增加一个反向力
在这里插入图片描述

好处:可以被拓展去模拟更慌乱的人群的行为。
坏处:类似于物理模拟,模拟的步骤应该足够小。

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

类似人眼处理方式:当两个物体在同一速度线上行走,就都靠左边避让一点。
在这里插入图片描述

当参与的对象不止两个时,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)

有限状态机(Finite State Machine)

根据一些条件转换(Transition)一个状态到其他状态
在这里插入图片描述
比如吃豆人的状态机示例:
在这里插入图片描述
好处:容易执行、容易理解、对于简单例子,应对起来非常快
坏处:可维护性差,特别是添加和移动状态;重用性差,不能被应用于其他项目或角色;可扩展性差,很难去修改复杂的案例

层次有限状态机(HFSM)

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

行为树(Behavior Tree)

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

可执行结点

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

控制结点

在这里插入图片描述

  • Sequence 顺序执行,&&:从左到右便利子节点,如果某个子节点返回 Failure 就停止整个行为,或者时所有子节点都成功执行,返回 Success,并执行该行为。
    在这里插入图片描述

  • Selector 条件执行,||: 根据条件尝试所有子节点,一旦某个子节点 满足条件,立马作出该决策。
    在这里插入图片描述

  • Parallel并行执行 :一个 AI 体可以同时进行多个行为,例如对于射击游戏来说可以同时进行移动和射击。

  • Decorator装饰节点:起修饰作用,例如循环执行、执行一次、计时器、定时等。
    在这里插入图片描述

注意行为树tick更新时要每一帧都从根节点开始判断,这一点上也可以优化为正常从上一帧的节点继续,但某些优先级高的event会更新整棵树。
在这里插入图片描述

黑板(Blackboard)

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

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

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

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

原文链接:

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

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

相关文章

Nginx进阶篇 - nginx多进程架构详解

文章目录 1. nginx的应用特点2. nginx多进程架构2.1 nginx多进程模型2.2 master进程的作用2.3 进程控制2.4 worker进程的作用2.5 worker进程处理请求的过程2.6 nginx处理网络事件 1. nginx的应用特点 Nginx是互联网企业使用最为广泛的轻量级高性能Web服务器,其特点是…

grafana面板配置opentsdb

新增面板: 这里add-panel: 如果不是想新增面板而是想新增一行条目,则点击convert to row: 在新增的面板这里可以看到选择数据源 Aggregator:聚合条件,区分下第一行和第二行的aggregator,第一个是对指标值的聚合&…

记一次golang环境的变化

前两天编译打包了了个文件,把env的 goos 搞坏了 导致运行项目一直报错 先是这样 go: unsupported GOOS/GOARCH pair windows/amd64再是这样 /amd64supported GOOS/GOARCH pair linux咱就说,咱也是知道环境配置的有问题 ( go env GOOS &…

ARM嵌入式学习--第十三天(I2C)

I2C --介绍 I2C(Inter-intergrated Circuit 集成电路)总线是Philips公司在八十年代初推出的一种串行、半双工的总线,主要用于近距离、低速的芯片之间的通信;I2C总线有俩根双向的信号线,一根数据线SDA用于收发数据&…

(10) 如何获取 linux 系统上的 TCP 、 UDP 套接字的收发缓存的默认大小,以及代码范例

(1) 先介绍下后面的代码里要用到的基础函数: 以及: (2) 接着给出现代版的 读写 socket 参数的系统函数 : 以及: (3) 给出 一言的 范例代码,获取…

kafka消费端之消费者协调器和组协调器

文章目录 概述回顾历史老版本获取消费者变更老版本存在的问题 消费者协调器和组协调器新版如何解决老版本问题再均衡过程**第一阶段CFIND COORDINATOR****第二阶段(JOINGROUP)**选举消费组的lcader选举分区分配策略 第三阶段(SYNC GROUP&…

Redis --- 使用Feed流实现社交平台的新闻流

要实现一个 Feed 流(类似于社交媒体中的新闻流),通常涉及以下几个要素: 内容发布:用户发布内容(例如文章、状态更新、图片等)。内容订阅:用户可以订阅其他用户的内容,获…

6 maven工具的使用、maven项目中使用日志

文章目录 前言一、maven:一款管理和构建java项目的工具1 基本概念2 maven的安装与配置(1)maven的安装(2)IDEA集成Maven配置当前项目工程设置 maven全局设置 (3)创建一个maven项目 3 pom.xml文件…

Visual Studio(VS)没有显示垂直滚轮or垂直滚轮异常显示

前言: 前段时间,我换上了新电脑。满心欢喜地安装好 VS,准备大干一场时,却发现了一个小麻烦 —— 垂直滚轮显示异常(如图 1)。这种显示方式实在让我难以适应,每一次操作都觉得别扭。 于是&#…

Fiddler Classic(HTTP流量代理+半汉化)

目录 一、关于Fiddler (一) Fiddler Classic (二) Fiddler Everywhere (三) Fiddler Everywhere Reporter (四) FiddlerCore (五) 总结 二、 软件安全性 1. 软件安装包 2. 软件汉化dll 三、安装与半汉化 1. 正常打开安装包点击下一步安装即可,安装路径自…

时序数据库:Influxdb详解

文章目录 一、简介1、简介2、官网 二、部署1、安装2、配置(1)用户初始化 三、入门(Web UI)1、加载数据(1)上传数据文件(2)代码接入模板 2、管理存储桶(1)创建…

android 适配 api 35(android 15) 遇到的问题

首先升级 targetSdkVersion 和 compileSdkVersion 到 35,升级后发生的报错 一、 解决方案: 升级 gradle 和 gradle 插件版本 com.android.tools.build:gradle -> 8.3.0-alpha02 gradle-wrapper.properties : distributionUrl -> gradle-8.6-bin.zip htt…

【万字详细教程】Linux to go——装在移动硬盘里的Linux系统(Ubuntu22.04)制作流程;一口气解决系统安装引导文件迁移显卡驱动安装等问题

Linux to go制作流程 0.写在前面 关于教程Why Linux to go?实际效果 1.准备工具2.制作步骤 下载系统镜像硬盘分区准备启动U盘安装系统重启完成驱动安装将系统启动引导程序迁移到移动硬盘上 3.可能出现的问题 3.1.U盘引导系统安装时出现崩溃3.2.不影响硬盘里本身已有…

完美解决phpstudy安装后mysql无法启动

phpstudy数据库无法启动有以下几个原因。 **一、**自己在电脑上安装了MySQL数据库,MySQL的服务名为MySQL,这会与phpstudy的数据库的服务名发生冲突,从而造成phpstudy中的数据库无法启动,这时我们只需要将自己安装的MySQL的服务名改掉就行。 但是&#…

Class加载流程和运行时区域

目录 jvm是什么.class加载过程干预.class.class文件内容1 加载2-1 连接:验证(class字节流的校验)2-2 连接:准备(分配内存,初始化默认值)2-3 连接:解析3 class 初始化什么时候需要对类…

ESP32开发学习记录---》GPIO

she 2025年2月5日,新年后决定开始充电提升自己,故作此记,以前没有使用过IDF开发ESP32因此新年学习一下ESP32。 ESPIDF开发环境配置网上已经有很多的资料了,我就不再赘述,我这里只是对我的学习经历的一些记录。 首先学习一个…

pycharm集成通义灵码应用

在pycharm中安装通义灵码 1、打开files-settings 2、选中plugins-搜索”TONGYI Lingma“,点击安装 3.安装完成后在pycharm的右侧就有通义灵码的标签 4、登录账号 5、查看代码区域代码,每一个方法前面都多了通义灵码的标识,可以直接选择…

Git--使用教程

Git的框架讲解 Git 是一个分布式版本控制系统,其架构设计旨在高效地管理代码版本,支持分布式协作,并确保数据的完整性和安全性。 Git 的核心组件: 工作区(Working Directory): 工作区是你在本…

力扣.270. 最接近的二叉搜索树值(中序遍历思想)

文章目录 题目描述思路复杂度Code 题目描述 思路 遍历思想(利用二叉树的中序遍历) 本题的难点在于可能存在多个答案,并且要返回最小的那一个,为了解决这个问题,我门则要利用上二叉搜索树中序遍历为有序序列的特性,具体到代码中&a…

7个国内能打开的AI绘画网站!新手福音!

以下是我收集的国内能打开的AI绘画网站。 1、6pen 网址:https://6pen.art/ 2、文心大模型 网址:https://wenxin.baidu.com/moduleApi/ernieVilg 3、Draft 网址:https://draft.art/ai- art/drawing 4、nightcafe 网址:https:/…