TW尋路最優實踐2

2021-10-13 14:50:19 字數 1273 閱讀 5791

上次完成了初步的尋路設計方案之後,可以順利的進行靜態尋路了,但是對動態避障尋路支援並不好。經過跟專案設計者仔細研究,發現rvo等演算法並不能滿足現有需求,原因如下:

我們的動態障礙物是突然出現的,不是從某個其他方向走過來的

每個物件,都需要每隔一小段時間,就要檢查一下自己前進的方向是否有阻擋

我們不能由前端運算,因為有時差問題,只能由後端運算。

據此,我們需要另闢蹊徑,找到乙個適合自己的演算法。

由於我們的障礙物是可能突然出現在前方的,我們並不能像rov那樣預先計算,選擇乙個另外路徑,所以我們躲避障礙物的方式為:不會提前改變路徑,而是到障礙物面前後才改變。

下圖是rov避障演算法,藍點方陣知道障礙物(紅球)的存在,會與紅球相撞的藍點會提前改變路徑

rov避障演算法

下圖是我們的動態避障演算法,本來obj要從c點移動到k點,但是由於有障礙物的出現,於是到快與障礙物相撞的d點時轉向,走d-e-f-h-k各點,到達目標點與障礙物包圍圓切線位置時走直線奔向目標點

此演算法依賴於如下幾點前提條件:

障礙物都可以被圓包圍,不會無限大,按照圓(折線)躲避不會違和。

緊貼著障礙物的周圍是可以走的,也就是障礙物不能連起來形成更大的障礙。

本來要從n走到p點,結果走到o點時發現障礙物a。

將a的包圍圓分成12份,每份30度。

由於已知a點位置,圓半徑(基本都是固定半徑),ab與ac夾角度數(30度),所以可知b,c,d,e,,,m等12個點的位置

由於繞開障礙物只需要繞最多90度,所以最多隻需要走3個點。

當物件走到o點,發現障礙物時,首先計算a點在直線np的位置,如果a點在直線下方,則從上面繞;相反如果a點在直線上方,則從下面繞

計算ao夾角如果小於ad角則走折線od,其他以此類推

計算c點在直線dp的上方,則需要走折線dc

計算b點在直線cp的上方,則需要走折現cb

此時已經走了3個點了,可以直接走bp奔向目的地。如果不滿3個點,則計算下乙個點m在直線bp下方,則不需要走m了。

當a已知時,由於包圍圓的半徑是固定值,所以b,,m點通過加減法就可以得到

接下來在計算一次ao夾角(兩次浮點數乘法)

接下來最多計算3此點與直線的關係(每次是兩次浮點數乘法)

由此可見運算量是很低的,此演算法支援伺服器大規模運算。

遊戲演算法實踐 A星尋路

先展示效果圖 如圖中亮綠色點為起點,藍點為終點,白色為牆體不可行走。黃色點區域為被試探到的位置,綠色的路徑為最後的最短路徑。其中這裡移動規則是只能上下左右移動。建立乙個open集合,乙個close集合 把起點加入close集合,並把它設為current節點 重複如下過程 查詢current節點的相鄰...

2d 路點 尋路 PointGraph

很多時候,我們需要設計路點,讓物體或角色 按規定的路線走,這種做法 比 其他尋路 效率更高,當然 路徑是 固定的。我找了很多 路點 外掛程式 發現他們有乙個最大的問題,就是 不能走岔道,只能是一條路 走到黑,有多條路的時候,就不能用了。後來我 看了 astarpathfindingproject 尋...

深搜(2) 尋路 蛋糕

include include include include using namespace std struct rode int minlen 1 30,tallen,talcost 當前最優路徑長度,正在走的路的長度,花銷 vector cityway 105 cityway i 是從i有路...