閱讀筆記 遊戲開發中的人工智慧 第2章 追逐和閃躲

2021-06-04 00:19:38 字數 2941 閱讀 1308

1. 追逐/閃躲的組成

完整追逐/閃躲由三部分組成:

·作出追或逃的決策判斷(在後文談論到狀態機和神經網路時,再討論)

·開始追或逃(本章重點)

·避開障礙物(第五章和第六章,再討論)

2. 基本追逐和閃躲

假設:追逐者座標(predatorx, predatory),閃躲者座標(preyx,preyy) 

連續環境的基本追逐**

if(predatorx 

>

preyx) predatorx--;

else

if(predatorx 

<

preyx) predatorx

++if

(predatory 

>

preyy) predatory

--; 

else

if(predatory 

<

preyy) predatory++

複製**

連續環境的基本閃躲**

if(preyx 

>

predatorx) preyx++;

else

if(preyx 

<

predatorx) preyx--;

if(preyy 

>

predatory) preyy

++; 

else

if(preyy 

<

predatory) preyy--;

複製**

磚塊環境的基本追逐/閃躲**與連續環境的十分類似,這裡忽略。

3. 視線追逐

3.1 磚塊環境中,為什麼要視線追逐

圖-磚塊環境中的簡單追逐和視線追逐

左邊的是簡單追逐的影象,右邊的是視線追逐的影象。

簡單追逐算出來的肯定是最短的路徑,但是不一定能夠求得視覺上的直線,而直線追逐在視覺上會好很多。

另外,如果有一群攻擊者往玩家處聚攏時,簡單追逐會使得,在以目標為遠點的座標系中,他們沿著對角線走到距離最近的座標軸,然後再沿著該座標軸走向目標。這樣就相當於讓他們排成乙個縱隊發起攻擊。更加合理的做法是,分別從不同方向向目標逼近。

3.2 磚塊環境中,如何實現視線追逐

書中使用的是所謂的bresenham演算法,該演算法是在圖素環境中畫線最有效的方法之一。最原始的bresenham需要除法計算斜率,但是簡化版本的bresenham,利用乘法避免了減法的應用。

首先,bresenham確實是比較好的演算法,因為它能夠保證整條路徑的近似在一條直線上。而不簡單的是把兩種步子均勻化,可以說breseham更具有大局觀。

bresenham的演算法參見其中講的很好,只是注意其中關鍵的d-1的部分,其實是因為向右上方移動了,y座標加1,所以需要減1。把其中的公式乘以dx,就能得到不需要除法的推導過程了。 

3.2 連續環境中的視線追逐

這一小節討論的連續環境中的視線追逐是最簡單的追逐演算法,不過考慮了追逐者得移動不僅有線速度,還有角速度。演算法思路就是,首先根據角速度把方向轉到視線方向,然後向目標追過去。這一節中的更多的是介紹全域性座標系統和區域性座標系統。

圖-座標系統

區域性座標系統怎麼構造呢,即區域性構造系統的x軸,y軸方向怎麼確定的呢。其實就是認為追逐者當前的移動方向是y軸的正方向(當前追逐者靜止咋辦呢?這個還不知道),x軸正方向是y軸正方向逆時針旋轉90度得到。座標轉化關鍵是那個夾角。根據上面的公式,把追逐者的全域性座標(x',y')和區域性座標(0,0)帶入,就能算出來夾角的余弦和正弦值了。實際上,使用區域性座標系,是因為有現成的函式可以幫助座標進行座標系轉化,而座標轉化後,使用起來更加方便了。從下面**中也能發現,即在判斷向左轉還是向右轉的時候,只需要判斷視線向量的x座標的正負即可,當然這裡的方便性與前面區域性座標轉化的引數有很大關係即-predator.forientation,具體的還不清楚,沒接觸過vrotate2d這個函式。

void

dolineofsightchase(

void)

複製**

4. 攔截

攔截演算法的基本原理是能夠**獵物未來的位置,然後直接到那個位置去,是其能和獵物同時到達同一位置。為了找出追擊者和獵物能同時到達的點,不僅要考慮他們的移動方向,還要考慮他們的速度。其實很簡單,首先**追擊者追到獵物的最短時間,即,靠攏時間=相對位移/相對速度,如果追擊者不能改變方向的話,靠攏時間可能不存在,比如相對位移與相對速度方向相反,這就永遠都不可能靠攏,這一小節的最後對這種情況進行了簡單說明。有了靠攏時間,就能根據獵物的速度和初始位移,**到其在靠攏時間後的位置,這樣追擊者只有根據這個位置,採用前面的視線法追擊這個位置就好了。

這個攔截演算法對嗎?感覺還是有問題,根據書中說法,獵物和追逐者的速度向量和位移向量都是固定的,因為靠攏時間的計算,需要相對位移和相對速度。但是如果這些都是固定的話,很容易得到兩者很可能不會相遇的問題。更近合理的解釋應該是獵物的速度向量和初始位置向量固定,追逐者的初始位置和速度大小固定,而速度方向不固定,這樣通過調整方向來達到攔截的作用。計算可以採用靠攏時間的方法,不過是乙個方程。

5. 總結

這一章給出的還是一些基礎方法,第5章還會說明利用勢函式進行追逐或閃躲。   

6. 實踐

附件中是我自己實現的磚塊環境中的視線追逐,其中有三個演算法可選,第乙個是基本方法,第二個是bresenham方法,第三個是用除法和取模運算視線的方法。後兩種方法在一些情況下很很相似,當然也有不同的,個人感覺還是bresenham更好一些,畢竟有理論支援。

磚塊環境中的追逐演示程式:

程式截圖:  

圖-磚塊環境中的視線追逐演示

遊戲開發中的人工智慧

今天非常開心,cocos官方直播居然在幾千人中中獎,可以買彩票了。言歸正傳,所謂的人工智慧,也就是大家常說的ai artificial intelligence 一說到ai可能就會讓人覺得比較深奧,其實也就是非玩家角色思考和行為的綜合。比如,在什麼樣的條件下,觸發什麼樣的行為。其實我們在遊戲開發中的...

遊戲開發中的人工智慧 第2章 追逐和閃躲

一 追逐和閃躲有三部分組成 1 做出追和逃的決策判斷 在後文談論到狀態機和神經網路時,再討論 2 開始追或逃,也就是讓追擊者追獵物,或者讓獵物盡可能的裡追擊者遠一點 本章重點 3 躲避障礙物 第五章和第六章,再討論 二 基本的追逐和閃躲 1 更具獵物的座標修改追擊者的座標,使兩者的距離越來越短 2 ...

遊戲程式設計中的人工智慧 補

先抱怨下windows 64bit下的交叉編譯簡直折磨死人,倒騰了幾天之後決定還是切到linux下算了。虛擬機器雖然不給力,但是好歹能看出來優化後的結果。本文沒什麼講的,只是將上文說到的掃雷機的進化過程中耗時最長的函式用c重新寫一遍後比較下執行速度,廢話不多說,直接貼 看結果。原來判斷兩條直線ab和...