前言:
哈啰大家好是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距離吧。