今回はノーツのカット角度について調べてみようと思います。
みなさんご存じの通り、ビートセイバーのノーツを切ったときの点数は、ノーツに当たる前のスイング角度(カット前角度/BeforeCut)で70点、ノーツに当たった後のスイング角度(カット後角度/AfterCut)で30点、ノーツ中心を切ることで15点の、最大115点が入るようになっています。(コンボ倍率除く)
貴重な Beat Saber v1.5.0 の Score System スクリーンショット。この画像のためだけに v1.5.0 を復活させました。上の図のように、角度はノーツに当たる前で100度、当たった後で60度を取れば最大得点となります。
そんなわかりきったこと、いったい何を調べることがあるのか、とおっしゃいます?でもちょっと待ってください。この100度、60度、というのは2次元の絵ですが、実際にセイバーを振っているのは3次元空間です。
ノーツの矢印に対して斜めにカットしたとき、その斜めのスイング平面に対して角度を出すのか、それともノーツの矢印の平面に対して角度を出すのかで、算出される角度は変わってきます。また、スイング自体もまっすぐ直線で振らずに、途中で角度が変わった場合どうなるかわかりませんね。
そもそもカット前角度、カット後角度というものの定義があやふやではないですか?どこを振り始めとみなすのか、どこを振り終わりとみなすのか、例えばゲーム開始直後からセイバーをゆっくり振り始めて最初のノーツに当てた場合、100度まで換算してくれるのでしょうか。
また、上記のビートセイバーの角度説明画面にはノーツが入っていませんね。下の記事に書いた通り、ノーツは矢印方向に対して50cmもある、かなり大きな物体です。

今回はビートセイバーのノーツの当たり判定について書いてみようと思います。 ビートセイバーのノーツの当たり判定は、目に見えるノーツモデルの外側に大きい直方体と、内側に小さい立方体の二種類用意されています。 大きいほうの当たり判定は、セイバーとノーツが同じ色の場合のみに反応し、同色セイバーをこの部分に...
例えば下向き矢印のノーツの場合、セイバーがノーツの当たり判定である上面に当たった瞬間、スイングが100度に達していないといけないのでしょうか。それともノーツ中心まで切り込んだとき?あるいはセイバーがノーツの下端まで達したとき?ノーツのどの位置が角度の基準点になっているかで、最大点を取るために必要なスイング量も変わってきますね。
このあたりを調べていこうと思います。
まず、カット前角度の判定が行われるのは、簡単に言えばセイバー先端がノーツの中心を通ったときです。厳密に言うと…
セイバーがノーツの当たり判定に触れた瞬間のスイング平面の法線ベクトルと、ノーツの正面向きベクトルとの外積ベクトルを法線とする、ノーツ中心に接する平面、をセイバー先端が通ったとき、です。
…すみません。つまり、例えば下向き矢印ノーツに対して、正面から斜め30度の角度(アナログ時計で1時から7時の方向)で切った場合は、斜め120度(10時から4時の方向)のノーツ中心を通る平面が判定の境目になる、ということです。
カット前角度は、まず判定が発生した時点から、(ノーツ中心平面から前フレームのスイング位置までの角度を初期値として)0.4秒前までさかのぼって、各フレームごとのスイング角度を足していくことで算出します。
ちなみに、ビートセイバーでは、直近500フレーム分のスイングのデータが常時記録されており、時間をさかのぼってスイング角度を計算できるようになっています。なお、このスイング角度の算出については、後述でもうすこし詳しく説明します。
カット後角度も、基本的にはカット前角度と同じように、ノーツ中心平面が判定の基準となります。
つまり、ノーツ中心平面を通過した時点から、(ノーツ中心平面から現在フレームのスイング位置までの角度を初期値として)0.4秒後まで各フレームごとのスイング角度を足していって算出されます。
最初に「基本的には」と書いたのは、セイバーがノーツの当たり判定に触れてから、ノーツ中心平面に達しないまま0.4秒経った場合、そこでカット判定終了となるからです。この場合は、カット後判定の開始位置は、セイバーが当たり判定に触れた時点からとなります。
まとめると、カット判定が終わり、角度点が確定するのは以下の条件になります。
1. セイバーがノーツの当たり判定に触れた後、ノーツ中心まで届かずに0.4秒経つ
2. ノーツ中心まで届いた場合、その瞬間から0.4秒経つ
3. 上記に関わらず、スイング平面の角度が90度以上変わる
わたしのNalulunaFlyingScoreやHitScoreVisualizerで、切ったノーツから飛び出した数字が変動していくのに気づいた方もいらっしゃるかもしれません。セイバーがノーツに当たった瞬間はまだ点数が確定しておらず、最大で0.8秒間経たないと点数は確定しない、ということになります(実際はすぐにカット後角度最大まで達して確定する場合がほとんどですが)。
ノーツの矢印に対して斜めにカットしたとき、スイング角度はどうなるのか、あるいは、ノーツを切っている途中で軌道を変えたときの角度はどうなるのか、について解説します。
まずスイング角度は、1フレームごとに、前フレームのセイバー位置から、現在フレームのセイバー位置までの角度変化を足し合わせていくことで算出されます。つまり、スイングの向きがノーツ矢印の角度とずれていても、ミスにならない限りはデメリットはありません。
それならセイバー軌道が遠回りするように曲線で振れば、直線で振るより角度を多めに稼げるのでは、と考えるかもしれません。その通りなのですが、限度はあります。
というのも、ノーツの当たり判定に触れた瞬間のスイングの向き(正確には、スイング平面の法線)を基準にして、スイングの向き(法線)が90度以上変わってしまうと、その時点でスイング角度の算出が終了になってしまいます。また75度以上変わっていた場合は、ペナルティで角度が減算されるようになっています((角度差-75)*100/15%の減算)。
90度も曲げることはない、と思われるかもしれませんが、真正面から見た平面での角度差ではなく、3次元空間での角度差なので、体感よりは大きくなりやすいとは思います。
念のため書いておきますが、上記の75度や90度という数字は、スイング平面と垂直になる法線の話です。スイング角度を大きく振るとダメなの?という話ではないので勘違いされないよう…。
補足です。記事中に何度も出てくるスイング平面という単語ですが、厳密にはどのような平面を表しているか書いておきます。セイバーの現在フレームの先端位置と末端位置(柄部分は含みません)、そして1フレーム前のセイバー先端と末端の中間位置、この3点から作られた平面をスイング平面としています。
イメージ的にはセイバーを振ったときに刃の部分が通りすぎた面だと思えば良いでしょう。ビートセイバーのノーツの当たり判定やスコア判定はこの平面を用いて行われています。
余談ですが、判定はフレーム単位で行われるため、フレーム落ち(処理落ち)が発生している状態だと、操作感が悪いだけでなく、当たり判定や角度判定の粒度も下がってしまうので不利になります。逆に言えば、ゲームを72Hzで動作させるより、144Hzで動作させるほうが若干有利です(コントローラーやトラッキングの差は別にして)。
調べてみるとけっこう普通でしたね。プレーヤーに違和感を与えないように作られている、ということでしょう。