Por que 90 ° horz / 60 ° vert é o campo de visão padrão do FPS?

14

Pelo que entendi, o campo de visão vertical deve ser ajustado para:

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

Ou seja, o campo de visão deve corresponder à distância e ao tamanho da tela do usuário.

Em muitos FPS, há um valor padrão de 90 ° para FoV horizontal ou 60 ° para FoV vertical (assumindo 16: 9). Um exemplo é o CryEngine. Mas para uma tela 16: 9 20 "(diagonal da área visível, ou seja, cerca de 40 cm x 25 cm), esse valor padrão exigiria que os usuários tivessem seus olhos a 20 cm da tela para obter uma visão correta correta.

Então, ou eu cometi um erro nos meus cálculos, ou deve haver uma razão pela qual você escolheria um valor de FoV inadequado de propósito.

Qual é o motivo de um FoV padrão de 90 ° horz / 60 ° vert?

dyp
fonte
Eu sei que FOVs mais altos podem fazer um jogo parecer mais rápido à medida que o cenário avança . Parece ser uma opção de design, também depende do dispositivo em que você está reproduzindo. Quais FPSs você mediu?
Anko
@ Anko Bem, eu fiz algumas "pesquisas" e encontrei muitas postagens no fórum informando para jogos diferentes que o FoV padrão é 90 ° horz. Além disso, li alguns documentos do CryEngine e brinquei com o FoV em seu jogo de exemplo.
Dpr
A razão pela qual o FOV é padrão para qualquer valor definido, é que geralmente não faz sentido definir um valor que não seja constante. A maioria dos monitores não possui sensores que indicam a que distância está a cabeça do usuário. Portanto, 90 graus é um "bom palpite". Suponho que você possa dizer que é equivalente a dizer que "todos os nossos 20" usuários de tela devem sentar-se a 20 cm de distância ". Você está dizendo que deseja diminuir o FOV porque a maioria dos usuários fica mais distante de suas telas? e você tem que deslocar mais para ver seu entorno Isso faz com que um jogo de chupar mais para mim..
Steven Lu
Resposta simples: porque parece bom o suficiente durante o jogo e não apresenta distorção indevida, como o FOV progressivamente mais amplo. Mexer com os ângulos da câmera é fácil em qualquer editor 3D, tente valores diferentes e veja você mesmo. Não é uma resposta simples: é uma conspiração maçônica.
22413 Patrick Hughes
Relacionados: gamedev.stackexchange.com/a/47619/14808
Laurent Couvidou

Respostas:

6

Eu acho que ter um FoV de 90 graus é o que parece natural quando você tenta imitar 'olhar através dos olhos humanos'. Seus cálculos seriam corretos se você usasse a tela para simular uma janela para um mundo virtual, não para uma perspectiva em primeira pessoa. Imagem que você teria que ver o mundo através de uma moldura de 20 "a 80cm da sua cabeça ...

Dirk
fonte
1
Mas não é "olhar através de uma janela para um mundo virtual" o que é uma projeção em perspectiva? Ah, e você também pode projetar coisas "destacadas" da tela na superfície da tela.
Dpr
4
Para jogos em perspectiva em primeira pessoa, ter um FoV muito limitado pode ser irritante e prejudicar a jogabilidade e a imersão da IMO, pois você vê muito menos do que está acostumado na vida real. Pessoalmente, acho algo muito abaixo de 90 ° inadequado. Imagine-se em pé em um canto de uma sala quadrada com um FoV horizontal de 65 °, como parece comum para jogos de console - você não seria capaz de ver a sala inteira, forçando-o a continuar olhando para a esquerda e direita para manter a consciência. Isso iria conduzir-me louco na vida real :)
1
Sim, claro que é. Faça isso us.123rf.com/400wm/400/400/ronstik/ronstik1112/ronstik111200016/… com os dedos e simule uma tela de 20 "à sua frente (80cm de distância). Agora imagine que isso é tudo o que você pôde ver. Afirme que isso seria irritante. Mova essa tela / moldura simulada de 20 "agora a 20 cm de sua cabeça e deve corresponder aproximadamente ao seu campo de visão real.
Dirk
3
De fato, a falsa perspectiva induzida por um campo de visão artificialmente amplo é completamente antinatural, e eu pessoalmente acho frequentemente a distorção que ela cria estressante e irritante. Mas ainda é infinitamente preferível tentar ver tudo através de um olho mágico de 20 ° -30 °, que é sobre o que a perspectiva "realista" em um único monitor típico implicaria. Fale sobre a visão de túnel!
Ilmari Karonen
3

Muito do efeito do FOV está na rapidez com que você parece se mover pelo mundo (ainda é a mesma velocidade; isso é puramente percebido). Com um FOV horizontal muito amplo, você parecerá se mover muito rápido; com estreito demais, parecerá se mover muito lentamente. 90 graus na horizontal parece ser o "ponto ideal", e o desenvolvedor do jogo pode ajustar a velocidade de movimento desejada para jogos individuais a partir daí.

Também é o caso que 4 vezes 90 graus é 360 graus, que é um círculo. A configuração do FOV horizontal para que ele mapeie bem os quadrantes dianteiro / esquerdo / traseiro / direito parece fazer sentido.

E, finalmente, há a velha castanha de precedência e inércia. Não tenho certeza se algum jogo ofereceu FOV ajustável por jogador antes do Quake, mas o Quake o fez e o padrão foi 90 graus na horizontal; é fácil imaginar outros jogos pegando 90 graus a partir daí.

Vale ressaltar que hoje em dia 90 graus está se tornando menos comum, com jogos (particularmente os modernos FPSs) configurando um valor um pouco menor - em torno de 80.

Se você deseja corrigir o aspecto do seu FOV, pode usar algo assim (não pretendo que seja o único ou o melhor caminho, mas é consistente com a calculadora do FOV em http://www.emsai.net/projects/widescreen / fovcalc / ; isso assume em relação a uma proporção básica de 4: 3 (você pode ajustar isso na chamada para CalcFovY abaixo))

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;
}

Então chame assim:

// 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

Os fov_x e fov_y calculados podem então ser conectados à seguinte matriz de perspectiva (convenção 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

Isso fornecerá um FOV horizontal ajustado ao aspecto que mantém o FOV vertical, independentemente da resolução e proporção.

Maximus Minimus
fonte