從代碼理解梯子上的移動

相關(guān)代碼(CGameMovement::LadderMove):https://github.com/alliedmodders/hl2sdk/blob/78dab58646d5983c77af44c45a877b89196eb82c/game/shared/gamemovement.cpp#L2854-L3014

1. 代碼理解
梯子是一個(gè)可以攀爬的固體。如圖,把玩家攀爬的那一面的垂直方向定義為X軸,把梯子向上的方向定義為Z軸,然后就有垂直于X,Z軸的Y軸。
由玩家的視角和移動操作(WASD)得到向量v(粉色):若前進(jìn)(W)或后退(S),就在玩家視角的正前方增加200. 若向左(A)或向右(D),就在玩家的左方或右方增加200.
在梯子上獲得速度是瞬間的,此速度的計(jì)算方法:將向量v分為兩部分,一部分是垂直于X軸(即平行于梯子平面,綠色部分)設(shè)為V_yz,一部分平行于X軸(即垂直于梯子平面,黃色部分)設(shè)為V_x。最終速度為:V_yz部分不變。V_x部分旋轉(zhuǎn)90度,使得指向平面的速度轉(zhuǎn)為向上。然后兩者相加。這樣,正對梯子按W也可向上攀爬。
在CSS和CSGO中,還有“Ladder Dampen"機(jī)制:當(dāng)向量v的xy部分(V_xy, 白色部分)與X軸正方向夾角大于135度時(shí)(即點(diǎn)乘小于-0.707, 此值由sv_ladder_angle控制),就將向量v沿y軸的速度(V_y, 藍(lán)色部分)乘以0.2(由sv_ladder_dampen控制)。這個(gè)機(jī)制可能是為了防止玩家意外從梯子側(cè)面掉下。
輔助理解:
以視角看正上的WD快速上梯為例:W產(chǎn)生向上的200速度,D產(chǎn)生指向梯子的200速度。D的200速度改為向上的速度。兩個(gè)200相加得到400速度。實(shí)際操作中不能看向正上,所以得到的速度略小于400.
2. 可視化
圖片是從上向下看,其中view是視角,n是垂直于梯子平面的向量,v是上一節(jié)的向量v.
設(shè)view逆時(shí)針旋轉(zhuǎn)的角度為x(0度為圖片右方),俯仰的角度為y(0度是水平,正數(shù)表示向上看)。
假設(shè)按下了WD鍵,則獲得的向量v如圖所示。

建立坐標(biāo)系,橫坐標(biāo)是X,正方向向右,縱坐標(biāo)是Y,正方向向上。

綠色表示更偏向縱向速度,紅色表示更偏向水平速度。藍(lán)色框內(nèi)是兩個(gè)角度各在0-90度的結(jié)果。有兩條顏色明顯變化的弧線,這是"Ladder Dampen"的影響。
以上圖片使用以下代碼計(jì)算得到:
script.js:
index.html
以上結(jié)果也支持此文中的經(jīng)驗(yàn):


3. 實(shí)驗(yàn)驗(yàn)證
在CSGO中找到一個(gè)視角和移動速度:

視角為(46.07水平,89.00豎直),速度為(水平146.46, 豎直336.21)。
將視角用以上代碼計(jì)算:
計(jì)算結(jié)果與游戲符合得很好。