Une grande partie de l'effet du FOV est sur la vitesse à laquelle vous semblez vous déplacer dans le monde (c'est toujours la même vitesse; c'est purement perceptionnel). Avec un champ de vision horizontal trop large, vous semblerez vous déplacer très rapidement, avec trop étroit, vous semblerez se déplacer très lentement. Un angle de 90 degrés semble être le "point idéal", et le développeur du jeu peut régler la vitesse de déplacement souhaitée pour les jeux individuels à partir de là.
C'est aussi le cas que 4 fois 90 degrés soit 360 degrés, ce qui est un cercle. La configuration du champ de vision horizontal de manière à ce qu'il corresponde parfaitement aux quadrants avant / gauche / arrière / droit semble logique.
Et enfin, il y a le vieux châtaignier de préséance et d'inertie. Je ne sais pas si certains jeux offraient un champ de vision réglable par le joueur avant Quake, mais Quake l'a fait et il était par défaut à 90 degrés horizontal; il est facile d'imaginer que d'autres jeux prennent juste 90 degrés à partir de là.
Il convient de noter que de nos jours, les degrés 90 deviennent de moins en moins courants, les jeux (en particulier les FPS modernes) ayant une valeur légèrement inférieure - aux alentours de 80.
Si vous voulez corriger l'aspect de votre FOV, vous pouvez utiliser quelque chose comme ça (je ne prétends pas que c'est la seule ou la meilleure façon, mais c'est cohérent avec la calculatrice FOV à http://www.emsai.net/projects/widescreen / fovcalc / ; cela suppose un rapport d'aspect de base de 4: 3 (vous pouvez l'ajuster dans l'appel à CalcFovY ci-dessous))
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;
}
Ensuite, appelez-le comme:
// 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
Les fov_x et fov_y calculés peuvent ensuite être branchés dans la matrice de perspective suivante (convention 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
Cela vous donnera un champ de vision horizontal ajusté qui conserve le champ de vision vertical quels que soient la résolution et le rapport d'aspect.