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.pswp.cn/news/894787.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/894787.shtml
英文地址,請注明出處:http://en.pswp.cn/news/894787.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Win11非虛擬機安裝ISE14.7

官網下載6.18GB 的 Full Installer for Windows 7/XP/Server解壓后運行安裝程序不勾選Enable WebTalk to send software, IP ...安裝程序卡死在ISE:Configure WebTalk,此時打開任務管理器,在詳情中找到xwebtalk,右鍵結束任務。安裝程序繼續進…

從0開始達芬奇(3.8)

剪視頻有主次之分,主就是Aroll,次就是Broll。 智能媒體夾: 媒體池的智能媒體夾部分可以很好區分主次。這個相當于智能搜索,當有大量的素材時,可以為這些素材標明信息,下次使用不需要反復看,直…

【Elasticsearch】parent aggregation

在Elasticsearch中,Parent Aggregation是一種特殊的單桶聚合,用于選擇具有指定類型的父文檔,這些類型是通過一個join字段定義的。以下是關于Parent Aggregation的詳細介紹: 1.基本概念 Parent Aggregation是一種聚合操作&#x…

自學Java-面向對象編程入門

自學Java-面向對象編程入門 一、靜態方法的注意事項二、簡易版電影信息展示系統1、測試類2、電影類3、電影操作類 一、靜態方法的注意事項 1、靜態方法中可以直接訪問靜態成員,不可以直接訪問實例成員 2、實例方法中既可以直接訪問靜態成員,也可以直接訪…

python算法和數據結構刷題[3]:哈希表、滑動窗口、雙指針、回溯算法、貪心算法

回溯算法 「所有可能的結果」,而不是「結果的個數」,一般情況下,我們就知道需要暴力搜索所有的可行解了,可以用「回溯法」。 回溯算法關鍵在于:不合適就退回上一步。在回溯算法中,遞歸用于深入到所有可能的分支&…

【自學筆記】Python的基礎知識點總覽-持續更新

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 Python基礎知識總覽1. Python簡介2. 安裝與環境配置3. 基本語法3.1 變量與數據類型3.2 控制結構3.3 函數與模塊3.4 文件操作 4. 面向對象編程(OOP&#…

文件上傳到騰訊云存儲、簽名及設置過期時間

將文件上傳到騰訊云對象存儲(COS,Cloud Object Storage)可以通過騰訊云提供的 SDK 實現。以下是詳細的步驟和示例代碼,幫助您完成文件上傳操作。 步驟 注冊騰訊云賬號并創建存儲桶: (1)登錄騰訊…

基于Java(SpringBoot)+MySQL+Vue實現的平行志愿錄取系統

基于spring bootvue實現的平行志愿錄取系統 1.項目簡介 這兩天干上高考出成績,有不少親戚家的孩子今年高考,和我詢問關于報志愿的問題。老家河北今年是采用所謂的平行志愿。我看了很多的資料才明白什么叫所謂的“平行志愿”。 整個流程好像很是復雜。…

chrome瀏覽器chromedriver下載

chromedriver 下載地址 https://googlechromelabs.github.io/chrome-for-testing/ 上面的鏈接有和當前發布的chrome瀏覽器版本相近的chromedriver 實際使用感受 chrome瀏覽器會自動更新,可以去下載最新的chromedriver使用,自動化中使用新的chromedr…

Redis常見數據類型與編碼方式

??前言?? 本小節圍繞Redis中常見的數據類型與編碼方式展開。 🍉歡迎點贊 👍 收藏 ?留言評論 🍉博主將持續更新學習記錄收獲,友友們有任何問題可以在評論區留言 🍉博客中涉及源碼及博主日常練習代碼均已上傳GitHu…

win編譯openssl

一、perl執行腳本 1、安裝perl腳本 perl安裝 2、配置perl腳本 perl Configure VC-WIN32 no-asm no-shared --prefixE:\openssl-x.x.x\install二、編譯openssl 1、使用vs工具編譯nmake 如果使用命令行nmake編譯會提示“無法打開包括文件: “limits.h”“ 等錯誤信息 所以…

【Kubernetes Pod間通信-第2篇】使用BGP實現Pod到Pod的通信

Kubernetes中Pod間的通信 本系列文章共3篇: 【Kubernetes Pod間通信-第1篇】在單個子網中使用underlay網絡實現Pod到Pod的通信【Kubernetes Pod間通信-第2篇】使用BGP實現Pod到Pod的通信(本文介紹)【Kubernetes Pod間通信-第3篇】Kubernetes中Pod與ClusterIP服務之間的通信…

< 自用文兒 > 下載 MaxMind GeoIP Databases 對攻擊的 IP 做 地理分析

起因 兩個 VPM/VPS,安裝了 fail2ban 去攔截密碼窮舉攻擊。每天的記錄都在增長,以前復制屏幕輸出就行,一屏的內容還容易粘貼出來的。昨天已經過 500 條,好奇 fail2ban 是如何存儲這些內容的?就發現它在使用 SQLite3 數…

SpringCloudGateWay和Sentinel結合做黑白名單來源控制

假設我們的分布式項目,admin是8087,gateway是8088,consumer是8086 我們一般的思路是我們的請求必須經過我們的網關8088然后網關轉發到我們的分布式項目,那我要是沒有處理我們繞過網關直接訪問項目8087和8086不也是可以&#xff1…

C#面試常考隨筆12:游戲開發中常用的設計模式【C#面試題(中級篇)補充】

C#面試題(中級篇),詳細講解,幫助你深刻理解,拒絕背話術!-CSDN博客 簡單工廠模式 優點: 根據條件有工廠類直接創建具體的產品 客戶端無需知道具體的對象名字,可以通過配置文件創建…

數字人|通過語音和圖片來創建高質量的視頻

簡介 arXiv上的計算機視覺領域論文: AniPortrait: Audio-Driven Synthesis of Photorealistic Portrait Animation AniPortrait:照片級真實感肖像動畫的音頻驅動合成 核心內容圍繞一種新的人像動畫合成框架展開。 研究內容 提出 AniPortrait 框架&a…

數據結構實戰之線性表(三)

目錄 1.順序表釋放 2.順序表增加空間 3.合并順序表 4.線性表之鏈表實現 1.項目結構以及初始代碼 2.初始化鏈表(不帶頭結點) 3.鏈表尾部插入數據并顯示 4.鏈表頭部插入數據 5.初始化鏈表(帶頭結點) 6.帶頭結點的鏈表頭部插入數據并顯示 7.帶頭結…

Docker使用指南(一)——鏡像相關操作詳解(實戰案例教學,適合小白跟學)

目錄 1.鏡像名的組成 2.鏡像操作相關命令 鏡像常用命令總結: 1. docker images 2. docker rmi 3. docker pull 4. docker push 5. docker save 6. docker load 7. docker tag 8. docker build 9. docker history 10. docker inspect 11. docker prune…

C++基礎day1

前言:謝謝阿秀,指路阿秀的學習筆記 一、基礎語法 1.構造和析構: 類的構造函數是一種特殊的函數,在創建一個新的對象時調用。類的析構函數也是一種特殊的函數,在刪除所創建的對象時調用。 構造順序:父類->子類 析…

嘗試ai生成figma設計

當聽到用ai 自動生成figma設計時,不免好奇這個是如何實現的。在查閱了不少資料后,有了一些想法。參考了:在figma上使用腳本自動生成色譜 這篇文章提供的主要思路是:可以通過腳本的方式構建figma設計。如果我們使用ai 生成figma腳本…