Багато ефекту FOV полягає в тому, наскільки швидко ви, здається, рухаєтеся по світу (це все одно з тією ж швидкістю; це суто сприйняття). З занадто широким горизонтальним FOV ви, здається, рухаєтеся дуже швидко, а надто вузьким ви, здається, рухаєтеся дуже повільно. 90 градусів горизонтально виглядає як "солодке місце", і розробник гри може налаштувати бажану швидкість руху для окремих ігор звідти.
Так само буває, що 4 рази 90 градусів - це 360 градусів, що є колом. Якщо встановити горизонтальний FOV так, щоб він чітко відображався на передній / лівий / задній / правий квадранти, мабуть, має сенс.
І нарешті тут старий каштан пріоритету та інерції. Я не впевнений, чи пропонували будь-які ігри, які регулюються гравцем FOV перед Quake, але Quake зробив це, і дефолт до 90 градусів по горизонталі; легко уявити інші ігри, які піднімаються на 90 градусах звідти.
Варто зазначити, що в наш час 90 градусів стає все рідше, в іграх (особливо сучасних FPS) налаштовують дещо нижчу величину - 80 або близько.
Якщо ви хочете скорегувати аспект FOV, ви можете використовувати щось подібне (я не претендую, що це єдиний чи найкращий спосіб, але це відповідає калькулятору FOV на веб- сайті 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
Це дасть вам орієнтовану на аспект горизонтальну FOV, яка підтримує вертикальну FOV незалежно від роздільної здатності та співвідношення сторін.