欢迎光临散文网 会员登陆 & 注册

从代码理解梯子上的移动

2023-08-07 00:11 作者:l2zq  | 我要投稿

相关代码(CGameMovement::LadderMove):https://github.com/alliedmodders/hl2sdk/blob/78dab58646d5983c77af44c45a877b89196eb82c/game/shared/gamemovement.cpp#L2854-L3014

图示 (地图:kz_ghs)

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度时(即点乘小于-0.707, 此值由sv_ladder_angle控制),就将向量v沿y轴的速度(V_y, 蓝色部分)乘以0.2(由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"的影响。

以上图片使用以下代码计算得到:

script.js:

index.html

以上结果也支持此文中的经验:

对比蓝色框和此图第一象限

3. 实验验证

在CSGO中找到一个视角和移动速度:

!showpos

视角为(46.07水平,89.00竖直),速度为(水平146.46, 竖直336.21)。

将视角用以上代码计算:

计算结果与游戏符合得很好。

从代码理解梯子上的移动的评论 (共 条)

分享到微博请遵守国家法律