Flight Agent 實作 -> Boid 行為

原本是打算作一個太空射擊的 Prototype 的然後就變成 Flight AI 研究了.

經過一週下班後的研發, 總算是依照我想的用物理飛起來了.

以下是測試的概念的原形, 在浪費了3,4 天進行加速及向量角的學習後…..最後小弟還是決定靠 hack.
前天做的一個物理小測試, 確認了製作方向.
就是做扯線木偶的戲碼. 影片就是設定關係方式, 其他的物理測試請自行無視.
然後為了 FlightAgent 能夠正確的吃上物理反映, 放棄使用 tweening, 的方式. (這可是本來的初衷, 並不是找坑自己跳…嗯…)
經過一輪的優化及重寫後,總算是把速度控制及剎車系統造出來.

找了一些飛行理論, Boid 好像只要是 AI 入學就會碰一下的樣子, 所以來實際建構一下.

Ref: Boids
Separation: (分離)
Alignment: (對準)
Cohesion: (聚集)
在 Youtube 上有很多人已經實作過.

還附上參考程序碼 : https://github.com/skooter500/Fish
(需然程序的資源管理有點爛, 可以相關 Boid 部份的邏輯是沒錯的.就先致謝了 😀)
實際加插非常簡單, 真的就只有幾個向量.
 
在原本只能跑直線的 FlightAgent, 加入 Boid 的三大行為後, 立馬變得容易調整.
這是靜止狀態下的 100 ~ 500 boids 同時運行的測試.
調控 S,A,C 三個參數可以達到 Agent 之間的空間調整.
調整產色則是顯現不同的向量關係. 這些向量最終會依不同的比重結合為一個向量, 並以此施加作用力到 BoidAgent 的 Rigidbody 上面.
馬上再來實在跟隨目標的效果…….
然後……..不出意外的壞具了, 因為這三大行為沒有包含族群行為的描述, 只是單純的假設了在附近的就是朋友.
所以又花了點時間在制作它對其他 agent 的撿測編程上.
這裡面原本是打算用 Raycast 的, 可以寫著就覺得不對勁. 假設運行 1000 多個的話全方位 Raycast 需要的 overhead 絕對比直接 foreach List<Agent> 慢.
結果就把 Raycast 給刪掉了. 再來又是一系列的修整優化.
這測試預定了兩個跟隨軌道的目的地元件, 不同顏色的 BoidAgent 會追隨不同的目標.
在距離接近時則依目前方向的角度差來判斷族群關係.
在目標一致時則溶入族群, 並且儘量避免互相碰撞.

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *

*