Gran parte del efecto del FOV está en qué tan rápido parece moverse por el mundo (sigue siendo la misma velocidad; esto es puramente perceptivo). Con un FOV horizontal demasiado ancho, parecerá que se mueve muy rápido, con un ángulo demasiado estrecho, parecerá que se mueve muy lento. 90 grados horizontal parece ser el "punto óptimo", y el desarrollador del juego puede ajustar la velocidad de movimiento deseada para juegos individuales a partir de ahí.
También es el caso de que 4 veces 90 grados es 360 grados, que es un círculo. Parece que tiene sentido configurar el FOV horizontal para que se asigne bien a los cuadrantes frontal / izquierdo / posterior / derecho.
Y finalmente está la vieja castaña de precedencia e inercia. No estoy seguro de si algún juego ofreció un FOV ajustable por el jugador antes de Quake, pero Quake lo hizo y su valor predeterminado fue 90 grados horizontal; Es fácil imaginar que otros juegos simplemente aumenten 90 grados desde allí.
Vale la pena señalar que hoy en día los 90 grados se están volviendo menos comunes, con los juegos (particularmente los FPS modernos) en un valor ligeramente más bajo, en o alrededor de 80.
Si desea corregir el aspecto de su FOV, puede usar algo como esto (no pretendo que sea la única o la mejor manera, pero es consistente con la calculadora de FOV en http://www.emsai.net/projects/widescreen / fovcalc / ; esto supone una relación de aspecto base de 4: 3 (puede ajustar eso en la llamada a CalcFovY a continuación))
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;
}
Entonces llámalo como:
// 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
Los fov_x y fov_y calculados se pueden conectar a la siguiente matriz de perspectiva (convención 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
Esto le dará un FOV horizontal con ajuste de aspecto que mantiene el FOV vertical independientemente de la resolución y la relación de aspecto.