parumemo

ぱるめのメモです。

弾ブレの計算式(推測)

Splatoon2 ver.5.5.0のときに執筆

 

Splatoon2もついにあと3日の命。今更感がすごいが、Splatoon2の弾ブレの計算式を思いついたのでそのまとめ。

 

お世話になったサイト様

 

目次

 

計算式とは

スプラトゥーンというゲームには弾ブレがある。しかも、弾ブレは均一なものではなく、中央に弾が集まりやすいという性質がある。

それを生成するためにゲーム内でどのような処理をしているか考えてみたことはあるだろうか?筆者は今回それを推測してみた。

内部での処理が分かればいろいろなことに活用することができる。例えば、スプラシューターの初弾命中率が90%になるようにメイン性能の積み具合を調整したり、対面の有利不利を考えるときに弾ブレで外れることを考慮したキル速の期待値を比較したり。

スプラ2はもう終わってしまうが、公式によるとスプラ3でもブキの基本性能は変わっていないらしい。となると、弾ブレに関する内部処理も変わっていない可能性は大いにあるだろう。この記事が誰かの役に立てばうれしい。

 

弾ブレに関わるパラメータ

計算式を理解するために必要となる前提知識について。

関係するパラメータはDegRandomDegBiasMinDegBiasDegBiasKfDegBiasDecreaceなどがある。

弾ブレの要素は大きく2つあり、ここではそれぞれ拡散値集弾補正値と呼ぶことにする。

 

拡散値

=DegRandom[°]

一般的に弾ブレというとこっちを指すことが多い。ブレの最大値を表す。よく(たまに?)ある勘違いだが、拡散値は弾が飛ぶ範囲の角度ではなく、照準中央からの角度を指す。(言葉での説明が難しいので下図を見てほしい。)

 

集弾補正値

DegBiasMin, DegBias, DegBiasKf, DegBiasDecreace

 

弾のまっすぐ飛びやすさを表す。数値が小さいほどまっすぐ飛びやすい。

(0<)DegBiasMinDegBias(<=0.5)の範囲で変動し1発撃つごとにDegBiasKfだけ増え、撃ってない間1fごとにDegBiasDecreaceだけ減る。

詳しくは次の記事に他の方がまとめてくれている。

smssmooth.hatenablog.com

 

計算式(推測)

本題の計算式に移る。

実際に弾が飛んでいく角度$y$[°]は、拡散値$a$[°]、集弾補正値$b$、乱数を$x(0<x<1)$とし、

\[f:y=ax^{\log_{0.5}b}\]

で与えられる。

赤: スプラシューターの初弾(拡散値: 6°, 集弾補正値: 0.01)

青: 撃ち続けてブレが最大になったスプラシューター(拡散値: 6°, 集弾補正値: 0.25)

 

この式だけ見てもよく分からないと思うので$f$の逆関数$f^{-1}$を微分して得られる確率密度関数$(f^{-1})'$を見てみよう。

 

赤: スプラシューターの初弾(拡散値: 6°, 集弾補正値: 0.01)

青: 撃ち続けてブレが最大になったスプラシューター(拡散値: 6°, 集弾補正値: 0.25)

 

こう見ると、初弾(赤)の方が中央付近(0°~0.2°)に弾が集まりやすく、撃ち続けた弾(青)は外側(0.2°~6°)に散らばりやすいことが分かる。

 

イカの当たり判定の測定

命中率の計算の前に、イカの当たり判定の大きさを測定しなければならない。

今回はリッター4kを用いて試し撃ち場のラインに水平になるようにエイムを合わせ、ラインに垂直な壁に沿って歩きながら、バルーンに照準がギリギリ当たらない位置で照準が壁のドット模様のどの位置にあるかを測るという方法を取った。

画像

結果、バルーンは壁のドット約3.8個分という結果になった。また、ドット20個≒ライン1本=50duであるから、ドット1個≒2.5du、リッターの弾の当たり半径=1duより、バルーンの半径≒3.7duとなる。すべて目測であるためにとても正確な値とは言い難いが、ここではこれをイカの当たり判定の大きさとする。また、簡単のため当たり判定は完全な円柱であるとし、弾の上下ブレは考えないものとする。

 

追記

https://https://sp.nicovideo.jp/watch/sm41049846にて、当たり判定の大きさについてより詳細な検証をされている方が居た。

