Perché 90 ° horz / 60 ° vert è il campo visivo FPS predefinito?


14

A quanto ho capito, il campo visivo verticale dovrebbe essere regolato su:

fov = 2 * arctan(0.5*screenHeight / distanceEyeScreen);

Cioè, il campo visivo deve corrispondere alla distanza e alla dimensione dello schermo di un utente.

In molti FPS, esiste un valore predefinito di 90 ° per FoV orizzontale o 60 ° per FoV verticale (presupponendo 16: 9). Un esempio è CryEngine. Ma per uno schermo 16: 9 20 "(diagonale dell'area visibile, ovvero circa 40 cm x 25 cm), questo valore predefinito richiederebbe agli utenti di avere gli occhi a 20 cm dallo schermo per ottenere una visione prospetticamente corretta.

Quindi o ho fatto un errore nei miei calcoli, o ci deve essere un motivo per cui avresti scelto di proposito un valore FoV inadeguato.

Qual è la ragione di un FoV predefinito di 90 ° horz / 60 ° vert?


So che FOV più alti possono far sentire un gioco più veloce mentre lo scenario si muove . Sembrerebbe essere una scelta di design, dipende anche dal dispositivo su cui lo stai giocando. Quali FPS hai misurato?
Anko,

@Anko Beh, ho fatto un po 'di "ricerca" e ho trovato molti post sul forum in cui si afferma che diversi FoV predefiniti sono a 90 °. Inoltre, ho letto alcuni documenti di CryEngine e ho giocato con FoV nel suo esempio di gioco.
dyp,

Il motivo per cui il FOV è predefinito su qualunque valore sia impostato, è che generalmente non ha senso impostare un valore che non è costante. La maggior parte dei display non ha sensori che indicano quanto è distante la testa dell'utente. Pertanto 90 gradi è una "buona ipotesi". Suppongo che potresti dire che equivale a dire "tutti i nostri 20" utenti dello schermo dovrebbero sedersi a 20 cm di distanza da esso ". Stai dicendo che vuoi ridurre il FOV perché la maggior parte degli utenti si siede più lontano dai loro schermi? Lo rende troppo ingrandito e devi andare in giro di più per vedere ciò che ti circonda. Questo mi fa succhiare di più un gioco.
Steven Lu

Risposta semplice: perché si sente abbastanza bene durante il gioco e non introduce indebite distorsioni come fanno progressivamente i FOV più ampi. Fare casini con le angolazioni della telecamera è facile in qualsiasi editor 3D, provare diversi valori e vedere di persona. Risposta non semplice: è una cospirazione massonica.
Patrick Hughes,

Risposte:


6

Penso che avere un FoV di 90 gradi sia ciò che sembra naturale quando cerchi di imitare "guardare attraverso gli occhi umani". I tuoi calcoli sarebbero corretti se utilizzassi lo schermo per simulare una finestra in un mondo virtuale, non in una prospettiva in prima persona. Immagine che dovresti vedere il mondo attraverso un telaio da 20 "a 80 cm dalla tua testa ...


1
Ma "guardare attraverso una finestra in un mondo virtuale" non è una proiezione prospettica? Oh, e puoi anche proiettare le cose "sporgenti" del tuo schermo sulla superficie dello schermo.
dyp,

4
Per i giochi di prospettiva in prima persona, avere un FoV molto limitato può essere irritante e ferire il gameplay e l'immersione in IMO, poiché vedi molto meno di quanto sei abituato nella vita reale. Personalmente, trovo qualcosa di molto inferiore a 90 ° inadeguato. Immagina di stare in un angolo di una stanza quadrata con un FoV orizzontale di 65 ° come sembra essere comune per i giochi per console - non saresti in grado di vedere l'intera stanza, costringendoti a continuare a guardare a destra ea sinistra per mantenere la consapevolezza. Mi farebbe impazzire nella vita reale :)

1
Sì, certo che lo è. Fai questo us.123rf.com/400wm/400/400/ronstik/ronstik1112/ronstik111200016/… con le dita e simula uno schermo da 20 "di fronte a te (a 80 cm di distanza). Ora immagina che sia tutto ciò che potresti vedere. Come melak47 ha sottolineato, sarebbe irritante. Spostare questo schermo / cornice da 20 "simulato ora a 20 cm dalla testa e dovrebbe corrispondere approssimativamente al campo visivo reale.
Dirk,

3
In effetti, la falsa prospettiva indotta da un campo visivo artificialmente ampio è completamente innaturale e personalmente trovo spesso la distorsione che crea stressante e fastidioso. Ma è ancora infinitamente preferibile provare a visualizzare tutto attraverso uno spioncino di 20 ° -30 °, che riguarda ciò che implicherebbe una prospettiva "realistica" su un singolo monitor tipico. Parliamo di visione a tunnel!
Ilmari Karonen,

3

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.