- Home
- 一覧
- 雑記
-
モニターディスタンスで感度を変換する FPSとFOV④
前回モニターディスタンスが出てきました。
普通は振り向きを〇センチにするかと振り向き変換を行っていますよね。今回はモニターディスタンスを利用して視覚的な感度の変換、MD%変換をします。
視野角を上げると感度が高く感じます。振り向きは変わらないのに、という話です。
前の記事:FPSとFOV③ 通常時視野角からADS視野角を求める
感度のMD%変換とは
マウス感度の高い低いは手の感覚で振り向きを何センチに設定するかどうかで考えると思います。
しかし視野角を大きくすると視覚的な感度が高く、視野角を小さくすると視覚的な感度が低く感じます。振り向きは変わっていないのに。
この視野角を変えたときに視覚的な感度を揃えようというのがモニターディスタンスの感度変換です。
そもそもMD変換はすべてのFPSゲームで使用されています。
当然ゲームのADS時は振り向きが一緒ではありません。ADSすると振り向きは長く、振り向き感度は低くなりますよね。つまりMD変換でADSしたときに違和感がないように感度を変換しているわけです。
例えば
・APEXはMD0%変換によってADS感度を変換しています。他ゲーに比べADS感度は低めですよね。
・ValorantはMD100%変換です。スナイパースコープの感度高く感じますよね。
・旧R6SではADS感度84以上だと腰だめの振り向きと等倍サイトの振り向きが一致するMD∞%変換です。振り向き変換ですね。
・BF2042はデフォルトでMD75%変換ですが統一照準の設定によって0から169%の間で選択することができます。
という風にモニターディスタンスは知らず知らずのうちに利用しています。
またMD〇%の値は小さい方が感度が低く、大きい方が感度が高くなります。
そしてMD〇%の値は何を示すのかというと異なる視野角やADSしたときの画面上で、画面の〇%へのフリック感覚が一致するということです。画面の〇%までエイムするときのマウスの移動距離が一致するということです。
・MD0%のとき0%の内側はありませんから画面上どの位置へフリックしても感度が遅く感じますがクロスヘア近傍での操作感覚が一致します。
・MD75%のとき75%より内側ではフリック感度が高く、外側ではフリック感度が低くなります。
・MD100%のとき画面内へのフリック感度は高く感じます。
・MD∞%のとき無限の前では有限はすべて等しくみなせますから異なる視野角間で振り向きが一致する、振り向き変換となります。
感度をMD%変換する
マウスの移動量はこの図の中のどこと対応しているでしょうか。マウスを動かすことで視野が回転するわけですから、角度あるいは円周と比例します。
角度∝マウス移動距離
つまり 180[deg]と振り向き[cm] は対応しているというわけですね。
MD変換ですからMD〇%までのマウス移動距離を二つの視野角に対して一致させればよいわけです。これが今回の満たすべき条件となりますね。
2つの視野角間の変換ですから、変換元の視野角について図中のθ。変換先の視野角に対してφを全く同じ図で考えましょう。
ここで比例関係から、θ’とφ’が一致させたいマウス移動距離に対応してきます。θ’とφ’ に対応した一致させるべきマウス移動距離を d とします。
また変換するための変換元感度の振り向き[cm]、求めるための変換先感度の振り向き[cm]を考えます。
よって比例関係から、180[deg]に対するθ’の割合と、(変換元振り向き[cm])に対するdの割合は等しくなります。
同様に180[deg]に対するφ’の割合と、(変換先振り向きcm])に対するdの割合は等しくなります。
$$\frac{θ'[deg]}{180[deg]}= \frac{d[cm]}{\mbox{(変換元振り向き[cm])}}
$$$$\frac{φ'[deg]}{180[deg]}= \frac{d[cm]}{\mbox{(変換先振り向き[cm])}}
$$マウス移動距離dが等しくなるように変換元・先で式を立てることができました。dを消去します。
$$\mbox{(変換先振り向き)}=\frac{ θ’ [deg]}{ φ’ [deg]}\mbox{(変換元振り向き)}$$ よってどうすれば感度をMD変換し求めることがわかりました。
ではθ’とφ’に具体的な数値を入れていきましょう。前回求めたものを使います。
$$θ'[rad]=atan(MD tanθ)$$ $$φ'[rad]=atan(MD tanφ)$$ このとき振り向き変換するときに好きな振り向き何センチと決めて変換するように、好きなMD何%と自由に設定します。75%なら0.7を入れればいいわけですね0%なら0を入れると計算できませんから.00000000001とか0に近い値を。∞%なら999999999とかでかい値を入れればいいですね。
前回同様[rad]のままでは扱いにくいので[deg]に直しましょう。またθ、φを変換元視野角[infov]、変換先視野角[outfov]に直しましょう。
$$θ'[deg]=atan\left[MD tan([infov]\frac{\pi}{360})\right]\frac{360}{\pi}$$ $$φ'[deg]=atan\left[MD tan([outfov]\frac{\pi}{360})\right]\frac{360}{\pi}$$ 代入
$$\mbox{(変換先振り向き)}=\frac{ θ’ [deg]}{ φ’ [deg]}\mbox{(変換元振り向き)}$$ $$\mbox{(変換先振り向き)}=\frac{atan\left[MD tan(\mbox{[infov]}\frac{\pi}{360})\right]}{ atan\left[MD tan(\mbox{[outfov]}\frac{\pi}{360})\right]}\mbox{(変換元振り向き)}$$ よってモニターディスタンスによる感度変換ができました。
$$\frac{atan\left[MD tan(\mbox{[infov]}\frac{\pi}{360})\right]}{ atan\left[MD tan(\mbox{[outfov]}\frac{\pi}{360})\right]}$$ この振り向き倍率を元の振り向きにかけてやればMD変換感度が求まります。
また前回同様このときのinfov、outfovは16:9タイプの視野角でなくてはなりません。
例えば16:9視野角を106から120に上げたけどなんか感度低く感じるなというときにinfovに106をoutfovに120をいれMD75%にしてみようと思ったとしてMDに0.75をいれます。すると振り向きを85.6%にすればよいということがわかります。
ADS感度倍率をMD%変換する
MD変換するのは腰うち感度だけでよいのでしょうか。最初に言ったようにゲームによってADS時のMD%は異なります。例えば0%のAPEXのADS感度をMD75%でプレイしたいときにADS感度倍率もMD変換する必要があります。
腰うち視野角とADS視野角をそれぞれinfov、outfovとして先ほどのMD変換係数を求めます。その係数をゲーム内MDと求めたいMDとで比を取ってやればそれが設定するべきADS感度倍率になります。
$$
\mbox{(ADS感度倍率)}=
\frac{
\left(atan\left[gameMD tan(\mbox{[hipfov]}\frac{\pi}{360})\right]\right)
\left(atan\left[myMD tan(\mbox{[adsfov]}\frac{\pi}{360})\right]\right)
}
{
\left(atan\left[gameMD tan(\mbox{[adsfov]}\frac{\pi}{360})\right]\right)
\left(atan\left[myMD tan(\mbox{[hipfov]}\frac{\pi}{360})\right]\right)
}
$$例えばここにAPEXの腰うちとADS時の16:9fovをいれgameMDに0.0001を、myMDに0.75を入れ求まったADS感度倍率を設定するとAPEXのADS時の感度がMD75%に合わせて設定したということになります。
求めた結果から視覚的イメージをつかむ
MD0%に限って言えば、長々とした式は必要ありません。電卓もマウスを動かすことも必要ありません。視野角の値すら必要なく感度変換の計算ができてしまいます。このお手軽さから、MD%は楽でいいなと思います。
振り向き倍率=tan(16:9infov/2) /tan(16:9outfov/2)という単純な式で計算することができます。
さらにこれは単純に画面上での長さの日ですから、fovを変える前後で画面上で横幅が拡大縮小した比を求めるだけです。つまり前後でスクショを取って横幅がどれだけ変化したか見るだけで変換することができます。
ここまで円周とマウス移動量を一致させるように見てきました。つまりこのピンクの部分です。
一度円の半径を1→1/cosθに置き換えたように、実数値でなく比での話をしてきましたね。
今度は弦の長さを対応させて考えてみます。
弦を対応させ、相似になるようにします
すると今度は弦に対する弧の長さがマウス移動量に一致します。
円の程度が変化します。
この上をマウスで動かすようなものです。
MD0%を考えてみます。0で割ると無限になりますので、無限に大きい円とします。つまりその弧は直線となります。画面です。
よって先ほど述べたようにMD0%の場合計算式が簡単になります。異なるFOV間で画面上の長さと感度の比が一致するということです。
逆にMDが100%以上、感度が高い場合についてみてみます。このようになります。
おわり
当然感度をモニターディスタンスで合わせたところで1ミリも強くはなりません。しかしADSが存在するすべてのゲームで使用されている計算ですから知っておいて損はないと思います。
最強の感度は何かというと設定を変えるたびに高くしたり低くしたり微調整しながら決めていくのが最強だと思います。しかし設定を変えるたびに毎回やっていては日が暮れてしまいます。この設定はMD〇%で自分にあっているかもしれないとか思ったり設定コロコロ変えるときに機械的に感度を変換して移植できたら楽だと思います。この設定はこういう設定だという尺度が増えますそういう楽をするために知っておきましょう。
MD変換を行う計算フォーム:
[計算機]モニターディスタンスで感度を変換-Sensitivity Converter by Monitordistance
関連:[計算機]APEXの感度・ADS感度をモニターディスタンスで変換-Apex Sensitivity Converter By Monitordistance
-
[自キ]手配線で60%キーボード(試作)を作る
60%キーボードを手配線で作りました。自キ制作レポートです。
窮屈ですが69キーの自作キーボードを作りました。
設計方針
私はUS配列がJIS配列より好きだ。JISは手を動かさないとENTERが押せないがUSは指を動かすだけで押せるからだ。それにJIS配列の{}が上下にずれてるのおかしいだろ。
しかしUS配列で日本語キーボードを打つと不便だと思う。_が打てないのだ。
ということでENTERキーにアクセスしやすいUS配列ライクで日本語キーボードのキーを網羅したキーボードが欲しい。
最近は75%を使用していて丁度60%キーボードはほんとに快適なのかと思っていたため60%を制作することに決めた。
出来上がり
打鍵感は外側のキーが少し硬いのは仕方ないか。カチャカチャなるわけでもないし悪い感じはせず普通に使えるものができた。キーキャップは足りなかった分を前回の余りで補った。
PBTキーキャップはサラサラしているのがいいですね。
OEMプロファイルは一般的ではありますがやっぱり少し背が高いです、他のキーキャップも触ってみたい。
US配列で日本語設定で_と|を打てるのはめちゃくちゃ使いやすい。US配列使っていた時のストレスがなくなり最高。今まで_を打つのにWIN+SPACEでUSキーボードに切り替えSHIFT+-を打つというめんどくささだった。
材料
マイコン Pro Micro-遊舎工房 リセットスイッチ タクタイルスイッチ–遊舎工房 ダイオード 1SS178-秋月電子通商 配線用ワイヤ はんだメッキ線 0.6mm-秋月電子通商 耐熱電子ワイヤー 1.22mm-秋月電子通商 キースイッチ Ajazz 黒軸-AliExpress キーキャップ KBDfans OEM PBT Blank Keycaps-AliExpress プレート KPrepublic 60% carbon fiber plate-AliExpress コイルケーブル AKKO Aviator Cable Type C-AliExpress ゴム足 ゴム足 100粒入り-Amazon USBアダプタ UGREEN USB C to Micro USB-Amazon キーボードケース 適当な木材 キーレイアウト
Keyboard Layout Editor (keyboard-layout-editor.com)にて作成しました。
窮屈ですが実質65%キーボードです。市販のプレートで詰め込めるだけ詰め込みました。
キーマップはとりあえず詰めてみました。
組み立て
プレート
2uShiftのモノを今回購入してみました。プレートにキースイッチをはめ込みボンドで固定。
配線
ダイオードを手配線、69個あるのが大変。
promicroとリセットスイッチ、回路を配線。これでキーボードとしてはもう機能しそう。
なぜかリセットスイッチ外からアクセスできないところに配置。気が向いたら外からアクセスできるようにします。promicroはキーボードの下に隠して配置するより上とかにスペースを設けた方が都合いいのかもしれないと思った。
キーボードケース
できるだけシンプルで簡単なケースにしようと思った。木材をのこぎりでカット。全然まっすぐ切れてなかった。のこぎりなんて普段使わんもん。電動のこぎりか厚みのある樹脂板の方が楽だったかも。
ボンドで接着。ねじ止めする予定だったが予定から組み替えたりしてたらよくわからなくなった。
組み立て
家にあったラッカースプレーで適当に塗装、リア板の穴にUSBアダプタをボルトとナットで固定。
リア板を溝に挿しこむ、キーボード乗せる、ねじで固定、ゴム足をつけて完成
Firmware
config.h
#pragma once
#include “config_common.h”
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x0002
#define DEVICE_VER 0x0001
#define MANUFACTURER Tsuiha
#define PRODUCT 60percent01
#define MATRIX_ROWS 10
#define MATRIX_COLS 7
#define MATRIX_ROW_PINS { D1, D4, D7, B4, B5, D2, D0, C6, E6, F5 }
#define MATRIX_COL_PINS { F6, F7, B1, B3, B2, B6, D3 }
#define UNUSED_PINS
#define DIODE_DIRECTION COL2ROW10行7列で作りました。
60percent01.h
#pragma once
#include “quantum.h”
#define LAYOUT( \
k00, k01, k02, k03, k04, k05, k06, \
k10, k11, k12, k13, k14, k15, k16, \
k20, k21, k22, k23, k24, k25, k26, \
k30, k31, k32, k33, k34, k35, k36, \
k40, k41, k42, k43, k44, k45, k46, \
k50, k51, k52, k53, k54, k55, k56, \
k60, k61, k62, k63, k64, k65, k66, \
k70, k71, k72, k73, k74, k75, k76, \
k80, k81, k82, k83, k84, k85, k86, \
k90, k91, k92, k93, k94, k95 \
) { \
{ k00, k01, k02, k03, k04, k05, k06 }, \
{ k10, k11, k12, k13, k14, k15, k16 }, \
{ k20, k21, k22, k23, k24, k25, k26 }, \
{ k30, k31, k32, k33, k34, k35, k36 }, \
{ k40, k41, k42, k43, k44, k45, k46 }, \
{ k50, k51, k52, k53, k54, k55, k56 }, \
{ k60, k61, k62, k63, k64, k65, k66 }, \
{ k70, k71, k72, k73, k74, k75, k76 }, \
{ k80, k81, k82, k83, k84, k85, k86 }, \
{ k90, k91, k92, k93, k94, k95, KC_NO } \
}
keymap.c
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
LAYOUT(
KC_DELETE ,KC_BSPACE ,KC_EQUAL ,KC_MINUS ,KC_0 ,KC_9 ,KC_8 , \
KC_BSLASH ,KC_RBRACKET ,KC_LBRACKET ,KC_P ,KC_O ,KC_I ,KC_U , \
KC_PGUP ,KC_ENTER ,KC_QUOTE ,KC_SCOLON ,KC_L ,KC_K ,KC_J , \
KC_PGDOWN ,KC_UP ,KC_INT1 ,KC_SLASH ,KC_DOT ,KC_COMMA ,KC_M , \
KC_RIGHT ,KC_DOWN ,KC_LEFT ,KC_JYEN ,KC_RCTRL ,MO(1) ,KC_RSHIFT , \
KC_ESCAPE ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 ,KC_6 , \
KC_TAB ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,KC_7 , \
KC_GRAVE ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,KC_Y , \
KC_LSHIFT ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,KC_H , \
KC_LCTRL ,KC_LGUI ,KC_LALT ,MO(1) ,KC_SPACE ,KC_N \
),
LAYOUT(
_______ ,KC_PSCREEN ,KC_F12 ,KC_F11 ,KC_F10 ,KC_F9 ,KC_F8 , \
_______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ , \
KC_HOME ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ , \
KC_END ,KC_MS_WH_UP ,_______ ,_______ ,_______ ,_______ ,KC_MAIL , \
KC_MS_WH_RIGHT ,KC_MS_WH_DOWN ,KC_MS_WH_LEFT ,_______ ,_______ ,_______ ,_______ , \
_______ ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_F6 , \
_______ ,_______ ,_______ ,_______ ,_______ ,_______ ,KC_F7 , \
_______ ,KC_MEDIA_PREV_TRACK,KC_MEDIA_PLAY_PAUSE,KC_MEDIA_NEXT_TRACK,_______,_______ ,_______ , \
_______ ,_______ ,_______ ,KC_CALCULATOR ,_______ ,_______ ,_______ , \
_______ ,_______ ,_______ ,_______ ,_______ ,_______ \
)
};どうせだからfnキーも活用していきたい。
反省点
60%キーボードとして普通に使えるものができた。
キーボードケースの工作精度がひどすぎたのでまともに作れる方法を考える。
強く押し込むとたわむが、このたわみ自体は悪いものではないらしい。しかし基板なしのプレートのみだと不安な部分はある。
キーボードの高さは既製品とほぼ同じだったがもう数ミリは薄型化の余地がある。
アクリルカット注文しサンドイッチとか積層で作るのが強度を担保できるのでアリかもしれない。でもちゃんとケースの方が見た目いい気がする。でもアクリルカット注文すると今回の場合一番金のかかる部品がケースになるんだよなあ。
最近のキーボードはホットスワップのモノが多いし中華メーカーであれば8000円程度でホットスワップの完成品が日アマでも売っている。製作費用は8000円程度だったのでわざわざパーツを集めて作る意味は薄い。
個人的なUS配列ライクなJIS用自作キーボードの試作という目的は達成されついでに矢印キーも入れることができたので目標は達成されたと思う。
-
[自キ]FPS専用の左手デバイス(試作)を手配線で作る
FPSゲーム用チルトグリップ対応ホイール付き左手デバイスを手配線で作りました。自キ制作レポートです。
21キー+ホイール+ホイールクリックのレイアウトで自作キーボードを制作しました。
設計方針
左手デバイスといえばRazerやAzeronが有名だと思います。それらの左手デバイスに触発され制作をしました。
EC2等左右非対称の自然に握れるマウスがあるのなら左手も同様なのではないか、傾斜をつけチルトグリップに対応させてみる。
キーボードはロウスタッガードですが手に合わせたキーレイアウトを採用し自然に指を配置できるようにしてみる。
販売されている左手デバイスは親指にアナログスティックを配置したものが多いですが今回マウスホイールを配置してみる。背景としてBFVでスライディング・パルクールをマウスホイールに割り当てるとよいのですができればマウスは左右クリックに指を置いておきたい。なので左手に割り当てようと思ったわけです。
これらのことから 21キー+ホイール+ホイールクリックの左手デバイスを制作することにしました。ダンボールで試しに作ってみていい具合の角度等を模索し 制作に入りました。
出来上がり
左が低くて右が高くなっておりチルトグリップに対応しています。キーボードだと下に押し下げる感じですが、握りこむように持てて安定感があります。
手前が低くて奥が高く、また上の段と下の段を折り曲げ傾斜をつけることで指のみでアクセスしやすくなっています。単純ですがかなり効果は高く押しやすくなりました。キーボードだとZが非常に押しにくいと感じていたのですが指の動線にフィットし解消されました。
親指でほぼSpaceキーから指を動かさずホイール操作を行うことができます。
材料
マイコン Pro Micro- 遊舎工房 ダイオード 1SS178-秋月電子通商 配線用ワイヤ はんだメッキ線 0.6mm-秋月電子通商 耐熱電子ワイヤー 外径1.22mm-秋月電子通商 キースイッチ EPOMAKER AKKO (Vintage White)-Amazon キーキャップ MIHIYIRY PBT キーキャップ-Amazon ホイール周り glorious Model O-から流用 プレート PC板 2mm厚 パームレスト 紙粘土、グリップテープ キーレイアウト
Keyboard Layout Editor (keyboard-layout-editor.com)にて作成しました。
赤線の部分は折り曲げ傾斜がつけられています。手に合わせてキー配置を微調整しました。
組み立て
プレート
トッププレート、ボトムプレート、サムプレートの3枚 についてPC板をアクリルカッターで切り出した
キースイッチ用の穴もアクリルカッターで開ける予定だったが気が遠くなったのではんだごてで溶かし四角く穴をあけた。当然部屋は樹脂が溶けた異臭がひどかった。穴の淵には溶けた樹脂がたまっていてペンチで取り除く必要があった。最後にやすりで削り整えた。もうやりたくない。
折り曲げもはんだごてで熱を加えて行った。
配線
キースイッチ、マイクロスイッチ、ホイールエンコーダをそれぞれはめこみボンドで固定した。
ダイオードとワイヤをはんだ付けし手配線。
配線が汚いしpromicroは固定されていない。とても見栄えが悪いが使用する分には問題ない。
プレート組み立て
それぞれのパーツをねじで留め固定した。
パームレスト
紙粘土を成形し乾燥後グリップテープを張り付けた。
こちらも見栄えは悪いが多少弾力もありグリップ力もあるため性能としては十分。
Firmware
config.h
# pragma once
#include “config_common.h”
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x0001
#define DEVICE_VER 0x0001
#define MANUFACTURER tsuiha
#define PRODUCT leftdevice01
#define MATRIX_ROWS 4
#define MATRIX_COLS 6
#define ENCODERS_PAD_A { D3 }
#define ENCODERS_PAD_B { D2 }
#define ENCODER_RESOLUTION 4
#define MATRIX_ROW_PINS { B1, D4, B4, E6 }
#define MATRIX_COL_PINS { B6, B2, F7, C6, D7, B5 }
#define DIODE_DIRECTION COL2ROW黄色線で示した部分が今回ホイールを使用するのでその分となります。他は行列の指定です。
leftdevice01.h
#pragma once
#include “quantum.h”
#define LAYOUT( \
k01, k02, k03, k04, \
k10, k11, k12, k13, k14, k15, \
k20, k21, k22, k23, k24, k25, \
k30, k31, k32, k33, k34, k35 \
) { \
{ KC_NO, k01, k02, k03, k04, KC_NO}, \
{ k10 , k11, k12, k13, k14, k15 }, \
{ k20 , k21, k22, k23, k24, k25 }, \
{ k30 , k31, k32, k33, k34, k35 } \ }こんな感じの配線にしました。
keymap.c
#include QMK_KEYBOARD_H
#define BASE 0
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(
KC_1 ,KC_2 ,KC_3 ,KC_4 , \
KC_TAB ,KC_Q ,KC_W ,KC_E ,KC_R , KC_H , \
KC_LSHIFT ,KC_A ,KC_S ,KC_D ,KC_F , KC_B , \
KC_LCTRL ,KC_Z ,KC_X ,KC_C ,KC_SPACE ,KC_V \
),
};
bool encoder_update_user(uint8_t index, bool clockwise) {
if (index == 0) { /*First encoder */
if (clockwise) {
tap_code(KC_J);
} else {
tap_code(KC_K);
}
} else if (index == 1) { /*Second encoder */
if (clockwise) {
tap_code(KC_DOWN);
} else {
tap_code(KC_UP);
}
}
return true;
}黄色線がエンコーダの部分です。Second encoderについてはよくわかりません。公式ドキュメントのコピペです。
JとKにホイールを割り当ててありますが当然普通にマウスホイールを割り当てることもできます。
反省点
見た目はよろしくないが、使用感は非常に満足のいくものだった。
PC板の加工についてだがこれがよくなかった。もっと簡単な方法を検討する必要がある。見立てが甘かったのだが、やっていてほんとに嫌になった。
・ホットナイフを使うのはどうか、はんだごてと大差ないような気もするが多少ましだろうか。
・折り曲げ部は折り曲げるのでなくL字の金具を使うのもいいかもしれない。
・アクリルカットを注文するのはどうだろうか。折り曲げ箇所が多く難がある気がする。
・3Dプリンタを使用するのがよいかと安直に思うのでそのうち導入したい。
左手デバイスというのだからアナログスティックを搭載するのもよいと思う。親指でホイール
操作するのはなかなか快適なのでアナログスティックにこだわる必要はない気もする。
キー配列は手にはあっていたが数字キーが少し指から遠かった。手に合っているのもよいがキー密度を上げ指の移動量を減らす方が重要かもしれない。あるいはazeronのようにマイクロスイッチを用いることで省スペース化し密度を上げるのもいいかもしれない。
本体、パームレストともに見栄えよく高クオリティなものを作りたい。
机の上にキーボードを一つしか置きたくないというようなことがなければ、導入しない手はないというほどには快適であった。チルトグリップなのは好みがわかれるところだが、そうでないものを設計し使用すればよい。
個人的には左右対象マウスを使用するときは使いやすかったが、非対称マウスを使用するときはキーボードの方が使用感がよかった。平面タイプの左手デバイスを制作するのもよいかもしれない。
Razerは1万円、Azeronは2万円とキーボード同等の値段がするが今回制作したものは材料費3000円程度であり格安で最高の快適さを得られた。
-
通常時視野角からADS視野角を求める FPSとFOV③
視野角の変換式でアスペクト比の比率を用いましたが今回はモニターディスタンスを係数として利用することにします。また画面上のズーム倍率で視野角を変換し腰だめ視野角からADS視野角を求めます。
前の記事:FPSとFOV② 異なるアスペクト比に視野角を変換
タンジェントで整理する
$$
\mbox{[出力fov]}=atan\left(
\frac{\mbox{[変換先アス比]}}{\mbox{[変換元アス比]}}
tan\left( \mbox{ [入力fov]}\frac{\pi}{360}\right)
\right)
\frac{360}{\pi}
$$アスペクト比による視野角の変換式はタンジェントで表された式でした。
では上記前回のイメージ図もタンジェントで整理し直します。
上図では半径を1として書き込みましたが今回は1/cosθとして書き込んでみます。
右の三角形についてa、b、cを求めます。
$$
a =\frac{1 }{ cosθ}
$$$$
cosθ = \frac{b }{ a} = \frac{b }{ \left(\frac{1 }{ cosθ}\right)}
\\b = 1
$$$$
sinθ = \frac{c }{ a} = \frac{c }{ \left( \frac{1 }{ cosθ }\right)}
\\c = tanθ
$$左の三角形についてa、b、cを求めます。
$$b = 1$$ $$cosφ = \frac{b }{ a} = \frac{1 }{ a}
\\a = \frac{1 }{cosφ}$$$$tanφ = \frac{c }{ b} = \frac{c }{ 1}
\\c = tanφ$$求めた数値を書き込んでみます。
画面(弦)の部分をタンジェントで表すことで見やすくなりました。
モニターディスタンスの導入
$$\frac{\mbox{[変換先アス比]} }{\mbox{ [変換元アス比]}}$$ アス比による視野角変換式中のこの部分を書きかえます。
16:9→4:3の変換で係数は3/4=0.75でした。これは水平方向に4:3画面が16:9画面の75%の長さであるということです。
つまりアスペクト比の比は変換前後で画面上の長さの何%であるかということを表していることがわかります。これは画面上の距離ですからモニターディスタンスです。
この画面中央から端まで、変換前後で何パーセントかというのがモニターディスタンスでありMD〇%と表します。
腰だめ時を変換前、ADS時を変換後とすると画面上で何%の位置までズームするかを考えることでADS時の視野角を求められそうです。
では係数をMDに置き換え前回同様に変換式を求めてみます。
この時の満たすべき条件は、画面の長さ割合をMDとして
$$ \mbox{ [ADS時画面比]} = \mbox{ MD}* \mbox{ [hipfire時画面]}
\\ex) \mbox{ [4:3画面長さ]} = 0.75 * \mbox{ [16:9画面長さ]}$$となればよいです。画面長さ( c )は先程求めましたね。代入します
$$[ADS時画面比] = \mbox{ MD} * \mbox{ [hipfire時画面]}
\\tanφ = \mbox{ MD} * tanθ
\\ φ = atan( \mbox{ MD} * tanθ )$$radをdegに直します
$$ \mbox{ [ADSfov]} \frac{\pi }{ 360} = atan \left[ \mbox{ MD} * tan \left( \mbox{ [hipfire fov]} \frac{ \pi }{360} \right)\right]
\\
\mbox{ [ADSfov]} = atan\left[ \mbox{ MD} * tan\left( \mbox{ [hipfire fov]} \frac{ \pi}{ 360} \right) \right]\frac{360}{\pi}$$腰だめ視野角と、ADS時に画面の何%までズームするかわかればADSfovが求められることがわかりました。
ADS視野角を求めてみる
スクショを取ってADS視野角を求めてみます。スクショを取ると横1920ドットですね。画面半分だと960ドットになります。
ズーム時の画面割合がMDなので
$$MD=\frac{\mbox{960-[ズーム分]}}{960}$$ となります。先ほどの式のMDに代入します。
$$ \mbox{ [ADSfov]} = atan\left[ \frac{ \mbox{960 – [ズーム分]} }{ 960 } tan\left( \mbox{[hipfire fov]} \frac{ \pi}{ 360} \right) \right] \frac{360}{\pi}$$ ただこの計算式では画面中央から端までの比ですから、すべて16:9HFOVでしか求められませんので主流である4:3fovにはその都度変換し直さなくてはなりません。
スクショからADS視野角を求めてみました↓
[計算機]スクショからADS視野角を計算する-Screenshot ADS FOV Calculator
まとめ
視野角はタンジェントで考えられることがわかりました。またモニターディスタンスを考えることで画面上の長さと視野角を結びつけることができました。
-
異なるアスペクト比に視野角を変換 FPSとFOV②
視野角はFOVタイプによって数値が変わるためアスペクト比に応じて変換する必要があります。大体CS:GOは1:1fov74、4:3fov90、16:9fov106ということは有名ですが、どうやって相互に変換しているのかという話です。
前の記事:FPSとFOV① 視野角の種類とイメージ
三角関数について
角度θ、辺a、b、cを持つ図のような直角三角形についてサインコサインタンジェントはこの式のように表せます。
16:9FOVから4:3FOVへの変換を考える
θ の部分が16:9モニターの右半分で見えている範囲で、φの部分が4:3モニターの左半分で見えている範囲です。
画面上で縦の視野角を合わせると4:3fovは16:9fovの75%の横幅を持ちます。
$$\frac{ 4 }{ 3 } ÷ \frac{ 16 }{ 9 } = \frac{ 12 }{ 9 } ÷ \frac{16 }{ 9 } = \frac{1.33 }{ 1.77} = \frac{3 }{ 4 }= 0.75$$ 2つの画面長さ(↔の部分)がこの75%の幅を持つという条件を満たせばよいわけです。
また16:9fovを4:3fovに変換し角度を求めるわけですからφをθの関数で表したい。
まず右の黒い三角形16:9fovについて考えます。半径は特に意味もないので1とします。
三角関数からそれぞれの辺の長さが求まりますね。
$$a=1
\\cosθ = \frac{b }{ a }= b
\\sinθ = \frac{c }{ a} = c$$次に左のオレンジの三角形の辺の長さを求めます。
$$b = cosθ$$ $$cosφ = \frac{b }{ a} = \frac{cosθ }{ a}
\\a = \frac{cosθ }{ cosφ}$$$$tanφ =\frac{ c }{ b }= \frac{c }{ cosθ}
\\c = cosθ tanφ$$「4:3fovは16:9fovの75%の横幅を持つ」という条件を二つの三角形の c について満たせばよいですね。
また、求めたいのはφですからφについてまとめます。
$$1 : 0.75 = sinθ : (cosθ tanφ)
\\0.75 sinθ = cosθ tanφ
\\tanφ = 0.75 \frac{sinθ }{ cosθ} = 0.75 tanθ
\\φ = atan( 0.75 tanθ ) = atan\left( \frac{3 }{ 4}tanθ \right)
$$求めることができました。
θとφではわかりづらいです。三角形を作り画面の半分の角度を用いて計算したので2倍すれば視野角になります。また[rad]だとわかりづらいので[deg]に直します。
$$2θ[rad] = \mbox{16:9fov[rad]} =\mbox{ (16:9fov[deg])} \frac{\pi}{180}
\\θ = \mbox{[16:9fov]} \frac{\pi}{360}$$$$φ = \mbox{[4:3fov]} \frac{\pi}{360}$$ θとφに代入し4:3fovについて解きます。
$$\mbox{[4:3fov]}\frac{\pi}{360} =atan\left[ \frac{3 }{ 4} tan\left(\mbox{[16:9fov]} \frac{\pi}{360}\right) \right]
\\\mbox{[4:3fov]} = atan\left[ \frac{3 }{ 4} tan\left(\mbox{[16:9fov]} \frac{\pi}{360}\right) \right]\frac{360}{\pi}$$16:9fovから4:3fov を求める式ができました。
アスペクト比に応じて視野角を変換
ここで式中の3/4に注目します。3/4はどこから出てきた数字でしょうか。
$$\frac{ 4 }{ 3 } ÷ \frac{ 16 }{ 9 }= \frac{3 }{ 4 }$$ この条件式でした。こう書き直すことで一般化できそうです。
$$\frac{3 }{ 4}= \frac{4 }{ 3} ÷ \frac{16 }{ 9} → \frac{\mbox{[変換先アス比]}}{\mbox{[変換元アス比]}}$$ $$\mbox{[出力fov]} = atan\left[ \frac{\mbox{[変換先アス比]} }{\mbox{ [変換元アス比]}} tan\left(\mbox{[入力fov]} \frac{\pi}{360}\right) \right]\frac{360}{\pi}$$ 一般化できました。サインコサインタンジェントを図に書き込んでいくだけなので簡単です。