動作游戲中的攀爬的實現(xiàn)
首先說明在xy平面上的移動、旋轉方式。
對于攀爬在xy平面的實現(xiàn),首先要克服的困難是圖上紅色箭頭標識的兩種拐角。
以下將其稱之為“崎嶇旋轉”

看下圖,我將右邊的復雜地形抽象為了左邊,右邊的地形雖然復雜,但是本質上實現(xiàn)對90°角的旋轉是可以通用到其他角的。


通過射線實現(xiàn)的方式總是難以適配重疊的模型,這是很致命的。
對于這種難點的克服,我采取的手段是使用兩個小球模擬“手”,對巖石進行抓取。

兩個小綠球是——以物體中心為圓心,半徑為r的圓上的點。
通過將兩個小綠球作為攀爬者的子物體,使用相對坐標,我們的圓公式就可以不去關心圓心,使用x^2+y^2=r^2。
當已知x和r時,對可求y^2,兩個球分別代表的就是當有一個x時,通過y^2求得的(x,y)(x,-y)位置。
詳細解釋是:
我們通過圓公式定義了一個Position限制,使得點只能在圓形軌道上運行。
通過取樣這兩個在軌道上的點,得到物體當前正確的面朝向。

攀爬對象面朝向 = (左手向量與世界forward夾角+右手向量與世界forward夾角)/2
如果是單純的對碰撞發(fā)生處的法相取樣,對于這種直角,會出現(xiàn)90-45-90的僵硬過渡。
如上得到,模擬左右手的兩個小球,得到兩個小球的位置(x1,y1)、(x2,y2)。
左球和右球的x并不相等,我們要做的事情就是旋轉“攀爬者”,使得左右兩個球的x相等。
這里的(x1,y1)、(x2,y2)兩個小球作為子物體,相對父物體“攀爬者(圓心)”的位置,是相對位置。
當旋轉“攀爬者”時,保持兩個小球世界位置不動,由于父物體旋轉導致的坐標系的旋轉,這個(x1,y1)、(x2,y2)也會隨之改變。
當“攀爬者”的旋轉 = “攀爬對象面朝向 = (左手向量與世界forward夾角+右手向量與世界forward夾角)/2”時,就是(x1,y1)、(x2,y2)變?yōu)?x,y)(x,-y)的時候,此時攀爬者將有一個正確的面朝向。
這里的左手、右手向量是通過世界絕對位置計算的,在“攀爬者”旋轉時,要保持兩個小球的世界位置不動。
原理是這樣的,在實際開發(fā)中要使用插值來保證對象在旋轉中也可以隨便移動。