Pursuit 追逐
-
pursuit與Seek和Arrive的區(qū)別
- Seek是尋找到目標(biāo)并移動到目標(biāo)附近圍繞著目標(biāo)移動
- Arrive是抵達(dá)目標(biāo)點(diǎn)位置
- pursuit則是追逐著目標(biāo)懂讯,但卻是智能的追逐并不是跟隨著目標(biāo)的移動路徑而進(jìn)行追趕,而是預(yù)測到目標(biāo)想要移動的位置進(jìn)行追逐踪少,體現(xiàn)更加的智能化契耿。
-
那什么時(shí)候用到Pursuit呢椒惨?
- 當(dāng)一個(gè)智能體需要攔截一個(gè)可移動的目標(biāo)時(shí)碌奉,Pursuit行為就相當(dāng)?shù)挠杏谩?/li>
- 預(yù)測目標(biāo)物體的未來位置翁都,然后移向那個(gè)偏移位置碍论,其間通過不斷的調(diào)整
Paste_Image.png
- pursuit算法原理
Paste_Image.png
- 首先我們需要得到追逐者和目標(biāo)點(diǎn)的向量
Paste_Image.png
- toTarget則是上圖中反映的綠色箭頭向量。
- relativeDirection:為兩個(gè)向量向前的點(diǎn)乘柄慰,由于兩個(gè)Forward都是單位向量鳍悠,所以根據(jù)點(diǎn)乘公式|a||b|Cosθ税娜,最后得到的relativeDirection就是Cosθ,
Cosθ反映了兩個(gè)物體當(dāng)前移動方向的夾角,通過Cosθ得到的值進(jìn)而對Pursuit行為進(jìn)行控制藏研。
Paste_Image.png
-
接著開始我們的代碼部分敬矩,首先我們將判斷它們之間的夾角,第一個(gè)條件是它們的點(diǎn)乘>0蠢挡,則說明0<θ<180弧岳,并且relativeDirection<-0.95f,這里的-0.95f相當(dāng)于161度則它們的夾角在161<θ<180业踏,則說明它們是面對面的在運(yùn)動禽炬,直接使用Seek行為的代碼。
- 反之不是面對面的情況就需要估算一下它們將在什么地方相遇
Paste_Image.png
- rouphTime為粗略估計(jì)的相遇時(shí)間
- desiredVelocity則時(shí)原理圖中的紅線勤家,target.position(逃避者的位置)+target.velocity*rouphTime(逃避者即將到達(dá)相遇位置的向量) -this.transform.position(當(dāng)前追逐智能體的位置)腹尖,這樣就可以直接給追逐體一個(gè)操控力讓他直接從當(dāng)前位置移動到預(yù)測的相遇位置。
- 實(shí)現(xiàn)效果:
Paste_Image.png
Evade
Paste_Image.png
- 簡略的做法:
Paste_Image.png
- 精確的做法
Paste_Image.png