→若打到物體,則判斷該障礙物是否可以跳過:
用畢氏定理射條剛好長度再多一點點的ray至牆壁,(不知道為甚麼高好長度的ray會偵測不到),看牆壁是否有高過這個ray的末端,被註解的Physics.CheckSphere作法也可以用。→若是不可跨越的障礙物則沿著障礙物表面左右分裂出2條路線。一開始先判斷 (hit.normal != previous_split_normal) 是減少split次數的做法,若這次打到的表面的法線方向與上一次分裂的相同,代表無須再分裂,繼續沿著目前的方向前行就好。MovePoint型態目前只是簡單的紀錄位置,之後會多些狀態告訴移動的物件走到這個點該做的動作(?Split方法:第294~297行是將hit normal轉90度與-90度:旋轉一個vector 90度的做法參考這篇。再乘個負號就變成-90度了。第298、299的做法也可以,GetRotated_Pos()單純是:
return Quaternion.Euler(0, angle, 0) * (currentPos - center) + center;
檢查兩條分裂的路線有沒有與來的路線相交,有相交的話就可以刪掉。
檢查作法:
當初在做分離軸碰撞判斷時,大量用到線段相交判斷:(影片的腳本可以看myCollider 和 core)原理是分別將碰撞器A與碰撞器B的所有頂點投影在碰撞器A、B所有線段的法線上,比較該碰撞器A、B投影下最大與最小點,看是否交叉。不過以上作法是因為碰撞器A和B是多邊形,所以要loop過所有頂點與線段,目前這個腳本只用到線段比較。
(因為太懶得畫示意圖,就直接用whiteboarding時的圖吧)
要用其中一條線當投影軸的原因是:
若投影軸單純用vector.up與vector.right,則下面這個情況會被當成有相交,但實際上並沒有。
將投影軸改以其中一條線為基準:(紅色箭頭代表v2線段的normal)
做這麼多就只是為了盡量減少split()分裂出線段
雜記: