FOVの効果の多くは、世界を移動する速度に影響します(それでも同じ速度です。これは純粋に知覚的です)。水平FOVが広すぎると、非常に速く移動するように見え、狭すぎると、非常に遅く移動するように見えます。90度の水平は「スイートスポット」のように見え、ゲーム開発者はそこから個々のゲームの望ましい移動速度を調整できます。
また、90度の4倍が360度、つまり円である場合もあります。フロント/レフト/バック/ライトクアドラントにうまくマッピングされるように水平FOVをセットアップすることは理にかなっています。
そして最後に、優先順位と慣性の古い栗があります。Quakeの前にプレイヤーが調整可能なFOVを提供するゲームがあったかどうかはわかりませんが、Quakeは提供し、デフォルトで水平90度になりました。他のゲームがそこから90度だけ上昇するのを想像するのは簡単です。
ゲーム(特に現代のFPS)がわずかに低い値(80前後)に設定されている現在、90度は一般的ではなくなっていることに注意してください。
FOVをアスペクト補正したい場合は、このようなものを使用できます(これが唯一または最良の方法であるとは言いませんが、http: //www.emsai.net/projects/widescreenのFOV計算機と一致しています/ fovcalc / ;これは、4:3の基本アスペクト比を基準としています(以下のCalcFovYの呼び出しで調整できます)。
float CalcFovX (float fov_y, float width, float height)
{
float a;
float y;
if (fov_y < 1) fov_y = 1;
if (fov_y > 179) fov_y = 179;
y = height / tan (fov_y / 360 * M_PI);
a = atan (width / y);
a = a * 360 / M_PI;
return a;
}
float CalcFovY (float fov_x, float width, float height)
{
float a;
float x;
if (fov_x < 1) fov_x = 1;
if (fov_x > 179) fov_x = 179;
x = width / tan (fov_x / 360 * M_PI);
a = atan (height / x);
a = a * 360 / M_PI;
return a;
}
次に、次のように呼び出します。
// you should use #define of const instead of magic numbers here, which are just here for illustration purposes in this sample
fov_y = CalcFovY (playerAdjustableFOV, 4, 3); // this is your base aspect that adjusted FOV should be relative to
fov_x = CalcFovX (fov_y, width, height); // this is your actual window width and height
計算されたfov_xとfov_yは、次のパースペクティブマトリックスにプラグインできます(OpenGL規則):
1.0f / tan (DEG2RAD (fov_x) * 0.5f),
0,
0,
0,
0,
1.0f / tan (DEG2RAD (fov_y) * 0.5f),
0,
0,
0,
0,
(zFar + zNear) / (zNear - zFar),
-1,
0,
0,
(2.0f * zFar * zNear) / (zNear - zFar),
0
これにより、アスペクト調整された水平FOVが得られ、解像度とアスペクト比に関係なく垂直FOVが維持されます。