Duży wpływ FOV polega na tym, jak szybko poruszasz się po świecie (to wciąż ta sama prędkość; jest to czysto percepcyjne). Przy zbyt szerokim poziomym polu widzenia będziesz wydawać się poruszać bardzo szybko, ze zbyt wąskimi będziesz wydawał się poruszać bardzo wolno. 90 stopni w poziomie wydaje się być „słodkim miejscem”, a twórca gry może stamtąd dostroić żądaną prędkość ruchu dla poszczególnych gier.
Jest tak również, że 4 razy 90 stopni to 360 stopni, co jest okręgiem. Wydaje się sensowne ustawienie poziomego pola widzenia w taki sposób, aby ładnie odwzorowywało się na ćwiartkach przedniej / lewej / tylnej / prawej.
I wreszcie jest stary kasztan pierwszeństwa i bezwładności. Nie jestem pewien, czy jakiekolwiek gry oferowały regulowaną przez gracza wartość pola widzenia przed Quake, ale Quake zrobił to i domyślnie ustawiony był na 90 stopni w poziomie; łatwo sobie wyobrazić, że inne gry zaczynają stamtąd pod kątem 90 stopni.
Warto zauważyć, że obecnie 90 stopni staje się coraz mniej powszechne, a gry (szczególnie współczesne FPS) mają nieco niższą wartość - około 80.
Jeśli chcesz poprawić aspekt swojego FOV, możesz użyć czegoś takiego (nie udaję, że jest to jedyny lub najlepszy sposób, ale jest zgodny z kalkulatorem FOV pod adresem http://www.emsai.net/projects/widescreen / fovcalc / ; to założenie w stosunku do podstawowego współczynnika proporcji 4: 3 (możesz to zmienić w wywołaniu CalcFovY poniżej))
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;
}
Następnie nazwij to tak:
// 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
Obliczone fov_x i fov_y można następnie podłączyć do następującej macierzy perspektywicznej (konwencja 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
To da ci poziome pole widzenia z regulacją kształtu, które utrzymuje pionowe pole widzenia niezależnie od rozdzielczości i współczynnika proporcji.