その結果によると、半径は約3.6duとなるそうだ。

 

命中率の計算

エイムが的の中心にあっている場合

的までの距離$d$[du]、的の当たり半径$r_1$[du]、弾の当たり判定$r_2$[du]、拡散値$a$[°]、集弾補正値$b$とする。命中率$p$は、

\[p=\left(\frac{\sin\left(\frac{r_{1}+r_{2}}{d}\right)}{a}\right)^{\log_{b}0.5}\]

となる。(ただし、$\sin^{-1}$は度数法の角度を返すものとする。)

この式は、先述の確率密度関数を0~$\sin^{-1}(\frac{r_1+r_2}{d})$の範囲で積分すると得られる。

例えば、試し撃ちライン2.3本分(=115du)の距離からのスプラシューターの初弾の命中率は、

\[\left(\frac{\sin^{-1}\left(\frac{3.7+2}{115}\right)}{6}\right)^{\log_{0.01}0.5}=0.8935\cdots\]

となる。

 

エイムが的の中心から逸れている場合

やや難しい内容になる割りにあまり役に立つ話ではないため、この項は飛ばしていただいても構わない。

先程までの計算式はすべて片側($0$°~$+a$°)の範囲で考えていたが、エイムが左右にズレている場合左右対称ではないので両側($-a$°~$+a$°)対応の$f$を考える必要がある。

このときの角度$y(-a<y<+a)$[°]は、拡散値$a$[°]、集弾補正値$b$、乱数を$x(0<x<1)$とし、

\[f:y=a\operatorname{sgn}\left(2x-1\right)\left|2x-1\right|^{\log_{0.5}b}\]

となる。

ちなみに$\operatorname{sgn}$は符号関数と呼ばれ、因数の符号を返す。

\begin{eqnarray} \operatorname{sgn}(x)= \begin{cases} 1&(x>0)\\ 0&(x=0) \\ -1&(x<0) \nonumber \end{cases} \end{eqnarray}

逆関数は,

\begin{eqnarray} f^{-1}\left(x\right)=  \begin{cases}  1&(a<x)\\  \frac{1}{2}\left(\operatorname{sgn}\left(x\right)\left(\frac{\left|x\right|}{a}\right)^{\log_{b}0.5}+1\right)&(-a\leq x\leq a)\\  0&(x<-a) \nonumber \end{cases} \end{eqnarray}

ただし、$f$の値域外は都合の良いように適当な値とさせてもらった。

 

的までの距離$d$[du]、的の当たり半径$r1$[du]、弾の当たり判定$r2$[du]を用い、$\alpha = \sin^{-1}\left(\frac{r_{1}+r_{2}}{d}\right)$とする。エイムの方向が的の方向となす角を$\theta$とすると、命中率は、

\begin{eqnarray}p&=&\int_{-\alpha-\theta}^{\alpha-\theta}\left(f^{-1}\left(x\right)\right)'dx \nonumber \\ &=&f^{-1}\left(\theta+\alpha\right)-f^{-1}\left(\theta-\alpha\right)\nonumber \end{eqnarray}

先に述べた通り$\left(f^{-1}\right)'$は確率密度関数になる。また、式変形に$f^{-1}\left(x\right)=1-f^{-1}\left(-x\right)$を用いた。

 

以下に縦軸に命中率、横軸にエイムのズレの角度をとったグラフを置いておく。

赤: スプラシューターの初弾(拡散値: 6°, 集弾補正値: 0.01)

青: 撃ち続けてブレが最大になったスプラシューター(拡散値: 6°, 集弾補正値: 0.25)

 

緑の範囲は的の大きさ(レティクルが引っ掛かって赤くなる範囲)を示す。

初弾(赤)は中央付近に弾が集まりやすいため、レティクルが的に少しでも当たっているか外れているか(緑の中に入っているかいないか)で命中率に大きな差が出ている。

撃ち続けた弾(青)は程よくバラけるので、そこまで急激に変化のない山なりなグラフになっている。

 

計算式(推測)と一致するデータ

他の方がしてくださっている検証からこの計算式で求めた結果とある程度一致しているものを2つほど頂戴した。

 

1つ目

以下の記事の"3. 検証1"より

smssmooth.hatenablog.com

