官术网_书友最值得收藏!

3.5 曲線上的簡單運動

對于曲線上任意的點P,指定該點處法平面上的一個向量作為法向量,然后結合該點處的切向量通過向量外積得到副法向量,由此可以建立一個局部坐標系。這里指定法向量N 為up向量,代表垂直的軸向;副法向量B為right向量,代表左右軸向;切向量T為forward向量,代表前后軸向。

由曲線引導的運動,這里定義為不“脫離”曲線的運動,即物體的運動必須要有對應的曲線上的線速度vs。首先由該線速度計算出在曲線上向前(或向后,由速度的符號而定)經過t后移動到達的新點P及其局部坐標系(T,B,N),然后以此作為物體運動位置新的基準,并且保證物體運動后的位置位于點P的法平面上,所以任意時刻的運動位置總是處在曲線上某點的法平面上,即曲線的“旁側”。我們注意到,這種運動計算方式只關心當前曲線上的基準點及其局部坐標系,以及經過t 后的曲線上的基準點及其局部坐標系,而基準點和局部坐標系是否由曲線得來并不重要,所以在實現物理模塊時可以和具體的曲線解耦,僅以基準點及其局部坐標系數據作為物理模塊的輸入。

在具體實例上,這里只討論在實際游戲中實現的跑動和跳躍(跌落)兩種運動。在這兩種運動中,曲線還有地面的作用,阻止物體的不斷下落;基準點局部坐標系的up向量的負方向為重力的方向。

3.5.1 跑動

曲線上的跑動需要處理懸空(跌落)問題,以及碰到障礙物的問題。

懸空主要有兩種情況,一種是遇到較陡的向下的坡,一種是走出支撐物的外沿,二者可以用統一的方式處理。

設當前的基準點和局部坐標系為,經過t 后新的基準點和局部坐標系為,當前對象位置為Loci,相對于新的基準點的高差為

當遇到較陡的向下的坡或者在高出曲線的支撐物上移動時,有H >0,此時先嘗試將對象移動到點PH

然后從該位置沿著-Ni+1方向在跌落閾值FH范圍內測試是否存在碰撞體可以作為支撐物:如果存在支撐物,若,則沿著-Ni+1方向移動到和支撐物接觸的位置,若,則直接移動到曲線上的點Pi+1;如果不存在支撐物,若,則從跑動狀態轉為跌落狀態,結束本幀的處理,若,則移動到曲線上的點P i+1。對于H≤0的情況,曲線為平直的或上坡,可以直接將對象移動到點Pi+1

在移動對象的過程中,可能碰上帶有碰撞的障礙物。根據位移向量和碰撞體表面法線的關系以及接觸位置可以分為兩類:一類是無法沿著接觸表面移動或繞過的障礙物,導致當前的運動發生截斷,停留在接觸的位置上,阻止對象繼續產生位移;另一類是可以沿著接觸表面滑動或繞過的障礙物,這種情況無法將對象移動到預期的位置,但是可以持續移動到基準點的法平面上。一般的商業引擎對這樣的情況都有處理,如Unity3D的CharacterController。

3.5.2 跳躍

跳躍狀態的觸發來自跑動狀態的轉換(自然跌落)和玩家(主動跳躍)。

一般場合下的跳躍會分成水平和垂直兩個方向分別處理,曲線上的跳躍也做相同的處理,其中水平速度分量始終為曲線上的線速度,是一種曲線上投影速度恒定的做法,與對象實際經過的位移過程無關。所以,同時運動且具有相同水平速度的兩個對象,無論實際運動路徑如何,總是處在相同基準點的法平面上。

同跑動,設當前的基準點和局部坐標系為,經過t 后新的基準點和局部坐標系為++++,當前對象位置為Loci。由LociNi可以構建一個平面:

該平面和直線

的交點記為PNN,顯然PNNPi+1的法平面上。這里將對象移動到PNN,位移向量

Pi的切平面平行,可以看作是原水平運動方向Ti被引導曲線改變了方向,圍繞Ni發生了旋轉,使其指向新的基準點Pi+1N軸。

對于垂直方向,根據重力加速度更新速度的標量值:

使用新的基準點Pi+1的-Ni+1向量作為重力方向計算垂直方向的位移向量:

最終的位置為

在下落過程中如果遇到可以作為支撐的碰撞體,則轉為跑動狀態。其他碰撞體的處理方式類似于跑動。

3.5.3 相鄰路徑的切換

跑酷類游戲有切換跑道的操作。得益于物理計算與具體曲線的解耦,路徑的切換也可以對物理計算透明。

設當前路徑曲線為,切換的目標路徑曲線為,觸發切換路徑時,設當前在上的基準點為,其法平面為

計算該法平面與曲線的交點,該交點對應的曲線參數為,局部坐標系為。該點為基準點上的等位點,在此將路徑切換到,且從等位點開始接替在上的移動計算。路徑的切換不能瞬間完成,需要一個將對象從路徑移動到路徑的過程。為此,將變換到上基準點的局部坐標系下,這里設其變換后的值為,在對象完全移動到路徑之前,將和(O, X, Y, Z)(O為局部坐標系的原點(0,0,0), X, Y, Z 為局部坐標系的三個坐標軸(1,0,0), (0,1,0), (0,0,1))插值的結果轉換到世界坐標系,作為當前基準點及關聯的局部坐標系輸入給物理模塊。將變換到上基準點的局部坐標系下,好處是路徑切換一旦開始,就只與目標路徑相關,源路徑如何變化不會影響切換的過程,例如,在路徑的切換過程中兩條路徑走向了不同方向。圖3.4展示了路徑切換的過程,其中綠色虛線為實際的移動路徑,由和(O, X, Y, Z)插值而來;橙色虛線表示轉換到局部坐標系后發生路徑切換時的的基準點

圖3.4 路徑切換插值軌跡

3.5.4 曲線上的旋轉插值

每一個路點都有位置和旋轉屬性。旋轉可以分解出三個坐標軸,所以物理計算所依賴的基準點局部坐標系(T, B, N)可以通過分解基準點處的旋轉獲得,而基準點處的旋轉通過對兩個路點的旋轉插值獲得。根據不同的需求,還可以選擇插值得到的旋轉是否對齊到曲線的切線。旋轉插值對比如圖3.5所示。

圖3.5 旋轉插值對比

對于二次曲線構成的路徑而言,需要注意相機的旋轉最好不要和曲線的切線相關聯(如將鏡頭對齊到曲線上),而是獨立計算相機的運動。由于二次曲線只有C1連續,相機的朝向和曲線的切線方向關聯會令鏡頭朝向的變化產生人眼可察覺的生硬感。

主站蜘蛛池模板: 桃园县| 滨海县| 济源市| 葫芦岛市| 中方县| 略阳县| 孟连| 临漳县| 休宁县| 霍山县| 长白| 柞水县| 荔浦县| 平邑县| 霍邱县| 建昌县| 上杭县| 嵊泗县| 柳河县| 榆中县| 邵武市| 古交市| 永德县| 双流县| 灌云县| 巍山| 莱芜市| 通城县| 桐乡市| 夹江县| 偏关县| 阳信县| 安多县| 井研县| 元谋县| 武安市| 依安县| 全州县| 嘉义县| 东光县| 虞城县|