動態(tài)避障 Dynamic Obstacle Avoidance
我們在進(jìn)行實(shí)際的AI操作時(shí),和之前的避墻會有區(qū)別剩晴,當(dāng)我們在運(yùn)動時(shí)或者障礙物靠近時(shí)妻往,應(yīng)該如何去避免障礙物,這里就需要用到動態(tài)避障犀农。
關(guān)鍵思想(設(shè)置探針(Unity中使用射線),做碰撞檢測)
探針: ahead=position+normalize(velocity)*Max_SEE_AHEAD
Ahead為向量末端的坐標(biāo)
與其碰撞的物體即為將要發(fā)生碰撞的障礙物宰掉。
Paste_Image.png
- Ahead的模越大呵哨,探針也就越長赁濒,就能更早的躲開障礙物。
- 虛線為避障路線
Paste_Image.png
Check for collision(碰撞檢測)
- 做碰撞檢測時(shí)一般使用兩個(gè)探針ahead 孟害,ahead2拒炎,ahead2為0.5的ahead,設(shè)置兩個(gè)探針是為了避免障礙物已經(jīng)在ahead里面的情況挨务,因?yàn)榕鲎矙z測是里ahead點(diǎn)到障礙物圓心的Distance進(jìn)行判斷的击你。
Paste_Image.png
注意!;驯6≈丁!在unity中由于使用的是射線進(jìn)行檢測所有在只有一根射線的時(shí)候朝巫,射線的長度就不能很長鸿摇,而是盡量的短一點(diǎn),以避免以上檢測不到的情況(許多小障礙物會直接透過去)劈猿。
碰撞檢測原理
Paste_Image.png
Paste_Image.png
- 當(dāng)同時(shí)檢測到兩個(gè)障礙物的情況時(shí)拙吉,要先去判斷最威脅的一個(gè)障礙物,也就是距離最近的障礙物揪荣。
- The Closest obstacle(most threatening) is selected for calculation
Paste_Image.png
計(jì)算碰撞的操控力
Calculating the Avoidance Force
Paste_Image.png
- 在判斷ahead離圓心遠(yuǎn)近時(shí)筷黔,如果離得遠(yuǎn)則給一個(gè)較小的操控力,離得近則給你一個(gè)較大的力仗颈,這里給一個(gè)恒定的力來實(shí)現(xiàn)佛舱。
Paste_Image.png
Avoidance force calculation. The dashed orange line shows the path the character will take to avoid the obstacle.
應(yīng)用操控力
Paste_Image.png
碰撞檢測的改進(jìn)
Paste_Image.png
- 當(dāng)避障體已經(jīng)在障礙物中時(shí)的處理方法,還要對this.transform.position與圓心距離進(jìn)行判斷挨决。
Paste_Image.png
- 第二種情況
- 第二種情況發(fā)生在物體在旋轉(zhuǎn)時(shí)遇到的碰撞檢測
Paste_Image.png
Paste_Image.png
解決方案
Paste_Image.png
檢測速度名眉,當(dāng)速度為0時(shí),不對它添加操控力凰棉。
如果有速度,這根據(jù)這個(gè)速度的模和最大速度之間的比例進(jìn)行控制陌粹。
dynamic_length的長度為0-1.