¿Por qué 90 ° horz / 60 ° vert es el campo de visión FPS predeterminado?

14

Según tengo entendido, el campo de visión vertical debe ajustarse a:

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

Es decir, el campo de visión debe coincidir con la distancia y el tamaño de la pantalla del usuario.

En muchos FPS, hay un valor predeterminado de 90 ° para FoV horizontal, o 60 ° para FoV vertical (suponiendo 16: 9). Un ejemplo es CryEngine. Pero para una pantalla de 16: 9 de 20 "(diagonal del área visible, es decir, aproximadamente 40 cm x 25 cm), este valor predeterminado requeriría que los usuarios tengan sus ojos a 20 cm de la pantalla para obtener una vista correcta en perspectiva.

Entonces, o cometí un error en mis cálculos, o debe haber una razón por la que elegiría un valor FoV inadecuado a propósito.

¿Cuál es la razón de un FoV predeterminado de 90 ° horz / 60 ° vert?

dyp
fuente
Sé que los FOV más altos pueden hacer que un juego se sienta más rápido a medida que avanza el paisaje . Parecería ser una opción de diseño, también depende del dispositivo en el que lo esté jugando. ¿Qué FPS midiste?
Anko
@Anko Bueno, hice un poco de "investigación" y encontré muchas publicaciones en el foro que indicaban que los juegos predeterminados de FoV por defecto son 90 ° horz. Además, leí algunos documentos de CryEngine y jugué con FoV en su juego de ejemplo.
dyp
La razón por la cual el FOV está predeterminado a cualquier valor establecido, es que generalmente no tiene sentido establecer un valor que no sea constante. La mayoría de las pantallas no tienen sensores que indiquen qué tan lejos está la cabeza del usuario. Por lo tanto, 90 grados es una "buena suposición". Supongo que podría decir que es equivalente a decir "todos nuestros 20" usuarios de la pantalla deben sentarse a 20 cm de distancia ". ¿Está diciendo que desea disminuir el FOV porque la mayoría de los usuarios se sientan más lejos de sus pantallas? y tienes que recorrer más para ver tus alrededores. Eso hace que un juego sea más malo para mí.
Steven Lu
Respuesta simple: porque se siente lo suficientemente bien mientras juega y no introduce una distorsión indebida como lo hace FOV progresivamente más amplio. Jugar con ángulos de cámara es fácil en cualquier editor 3D, pruebe diferentes valores y compruébelo usted mismo. Respuesta no simple: es una conspiración masónica.
Patrick Hughes
Relacionado: gamedev.stackexchange.com/a/47619/14808
Laurent Couvidou

Respuestas:

6

Creo que tener un FoV de 90 grados es lo que se siente natural cuando intentas imitar "mirar a través de los ojos humanos". Sus cálculos serían correctos si usara la pantalla para simular una ventana a un mundo virtual, no una perspectiva en primera persona. Imagen que tendría que ver el mundo a través de un marco de 20 "a 80 cm de distancia de su cabeza ...

Puñal
fuente
1
¿Pero no es "mirar a través de una ventana a un mundo virtual" de qué se trata una proyección en perspectiva? Ah, y también puede proyectar cosas "sobresaliendo" de su pantalla a la superficie de la pantalla.
dyp
44
Para los juegos de perspectiva en primera persona, tener un FoV muy limitado puede ser irritante y perjudicar el juego y la OMI de inmersión, ya que ves mucho menos de lo que estás acostumbrado en la vida real. Personalmente, encuentro algo muy por debajo de 90 ° inadecuado. Imagínese parado en una esquina de una habitación cuadrada con un FoV horizontal de 65 °, como parece ser común para los juegos de consola: no podría ver toda la habitación, lo que le obligaría a mirar a izquierda y derecha para mantener la conciencia. Eso me volvería loco en la vida real :)
1
Sí, claro que lo es. Hágalo us.123rf.com/400wm/400/400/ronstik/ronstik1112/ronstik111200016/... con los dedos y simule una pantalla de 20 "frente a usted (a 80 cm de distancia). Ahora imagine que eso es todo lo que puede ver. Como melak47 señaló, eso sería irritante. Mueva esta pantalla / marco simulado de 20 "ahora a 20 cm de distancia de su cabeza y debe coincidir aproximadamente con su campo de visión real.
Dirk
3
De hecho, la falsa perspectiva inducida por un campo de visión artificialmente amplio es completamente antinatural, y personalmente a menudo encuentro que la distorsión que crea es estresante y molesta. Pero sigue siendo infinitamente preferible a tratar de ver todo a través de una mirilla de 20 ° -30 °, que es sobre lo que implicaría la perspectiva "realista" en un monitor único típico. Hable acerca de la visión del túnel!
Ilmari Karonen
3

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.

Maximus Minimus
fuente