路徑跟蹤是遊戲開發中乙個經常出現的問題。此教程涵蓋引導行為的路徑跟蹤,這裡的路徑是提前根據點和線預設好的。
注意:雖然此教程是用as3和flash實現的,你也可以在其他語言開發環境下使用這些類似的技巧和概念。當然前提是需要有基本的數學向量的知識。
介紹路徑跟蹤可以用多種方式實現。reynolds原型就是使用線來實現的,這裡需要嚴格的按照線來實現。
根據不同情況,準確度要求不同。角色可以根據線路運動,但是只是做乙個參照而不是嚴格按照軌道來執行。
此教程的路徑跟蹤是reynolds原型的簡化實現。執行效果不錯,但是嚴重依靠數學的向量投影計算。
設定路徑
路徑可以是線連線的點的集合。即使曲線也可以用來描述路徑,點和線處理處理得到相同的結果要簡單的多。
1如果需要使用曲線,則可以將其簡化為一些連線的點:public
class
path28
9public
function addnode(node :vector3d) :void
1213
public
function getnodes() :vector.
16 }
曲線和直線
path類將用來描述路徑。一般來說此類包含乙個點向量和一些處理列表的方法:
每個路徑中的點都是乙個三維空間中點的表示方式,角色的位置也是如此。
逐個節點移動
為了根據路徑導航,角色從路線起始逐個節點移動直到到達路線末點。
路徑中的每個點都可以看做為乙個物件,因此行為檢視如下所示:
挨個點檢視
角色會不斷檢視當前點,直到到達為止,然後路徑中下乙個點作為當前點。正如前面的碰撞避免教程中所述,每個行為的力都是在遊戲更新時重新計算,因此從乙個節點到另乙個節點是圓滑的。
character類需要兩個額外的屬性來引導導航過程:當前節點和路徑跟蹤的引用。
類如下所示:
1pathfollowing()函式用來產生路徑跟蹤方向,當前是沒有的,但是它還是會選擇合適的目標。path!=null測試角色是否跟蹤任何路徑。如果是的話,就用當前節點作為當前目標。public
class
boid221
}22}23
24return
null;25
}2627private
function distance(a :object, b :object) :number
30(...)
31 }
如果當前點和角色位置之間的目標數少於10,意味著角色已經到達當前節點,如果上述成立則將currentnode增加一,表示角色將在路徑中尋找下乙個點。整個過程迴圈執行,知道路徑裡沒有點為止。
計算和新增方向
促使角色在路徑中不斷尋找節點的是尋找力。pathfollwing()函式以及選擇了合適的節點,現在需要返回促使角色前進的的節點:
路徑追蹤後會計算方向,然後加到角色速度向量裡:
1路徑引導方向跟追尋行為類似,角色不斷根據目標調整方向。不同之處在於角色是在尋找乙個不動的目標,這樣就可以在角色逐漸靠近的時候忽略另乙個。private
function
pathfollowing() :vector3d 15}
16}1718
return target != null ? seek(target) : new
vector3d();
19 }
結果如下:
1 steering = nothing(); //實際中的路徑跟蹤。點選來檢視方向。the null vector, meaning "zero force magnitude"
2 steering = steering +pathfollowing();
34 steering =truncate (steering, max_force)
5 steering = steering /mass
67 velocity = truncate (velocity +steering, max_speed)
8 position = position + velocity
柔化軌跡
當前的實現需要所有角色接觸路徑中的點來選擇下乙個目標。因此角色可能執非預期的動作模式,例如圍繞乙個點圓周運動直到到達。
實際中,每個運動都遵循最優原則。例如乙個人不可能總是在走廊中間行走。如果是乙個拐彎,那麼人會不斷靠近牆,然後拐彎來縮短距離。
上述的模式可以通過在路徑中新增半徑來不斷重複。將半徑應用到點,就可以看到路徑的寬。這樣就可以控制角色不斷沿著路徑走。
半徑對路徑跟蹤的影響
如果角色和點之間的距離小於等於半徑,那表示已經到達點。這樣就可以根據線和點來做引導。
利用半徑進行路徑跟蹤。點選force按鈕來檢視方向,點選+跟-按鈕來動態調整半徑尺寸。
半徑越大,路徑越寬,角色拐彎的距離也就越大。半徑的值可以用來產生不同的追蹤模式。
前進和後退
有時候需要讓角色不斷移動,直到到達路徑末尾。例如在巡邏模式中,角色需要在到達末尾後返回起點,追蹤相同的點。
我們可以在character類裡新增pathdir屬性。此屬性是乙個整型值,用來控制角色沿著路徑的方向。如果pathdir是1,則表示向路徑末尾運動,-1表示向起始點運動。
pathfollowing()函式做如下改動:
1跟之前版本不同,此處的pathdir新增到currentnode屬性裡。這樣就允許角色選擇基於當前位置的路徑的下乙個點了。private
function
pathfollowing() :vector3d 16}
17}1819
return target != null ? seek(target) : new
vector3d();
20 }
然後通過乙個測試來檢測角色是否到達路徑末尾。如果到達,就將pathdir乘以-1,也就是取相反值,來讓角色反方向行走。
結果是乙個不斷來回運動的模式:
上述是利用半徑的來回路徑追蹤模式。點選force按鈕來顯示方向,點選+或者-來動態調整半徑尺寸。
總結路徑追蹤行為執行任何角色按照預先設定好的路徑運動。路徑是根據點來指引,可以調寬窄,產生不同運動模式來更貼近現實。
此教程中涵蓋的實現時給予reynolds提出的路徑追蹤行為原型的,但是還是獲得良好的效果。
flink 使用者購買行為跟蹤
電商公司出於提高使用者的復購率 粘連度等目的經常會推出各種營銷手段,運營部們希望資料中心能實時跟蹤使用者的購買行為作為推送各種優惠的依據,能實時把可以推送優惠券的使用者推送給相關應用 我們把使用者的各做操作抽象為以下四類 實際中會更多 view product add to cart remove ...
導航與路徑跟蹤演算法
入門參考 路徑規劃演算法 1.a 演算法 a 演算法的特點是設計出評價函式。可參考的入門部落格有導航路徑規劃之五 a 演算法 2.prm路徑規劃演算法是一種基於圖搜尋的方法,它將連續空間轉換成離散空間,再利用a 等搜尋演算法在路線圖上尋找路徑,以提高搜尋效率。3.d 演算法是動態a d star,d...
主引導扇區的理解
什麼是主引導扇區?master boot record 它是硬碟上的第乙個扇區,由硬碟廠商就預留了。乙個扇區的大小通常是512個位元組。主引導扇區,不依賴於具體的作業系統,也就是說主引導扇區可以啟動任何一種作業系統。它的作用是什麼?裡面儲存了什麼資訊?裡面儲存的是硬碟的基本資訊,包括硬碟分成幾個區,...