相关代码(CGameMovement::LadderMove):/alliedmodders/hl2sdk/blob/78dab58646d5983c77af44c45a877b89196eb82c/game/shared/#L2854-L3014
1. 代码理解
(资料图片仅供参考)
梯子是一个可以攀爬的固体。如图,把玩家攀爬的那一面的垂直方向定义为X轴,把梯子向上的方向定义为Z轴,然后就有垂直于X,Z轴的Y轴。
由玩家的视角和移动操作(WASD)得到向量v(粉色):若前进(W)或后退(S),就在玩家视角的正前方增加200. 若向左(A)或向右(D),就在玩家的左方或右方增加200.
在梯子上获得速度是瞬间的,此速度的计算方法:将向量v分为两部分,一部分是垂直于X轴(即平行于梯子平面,绿色部分)设为V_yz,一部分平行于X轴(即垂直于梯子平面,黄色部分)设为V_x。最终速度为:V_yz部分不变。V_x部分旋转90度,使得指向平面的速度转为向上。然后两者相加。这样,正对梯子按W也可向上攀爬。
在CSS和CSGO中,还有“Ladder Dampen"机制:当向量v的xy部分(V_xy, 白色部分)与X轴正方向夹角大于135度时(即点乘小于-, 此值由sv_ladder_angle控制),就将向量v沿y轴的速度(V_y, 蓝色部分)乘以(由sv_ladder_dampen控制)。这个机制可能是为了防止玩家意外从梯子侧面掉下。
辅助理解:
以视角看正上的WD快速上梯为例:W产生向上的200速度,D产生指向梯子的200速度。D的200速度改为向上的速度。两个200相加得到400速度。实际操作中不能看向正上,所以得到的速度略小于400.
2. 可视化
图片是从上向下看,其中view是视角,n是垂直于梯子平面的向量,v是上一节的向量v.
设view逆时针旋转的角度为x(0度为图片右方),俯仰的角度为y(0度是水平,正数表示向上看)。
假设按下了WD键,则获得的向量v如图所示。
建立坐标系,横坐标是X,正方向向右,纵坐标是Y,正方向向上。
绿色表示更偏向纵向速度,红色表示更偏向水平速度。蓝色框内是两个角度各在0-90度的结果。有两条颜色明显变化的弧线,这是"Ladder Dampen"的影响。
以上图片使用以下代码计算得到:
:
以上结果也支持此文中的经验:
3. 实验验证
在CSGO中找到一个视角和移动速度:
视角为(水平,竖直),速度为(水平, 竖直)。
将视角用以上代码计算:
计算结果与游戏符合得很好。
广告
X 关闭
广告
X 关闭