標籤:

遊戲中基於運動學的運動演算法

運動是遊戲AI中一個最基本的問題。

在遊戲中,運動主要是要更新物體的位置、方向、速度。對於他們的控制演算法可以分為兩大類,一種是基於「運動學」(Kinematics)的,另一種是基於「動力學」(Dynamic)的。簡單來說,運動學的演算法直接控制速度。而動力學的演算法通過控制力,來控制速度。

這兩種方法現在都有使用,主要根據遊戲的特性來選擇,而且也比較容易分辨。使用運動學演算法的遊戲,往往角色的移動沒有慣性,想走就走,想停就停,也沒有加速、減速的過程,現在大多遊戲是使用這種方法。使用動力學演算法的遊戲,有慣性,有加速減速過程,典型的是賽車競速遊戲。

這篇文章主要介紹基於運動學的運動演算法,並以二維情況為例。該演算法非常簡單,只涉及中學物理知識。

數據結構

演算法涉及兩類數據,一類是描述靜止狀態的變數(位置、方向),另一類是描述運動狀態的變數(速度、角速度)。

就二維的情況而言,一般用一個二維向量描述物體位置,再用一個角度描述方向。也有一些情況,用一個單位向量描述方向(大部分是三維的情況)。速度、角速度的描述方式和位置、方向的描述方式對應。

方向的控制

絕大多數使用了運動學演算法的遊戲中,會直接忽略角速度。他會讓角色始終朝向運動方向(例如魔獸世界)。但是也有例外,比如魔獸爭霸。熟悉Dota的應該知道,Dota中不同英雄的轉身速度是不同的

追蹤

以追蹤為例來講述運動學的運動演算法。在追蹤這個任務中,有一個本角色,還有一個目標角色。簡單的說就是本角色追著目標角色跑。每個角色除了有自己的位置、方向、速度、角速度外,還需要一個最大速度。

我們馬上就能想到,在遊戲的每一幀,本角色通過目標角色的位置就能更新自己的速度。並且直接將速度設為最大速度。在真實世界中確實是如此,但在遊戲中這樣是有問題的

遊戲的世界和真實世界有一個區別,真實世界的時間是連續的,遊戲世界的時間是離散的。例如每秒60幀,那麼對於遊戲而言這一秒就只有60個時間點。這樣一來,如果按照上面的方法,即使目標角色是靜止的,本角色也會繞著目標角色搖擺。因為恰好追到目標角色的時間點是達不到的。

為了解決這個問題,我們可以設定一個目標距離,只要小余那個目標距離,就可以停止。但這樣仍然存在問題,當角色速度過快,或者幀數過低的時候,為了避免搖擺的問題,我們不得不設定比較大的目標距離。

為了解決這個問題,我們可以給本角色設定一個減速的機制,即隨著距離減小,將速度也減小。一種比較好的演算法是:

本角色速度=min(最大速度, a/距離)

此處 a 是一個可調的參數。這樣一來,本角色在距離目標角色較遠時就會以最大速度追蹤,到一定範圍內時,就漸漸減小速度,最終趨於無窮小。用這個演算法,既解決了搖擺問題,也不再需要設定目標半徑。當目標角色逃離時,本角色還會加速追蹤。

另外,這個追蹤的演算法可以一些改變,例如,本角色在決定速度方向時,先預測目標角色未來的位置,根據目標角色未來的位置決定本角色的速度方向。未來位置是可以根據目標角色的速度來預測的。

除了追蹤以外,還有很多其他任務,但基於這樣的思想,也都大同小異。

推薦閱讀:

《伏龍記》ea實錄(week6)
遊戲開發的發展前景
Dice (EA) 工作室遊戲開發技術概覽
GML 學習手記(GML概況二)
一套戰棋遊戲規則

TAG:遊戲開發 |