前言:
哈啰大家好是KilinWei,自从我开始玩bhop、surf跟kz已经三年了,对于strafe的机制一直都算有个底,但是我没有认识国外懂游戏机制的大老们,所以也都没办法解惑。像是为甚么sv_airaccelerate调到非常高不会让转弯更容易,大概到100以后就没有肉眼可见的影响。或是64、128tick到底是如何影响strafe的。
一直到半年前发现了一个重要的指令以及最近突破一些瓶颈,才把starfe的机制全部搞懂了。所以单纯很开心上来跟大家分享一下。虽然这篇文章看完对你的人生或跟CS:GO技巧一点帮助都没有,但大家还是能看看,当作长点冷知识。
原理简介:
- 甚么是Strafe?
Strafe指的是在空中转弯的技巧,要向左转需要按A加上鼠标向左,向右转需要按D加上鼠标向右。也就是康康这部影片中所说的「空中侧跳」。但实际上按WASD全都能转弯,鼠标不管向左向右也通通能转弯,只是视角的差异而已。
- 为甚么能够Strafe?
能够Strafe是由于游戏引擎允许玩家在空中进行加速,大家国中物理都学过,只要朝着垂直于速度方向进行加速,就能改变速度的方向。因此当玩家按W往前跳起后按A向左边加速,就能向左转了。
- 放屁,我起跳后按A还是在往前跳啊!!
游戏当然不会允许玩家按一个键就能疯狂加速。游戏中有一个限制,当玩家在希望加速的方向的速度超过30unit/s,就不会再加速了。所以当你按W向前跑到向前速度250unit/s后起跳,按了A以后,你便会增加向左的速度30unit/s。
下面的Gif是我仿真往前跳后按A或D的速度变化,蓝色线条是速度平行玩家正前方的分量,红色线条是速度垂直玩家正前方的分量,而黑色是速度的方向。当视角不变时,起跳后按AD只能旋转约7度 ( arctan(30/250) = 6.843° ),当然看不出来,而且速度越大越看不出来。
- 所以这样不是还是不能转弯吗?
没错,所以想要在空中转弯,需要搭配上鼠标的移动。起跳后按A之后,速度在玩家左侧的分量已经达到30unit/s。这时只要将视角向左转,便能减少速度方向与视角的夹角。也就能减小速度在玩家左侧的分量,这时如果我们持续按着A,便能再次将速度向左的分量增加回30unit/s,便能再次旋转一些角度了。经过不停的按着A或D以及鼠标向左或向右,我们就能在空中转弯,并且同时缓慢的增加速度。
服务器指令、环境影响
- 会影响在空中「Strafe」表现的指令以及环境设置
有很多指令会影响玩家操作,不过在空中时就少了一些。主要的几个如下
1. sv_airaccelerate 影响空中的加速度
2. sv_air_max_wishspeed 影响朝移动方向加速的最大速度
3. sv_maxvelocity 影响空中最大速度
4. tickrate 影响服务器更新频率
以下操作均假设玩家无任何武器(无刀)
- sv_airaccelerate ( 竞技缺省 12 )
如同它字面上的意思,就是空中的加速度。设置为1时,加速度为260unit/s^2。
假设此指令值为1,并且玩家以260的速度向前,那么当玩家按S时,便需要一秒使玩家减速至0。
- sv_air_max_wishspeed ( 竞技缺省 30 )
当玩家在希望移动的方向 ( A是左方、W是前方以此类推 ) 的方向大于此值,便不会再加速。
此值对于玩家在空中转弯以及加速能力至关重要
- sv_maxvelocity
限制玩家在空中最大速度
- tickrate
游戏更频率。由于游戏并非现实,而是一帧一帧更新。同时因为sv_air_max_wishspeed限制了每帧最大额外增加的速度,tickrate越高则Strafe加速越快,也能以更快速度转弯而不会降速。
游戏更新流程
- 讲这么多,我还是不知道到底游戏怎么算出这些的
没错,好像是有点复杂,我就直接一步一步算给你看,我们假设玩家以速度300unit/s向前跳,并以指令+right视角不停向右转并且按着D。
游戏设置以滑水普遍设置进行。
sv_airaccelerate 150
sv_air_max_wishspeed 30
sv_maxvelocity 3500
tickrate 64
同时各种矢量以玩家自身视角前方为y轴正向,右方为x轴正向。
所以此时玩家速度为 ( 260*cos( 90 ), 260*sin( 90 ) ),也就是( 0, 260 )
- 首先游戏更新玩家视角
+right指令每秒旋转210°,除以每秒更新64次的64tick设置。
下一次更新会将玩家视角向右移动210/64度,也就是3.28125° - 检查加速条件
此时因为玩家向右转了一点,速度对于玩家来说朝左前方。
此时的速度矢量为 ( 260*cos( 93.28125 ), 260*sin( 93.28125 ) ) = ( -14.882, 259.574 )
我们可以看到,我们现在正按着D,也就是朝着x+加速。而目前x方向速度是负的,并未大于sv_air_max_wishspeed 所设置的30,因此可以朝右方加速。 - 更新速度
sv_airaccelerate 值为150,所以实际加速度为260*150 = 39000unit/s^2。
我们将期除以64,得到每tick加速度为609.375unit/tick。
我们以此更新x+方向的速度。
-14.882 + 609.375 = 594.493
发现其大于30,所以直接将其降至30。
这边可以发现,sv_airaccelerate太高其实在控制最大不减速转弯速度没什么用处。
但是其实sv_airaccelerate更高对于会减速的转弯还是有帮助的。
但再讲就有点太复杂,而且应该也没人有兴趣XD。
更新后速度为 ( 30, 259.574 ),且其大小为 261.302。
可以发现我们的速度增加且方向从左前方变为右前方,也就是向右转了。 - 更新位置
位置的更新就是速度/tickrate并加回原本的位置就是新位置了,这边不多做赘述。 - 重复上述动作
更新完毕后就再回到步骤一进行下一次更新。同样是获得新视角 -> 计算新速度 -> 计算新位置
非常简单
仿真游戏更新
- 实际仿真游戏更新并观察
我用上述的方法简易的仿真更新,并在CSGO中做出一些稳定可量化的操作。
并在我的仿真中重复一遍一模一样的操作,观察是否有相同的结果。
稳定可量化的操作方法如下。
1. 固定tickrate 128
2. 以+left指令进行视角转动
3. 以+moveleft代替手指按移动
4. 我们让玩家开始进行旋转
初始位置 = ( 1340.53, -4982.77 )
初始速度 = ( -29.99, 2.73 )
初始角度 = 89.70337
- 仿真结果
250次更新后(约2秒):
玩家位置 = ( 23.000, 37.2370) 玩家速度 = ( -177.176, 110.149) 玩家角度 = 139.8645
仿真位置 = ( 23.000, 37.2370 ) 仿真速度 = ( -177.167, 110.159) 仿真角度 = 139.8596
- 2500次更新后(约20秒):
玩家位置 = ( -297.094, 200.290) 玩家速度 = ( -817.739, -1067.573) 玩家角度 = 231.2732
仿真位置 = ( -297.086, 200.321 ) 仿真速度 = ( -817.822, -1067.509) 仿真角度 = 231.2659
- 10000次更新后(约80秒):
玩家位置 = ( -498.949, -277.104) 玩家速度 = ( 928.913, -1839.559) 玩家角度 = 295.961
仿真位置 = ( -498.988, -277.057 ) 仿真速度 = ( 928.762, -1839.634) 仿真角度 = 295.953
- 20000次更新后(约160秒):
玩家位置 = ( 336.416, 445.1919) 玩家速度 = ( -1673.723, 1289.849) 玩家角度 = 295.961
仿真位置 = ( 336.434, 445.141 ) 仿真速度 = ( -1673.576, 1260.035) 仿真角度 = 142.203
- 结论
仿真结果非常不错,实际游戏移动距离已经快到百万unit,而误差仍然能够控制在小数点后第二位。所以我猜测并仿真的游戏引擎运作应该是对的。
我做这些单纯是兴趣而已,能真的搞出来还蛮爽的。
后面可能会去弄弄看Surf原理跟最大可能的LJ距离吧。