原文位址連結:http://gamedevelopment.tutsplus.com/tutorials/understanding-steering-behaviors-seek--gamedev-849
位置,速度和移動
在行為控制中的所有的算法實作都是通過數學上的向量計算來實作的。由于這個控制會改變人物的速度和位置,是以同樣的我們也可以使用向量來表示這些屬性。
雖然向量擁有一個方向,但是當用向量來表示一個位置的時候,我們往往可以忽略它的方向:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISN0QTNzkTN5AjMwcDM0EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
上面的圖中P向量表示的是一個點(x,y),V向量表示的是一個速度(a,b),我們可以通過歐拉積分的方法來計算人物新的位置:
position = position + velocity ;
速度向量的方向控制了一個人物将要向哪個方向移動,速度向量的大小控制了人物每一幀将會移動多少距離。這個長度越大,那麼人物每一幀移動的距離就會越大。我們可以通過速度向量的長度來確定,速度的大小不會高于某個指定的值。
我們可以通過施加力來實作seek行為,也可以不施加力,僅僅施加一個改變速度,也能夠模拟出來。比如如下的代碼闡述了在不施加力的情況下如何進行seek行為:
velocity = normalize(target - position) * max_velocity ;
我們需要注意的是,如果不使用施加力的方式,那麼一旦seek的目标發生了變化,人物的速度也運動方向将會在瞬間發生改變,是以就會變得不是那麼的圓滑。
計算力
如果隻有速度方向上的力參與改變的話,那麼人物角色将會沿着一條直線進行運動。是以,我們可以通過增加一個力來改變人物的移動,不同的力将會導緻物體移動向不同的方向上去。
對于seek行為來說,每一幀增加一點控制力将會很平滑的改變人物移動的速度和方向,避免出現瞬間改變方向的問題。當目标發生移動的時候,施加力的方案也能夠很好的平滑的改變速度,使得人物到達目标點。
seek行為需要如下的兩種向量:期望速度和控制力:
上圖中的desired velocity就是最終人物要到達的速度方向。而steering就是需要增加到人物上面的行為控制力,通過這個控制力,就會将人物推向了目标地點。
這些力可以通過如下的算法求得:
desired_velocity = normalize(target - position) * max_velocity ;
steering = desired_velocity - velocity ;
增加力
當控制力計算出來之後,我們就需要将這個力添加到人物中去。每一幀我們都需要計算新的steering控制力,這樣才能夠保證每一幀物體都是朝着目标的方向前進的。下圖中可以看出,我們的seek路徑并不是一條直線,而是很平滑的一條曲線:
下面的代碼表示了如何增加力:
steering = truncate(steering, max_force);
steering = steering / mass ;
velocity = truncate( velocity + steering, max_speed);
position = position + velocity ;
上面的計算方式保證了,我們添加的力在可允許的範圍之内。我們還将這個力除以了人物的品質,這樣就會産生不同品質的物體,他們改變的頻率并不一緻,是以這樣就會看上去更加的豐富了。
結論
行為控制能夠産生很多不同的,比較真實的移動效果。我們很容易的就能夠通過目前的資訊計算出新的控制行為出來。即使計算的方法非常的簡單,但是,我們依然能夠建立出很多比較有趣和複雜的運動方法出來。