Gran parte dell'effetto di FOV è sulla velocità con cui ti sembra di muoverti nel mondo (è sempre la stessa velocità; questo è puramente percettivo). Con un FOV orizzontale troppo largo sembrerai muoverti molto velocemente, con troppo stretto sembrerai muoverti molto lentamente. 90 gradi in orizzontale sembra essere il "punto debole", e lo sviluppatore del gioco può regolare la velocità di movimento desiderata per i singoli giochi da lì.
È anche il caso che 4 volte 90 gradi sia 360 gradi, che è un cerchio. Impostare il FOV orizzontale in modo che si adatti perfettamente ai quadranti anteriore / sinistro / posteriore / destro sembra avere senso.
E infine c'è la vecchia castagna di precedenza e inerzia. Non sono sicuro se qualche gioco offriva un FOV regolabile per il giocatore prima di Quake, ma Quake lo ha fatto e è passato a 90 gradi in orizzontale; è facile immaginare altri giochi che si stanno riprendendo a 90 gradi da lì.
Vale la pena notare che al giorno d'oggi 90 gradi sta diventando meno comune, con i giochi (in particolare i moderni FPS) impostati su un valore leggermente inferiore - in circa 80.
Se vuoi correggere l'aspetto del tuo FOV, puoi usare qualcosa del genere (non pretendo che sia l'unico o il modo migliore, ma è coerente con il calcolatore FOV su http://www.emsai.net/projects/widescreen / fovcalc / ; questo assume relativamente ad un rapporto di base di 4: 3 (è possibile regolare quello nella chiamata a CalcFovY di seguito))
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;
}
Quindi chiamalo come:
// 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 e fov_y calcolati possono quindi essere inseriti nella seguente matrice prospettica (convenzione 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
Questo ti darà un FOV orizzontale regolato dall'aspetto che mantiene il FOV verticale indipendentemente dalla risoluzione e dalle proporzioni.