這篇主要是探討實作面的東西,所以開了一個新的項目。
最近因為有朋友問到關於AI障礙物避免的問題,所以我實作了一個簡單的DEMO。這篇使用的作法來自於"Game Programming Gems 3"第三章裡的動態障礙章節,先放上程式碼:
這個作法的概念是把物體都當成一個圓去處理,然後把我方的半徑加在障礙物上面, 我方就變成一個點,然後製作一個探針,長度是我方的半徑加上障礙物的半徑,把這個探針的點拿來跟障礙物算碰撞,如果有碰撞,就算出圓的最右的點,接下來把這個點再跟其它障礙物算碰撞,如果有碰撞,再求出這個障礙物最右邊的點,依此循環,就可以求出最右邊可以閃過障礙物的點,然後用這個點減掉我方座標,當成新的方向,然後一路往最右邊的點移動,沿路仍然不斷計算前方是否有其它障礙物,如有的話,重新計算新的避免點。最後完全避免掉障礙物後就一路往目標快樂奔去~~。
這個作法其實要算左右兩邊,但如果你一開始是轉右邊,那就要一路往右邊算,左邊同樣,因為DEMO,所以我沒完成這部分,那這個方法可搭配A*來做小範圍的區域避障,有不錯的效果,但還有一些細節要處理,例如障礙物可能已經到牆壁了,那可能就要改成走另一邊,或跟物體重疊了,那就給予一個排斥力來脫離重疊。
上圖是測試畫面,歡迎大家一起討論。