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和...