Большое влияние FOV на то, как быстро вы, кажется, двигаетесь по миру (это все та же скорость; это чисто восприятие). При слишком широком горизонтальном поле зрения вы будете двигаться очень быстро, а при слишком узком - очень медленно. Горизонтальный угол в 90 градусов кажется «сладкой точкой», и разработчик игры может настроить желаемую скорость движения для отдельных игр оттуда.
Это также тот случай, когда 4 раза 90 градусов - это 360 градусов, то есть круг. Настройка горизонтального поля зрения так, чтобы он хорошо соответствовал передним / левым / задним / правым квадрантам, имеет смысл.
И, наконец, старый каштан старшинства и инерции. Я не уверен, предлагали ли какие-либо игры регулируемый игроком FOV до Quake, но Quake сделал, и он по умолчанию установил 90 градусов по горизонтали; Легко представить, что другие игры просто поднимаются оттуда на 90 градусов.
Стоит отметить, что в настоящее время 90 градусов становятся все менее распространенными, при этом игры (особенно современные FPS) устанавливаются на несколько более низкое значение - в пределах или около 80.
Если вы хотите скорректировать аспект вашего поля зрения, вы можете использовать что-то вроде этого (я не претендую на то, что это единственный или лучший способ, но это согласуется с калькулятором поля зрения на http://www.emsai.net/projects/widescreen / 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
Это даст вам горизонтальное поле зрения с коррекцией аспекта, которое поддерживает вертикальное поле зрения независимо от разрешения и соотношения сторон.