2016/05/14

DPIと振り向きとセンシティビティ

DPI × sensitivity ∝ 振り向き
という関係は一般的に知られています.例えば,400 DPIのsensitivity 2と800 DPIのsensitivity 1は振り向きが等しいということになります.概ねこれは正しいのですが,一点だけ注意点があります.
それは,DPIを下げれば下げるほど,視点の回転が荒くなるという点です.

簡単な例を動画にしてみました.
まずは比較的一般的な1000 DPI,sensitivity1という設定です.

絶望的なまでのAimの悪さを除けばごくごく普通の視点操作ですね.

次に10 DPI,sensitivity 100という設定です.

非常にガクガクとした視点の移動ですね.特に動画の後半では,Aim出来る位置に頭がないので,Aimを合わせることができていません.


2つの動画は「ほぼ」振り向きの距離は同じですが,視点移動の粗さが大きく違うことが分かります.

これは非常に極端な例ですが,実際のもサブピクセル単位ではこれと同じ現象が起きています.つまり,ごくごく微小な範囲では,例と同様に低DPIだと欲しい角度に向くことが出来ていない可能性があるのです.
これが私がプロプレイヤーの中で一般的な400DPIという設定を倣わずに,750DPIや1000DPIに設定している理由です.

特にハイセンシなプレイヤの場合,400 DPIなどの低DPIにしてインゲームのsensitivityを上げるような設定は極力避けたほうが良いでしょう.

CS:GOの視点回転処理

CS:GO互換な視点回転をするアプリを書く時に考える必要があるのが「マウスからの変位1 countに対して,どれだけ視点が回転されるか?」というパラメタです.このパラメタが分かればCS:GOのsensitivityの設定と互換アプリのsensitivityの設定を合致させる事ができます.

というわけで実験してみましょう.
CS:GOでは,コンソールからcl_showposを1とすることで,自分の視点の角度を見ることが出来ます.
左上に位置情報と視点の回転角,速度が表示されています
小数点第2位まで表示されているので,有効数字4桁まで取れそうですね.
ちなみに-180~180までの値を取っているので単位はdegreeだということが分かりました.3D系のAPIって大体はradianだと思うのですが・・・ちょっと意外です.

sensitivityが1~10程度の低い値だと,1 countあたりの回転角が非常に小さいので有効数字を使い切るような計測ができません(本当はUSB HIDを作って1000countとか転送すれば良いんですけどね).
そこで,sensitivityを1000として設定して1 countだけ視点を動かします.

スタート地点
1countだけ水平方向に回転
7.44から27.44になりました.つまり,sensitivity 1000の状態では,1 countで20.00度回転することになります.また,sensitivity 1の場合では1countで0.02度回転します.
ちなみに垂直方向も同様の回転量でした.

以上より,大抵の3D APIはradianを使うことになるので,フレームあたりの回転量は,
フレームあたりの回転量 = sensitivity * 0.0003491 * フレームあたりのcount数
と求めることができますね.垂直方向に関しても同様の式で回転量を求める事ができます.