ゲームの垂直・水平視野(fov、画角、視野角)の計算方法
垂直視野(fovY)、水平視野(fovX)のどちらか片方とアスペクト比が分かっているときに、
もう片方の視野を求める計算式を導出します。
下記動画の後半で解説した内容を少し改訂して活字にしたものです。
【前置き】視野を平面図で把握できるようにする
下記の図は画面解像度1920×1080(アスペクト比16:9)で、
垂直視野60度(図中のピンクの三角形の角度)、
水平視野約91.5度(図中のオレンジの三角形の角度)のときの、
カメラ(視点)の位置と視野の範囲を示している。
この図のままだと立体的で説明しにくいので、平面で捉えられるように視野を表す線と視点を回転移動させる。
垂直視野とアスペクト比から水平視野を求める
ゲームにおいて最も出番が多いであろう計算。
(画面のアスペクト比はプレイ環境で色々変わるが主に画面の横幅が伸び縮みするため、垂直視野は固定して水平視野をアス比に応じて可変させるケースが多い)
画面横幅をwidth、縦幅をheight、
垂直視野をfovY、水平視野をfovX、
視点から視心までの距離をdとする。
画面中央に視心があり、図中の青い円が90度視円錐の底面。この円の半径はdである。
視心から垂直および水平に伸ばした円との交点に視点がある。
各視点からそれぞれ画面端に伸ばした線で作られた角がfovYとfovXとなる。
このとき、図中の黄色い線分は$${\frac {width} 2}$$、紫の線は$${\frac {height} 2}$$となる。
アスペクト比は、$${a=\frac {width} {height}}$$ とする。
例えば画面解像度が1920×1080の場合、$${a=\frac {1920} {1080}=1.777…}$$となる。
下記画像の左下にある赤い三角形に注目すると、直角三角形なので三角関数が使える。そこでwidthについての式を作る。
$$
\begin{array}{} \tan \frac {fovX} 2 &=& \cfrac {\frac {width} 2} d \\\\ {width} &=& 2d\tan \frac {fovX} 2 \end{array}
$$
同様に、画面右上の黄緑の三角形に注目すると、heightについての式を作れる。
$$
\begin{array}{} \tan \frac {fovY} 2 &=& \cfrac {\frac {heght} 2} d \\\\ {height} &=& 2d\tan \frac {fovY} 2 \end{array}
$$
アスペクト比aの式に、これらwidthとheightを代入する。
$$
\begin{array}{}
a&=&\cfrac {width}{height} \\\\
&=& \cfrac {2d\tan \frac {fovX} 2} {2d\tan \frac {fovY} 2} \\\\
&=& \cfrac {\tan \frac {fovX} 2} {\tan \frac {fovY} 2}
\end{array}
$$
上記式から、$${\tan \frac {fovX} 2}$$についての式を作る。
$$
\begin{array}{}
\tan \frac {fovX} 2 =a \tan \frac {fovY} 2
\end{array}
$$
ここでtanの逆関数arctanを用いる。高校数学で習わないので解説すると、
$${\tan a=b のとき、\arctan b =a}$$という関数。
$$
\begin{array}{}
\tan \frac {fovX} 2 &=& a \tan \frac {fovY} 2 \\\\
\arctan (a\tan \frac {fovY} 2) &=& \cfrac {fovX} 2 \\\\
{fovX} &=& 2\arctan (a\tan \frac {fovY} 2)
\end{array}
$$
これで、垂直視野fovYとアスペクト比aから、水平視野fovXを求めることができた。
水平視野とアスペクト比から垂直視野を求める
ゲーム内設定で垂直視野だけ自由に設定できるけど、「俺は水平視野を100度にしたいんだ…なら垂直視野を何度に設定すればいいんだ…」という場合にこの計算が必要になると思う。
先の導出の途中で出した、$${a=\frac {\tan \frac {fovX} 2} {\tan \frac {fovY} 2}}$$から、先ほどとほぼ同じ方法でfovYの式を作る。
$$
\begin{array}{}
\tan \frac {fovY} 2 &=& \cfrac 1 a \tan \frac {fovX} 2 \\\\
\arctan (\cfrac 1 a \tan \frac {fovX} 2) &=& \cfrac {fovY} 2 \\\\
{fovY} &=& 2\arctan (\cfrac 1 a \tan \frac {fovX} 2)
\end{array}
$$
ちなみに、$${a=\frac {width} {height}}$$なので、
$${\frac 1a=\frac{height} {width}}$$とも解釈できる。
おわりに
計算式そのものはネットで調べたらいくつか出てくるんだけど、
この式の導出について納得のいく解説をしてくれているサイトはネット中を駆けずり回っても見つけられなかったので、
自分で解いてその記録をここに残しました。
数学苦手なのでなんか間違ってたらすみません。あともっと本質的な解き方があったらすみません。教えてください。
一応Desmosで計算できるようにした。グラフ計算機の意味がない。もっとシンプルに計算機を自作して共有できるサービスないのかな?
ゲーム画面に作図をして視野を測る方法は下記で解説しています↓