検証条件は下記の通り

3.1 検証1の条件

今回の検証1では、以下の条件で行った。

  • 射撃位置はスプラシューターの最大ダメージが出るギリギリの射程である、試し撃ちライン2.3本から、スプラシューター、.96ガロン、ジェットスイーパー、ノーチラス47の4種で一定時間を空けてそれぞれ500発初弾の射撃を行った
  • ジャイロはオフで一歩も動かず、カメラも動かさない
  • メイン性能アップは全て0にした(スプラシューターとジェットスイーパーにブレ軽減効果があるが、この検証ではなし)
  • 照準位置はジェットスイーパーで調整した

引用元:https://smssmooth.hatenablog.com/entry/2020/09/13/173658

計算式に代入する数値として、射撃位置はすべて同じ位置でライン2.3本分(=115du)、弾の当たり判定の半径はすべて2.0du、的の半径は3.7duとし、また照準は的の中央にあっているものと見なし、上下に外れるものは考えない。

検証によって得られた実際の命中率と計算式による命中率(小数第四位を四捨五入)を下の表にまとめた。

 

ブキ 拡散値 集弾補正値 計算式による命中率 実際の命中率
スプラシューター 6.0 0.01 0.894 0.884 -0.010
.96ガロン 4.0 0.04 0.929 0.942 +0.013
ジェットスイーパー 3.0 0.02 0.990 0.988 -0.002
ノーチラス47 3.3 0.30 0.917 0.898 -0.019

 

最大で2%程度の差があるが、500回の試行では誤差の範囲のように思える。大まかな傾向は正しいというのには十分な結果だろう。

 

2つ目

以下の記事の"命中補正"より

wikiwiki.jp

試し撃ち場の的に対し、わかばシューターで位置を固定したまま、エイムのみをずらして命中率を求めた。
命中補正が存在しない場合、エイムに関係なく、命中率は一定になると予想される。
エイムは「大きくずらす」、「わずかにずらす」、「ぎりぎり合う」、「合っている」の4条件を検討した。
以下の画像に、各条件のエイムを示す。
wakaba.png
ただし、「大きくずらす」条件でも、右に外れる弾が存在することを確認している。

 

各条件で400回タップ撃ちを行い、命中率を求めた。
400回の場合、比率の標準誤差は5%と見込める。全く同じ条件だとしても、10%程度の差は起こりうると判断される。

条件 命中率
大きくずらす 9.25%
わずかにずらす 26.75%
ぎりぎり合う 55.00%
合っている 74.50%
 

この結果から、エイムが合っているほど弾が当たりやすいことが分かる。
つまり、弾のばらつきは均等ではなく、真っ直ぐ飛ぶ弾が出やすいことが確認できる。

引用元:https://wikiwiki.jp/splatoon2mix/%E6%A4%9C%E8%A8%BC/%E3%83%96%E3%82%AD/%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%A6%E3%82%A7%E3%83%9D%E3%83%B3#v5da67a8

この検証での興味深いところは、「わずかにずらす」と「ぎりぎり合う」の命中率の差が非常に大きい、すなわち、レティクル中央にかなりの弾が集まっているということだろう。それは今回の計算式(推測)にも共通する特徴であるため、計算式の確からしさを保証する強力な材料となり得る。

 

では検証結果を計算式と比較してみる。

距離やエイムの角度などについての記載がないので私の目測で。

的までの距離は85du、エイムの角度は、的の中心から的の端までの角度を$\alpha\left(=\sin^{-1}\frac{3.7+2}{85}=3.845\cdots\right)$°として、「合っている」$=0$°、「ぎりぎり合う」$=-\alpha +0.1$°、「わずかにずらす」$=-\alpha -0.1$°、「大きくずらす」$=-2\alpha$°とする。また"タップ撃ち"は初弾補正をかけているという意味で受け取った。

 

条件 エイムの向き 計算での命中率 検証の命中率
大きくずらす -7.690° 10.44% 9.25%
わずかにずらす -3.945° 27.72% 26.75%
ぎりぎり合う -3.745° 63.14% 55.00%
合っている 78.26% 74.50%

的の境目での命中率の急激な変化はやはり見られた。

「ぎりぎり合う」の誤差が大きいが、400回の試行ではあり得る範囲ではあり、またわずか0.2°の区間で命中率が45%も変わる区間なので、角度の目測が少しずれているだけで大きく変わってしまう。ちなみに計算式による命中率が55%となるのは角度が-3.839°のときである。

 

計算式と一致しないデータ

次は計算式(推測)と一致しないデータとその原因についての考察。

 

検証内容・結果

下の記事より

smssmooth.hatenablog.com

 

・検証方法1

今回の検証は以下の条件を設定して行った。

  • メイン性能アップのギアは0.0個(サブ0)、0.6個(サブ2)、1.0個(メイン1)、1.3個(メイン1サブ1)、5.7個(メイン3サブ9)の5種類で比較する
  • 検証に使用するクツのギアの靴底の高さは同じにする
  • 射撃位置はスプラシューターの照準ギリギリの2.3本で検証する
  • ジャイロはオフ、その場から1歩も動かず射撃した
  • いずれのギアも一定時間を空けて1発ずつ射撃することを500回繰り返して的に当たった回数を数える

引用元:https://smssmooth.hatenablog.com/entry/2020/01/05/214231

検証方法2

2度目の検証は以下の条件を設定して行った。

  • メイン性能アップのギアは0.0個(サブ0)、0.6個(サブ2)、1.0個(メイン1)、1.3個(メイン1サブ1)、5.7個(メイン3サブ9)の5種類で比較する
  • 検証に使用するクツのギアの靴底の高さは同じにする
  • 射撃位置はスプラシューターの照準ギリギリの2.3本で検証する
  • ジャイロはオフ、その場から1歩も動かず射撃した
  • いずれのギアも一定時間を空けて1発ずつ射撃することを50回行ってから、塗りをリセットを使って位置をリセットして再度50発撃つを10回繰り返して合計500発射撃し、的に当たった回数を数える

引用元:https://smssmooth.hatenablog.com/entry/2020/01/05/214231

↓結果のまとめ

ギアパワー数 拡散値(°) 検証1の命中率 検証2の命中率 計算式の命中率
0.0個(サブ0) 6.00 0.870 0.868 0.894
0.6個(サブ2) 5.55 0.912 0.908 0.904
1.0個(メイン1) 5.40 0.908 0.918 0.908
1.3個(メイン1サブ1) 5.32 0.928 0.898 0.910
5.7個(メイン3サブ9) 4.80 0.942 0.930 0.924

検証結果は1,2いずれもギアパワー0.0個のときに計算式より命中率がかなり低く、それ以外は計算式より全体的に高い命中率となっている。

 

可能性1 誤差

先程述べた差もせいぜい3%以内のものであり、誤差と見なせると言えば見なせる。

また、検証1でギアパワー0.6個と1.0個が、検証2で1.0個と1.3個の確率の大小が逆転しており、あまりデータとして正確なものとは言えない可能性がある。(実際、引用元の検証記事の筆者もその旨の発言をしている。)

 

可能性2 上に外れる弾

「計算式(推測)と一致するデータ」の項で紹介した2つのデータは、照準位置が的の真ん中に合っており、上下に外れる弾はあまりないと推測される。しかし、本項で扱っている記事を見てみると照準位置が的の上の方にあり、記事内に弾が上に外れたという記載もある。

計算式(推定)では、現状左右のブレしか計算できず、上下にブレる弾のことは分からない。ただ、上下ブレの大きさのパラメーターは内部データに見当たらず、拡散値0°のブキに上下ブレが存在しないことを考えると、上下の拡散値は左右の拡散値に比例することが考えられる。仮にこの説が正しいとすると、メイン性能ギアで上下のブレも緩和されることが考えられつじつまが合う。

 

可能性3 計算式が間違っている

その可能性も十分あるが、とりあえず考えないことにする。

 

まとめ

いかがだっただろうか。総じていえば、計算式(推測)はかなりそれっぽいが、確かな証拠はないと感じた。計算式の応用・発展的な利用についてはまた別の記事で書くつもりだ。

 

こういったものを書くのは初めての経験であり、至らない点も多々あったと思います。不適切な表現や分かりにくい箇所などがあればお手数ですがぜひコメントで教えていただきたいです。できる限り早く対応させて頂きます。

 

更新履歴

2022-9/26 イカの当たり判定の測定の項に、他の方の検証動画についての記述を追加