Ein Großteil der Wirkung von FOV hängt davon ab, wie schnell Sie sich scheinbar durch die Welt bewegen (es ist immer noch die gleiche Geschwindigkeit; dies ist eine reine Wahrnehmung). Bei einem zu breiten horizontalen FOV scheinen Sie sich sehr schnell zu bewegen, bei einem zu engen FOV scheinen Sie sich sehr langsam zu bewegen. 90 Grad horizontal scheint der "Sweet Spot" zu sein, und der Spieleentwickler kann von dort aus eine gewünschte Bewegungsgeschwindigkeit für einzelne Spiele einstellen.
Es ist auch der Fall, dass 4 mal 90 Grad 360 Grad sind, was ein Kreis ist. Es erscheint sinnvoll, das horizontale FOV so einzustellen, dass es gut auf die vorderen / linken / hinteren / rechten Quadranten abgestimmt ist.
Und schließlich gibt es die alte Kastanie der Vorrangstellung und Trägheit. Ich bin mir nicht sicher, ob Spiele ein vom Spieler einstellbares Sichtfeld vor dem Beben boten, aber das Beben tat es und es war standardmäßig auf 90 Grad horizontal eingestellt. Es ist leicht vorstellbar, dass andere Spiele von dort aus nur um 90 Grad ansteigen.
Es ist anzumerken, dass 90 Grad heutzutage weniger verbreitet sind und Spiele (insbesondere moderne FPS) einen etwas niedrigeren Wert haben - in oder um 80.
Wenn Sie Ihr FOV aspektkorrigieren möchten, können Sie so etwas verwenden (ich behaupte nicht, dass es der einzige oder beste Weg ist, aber er steht im Einklang mit dem FOV-Rechner unter http://www.emsai.net/projects/widescreen / fovcalc / ; dies wird relativ zu einem Basis-Seitenverhältnis von 4: 3 vorausgesetzt (Sie können dies im Aufruf von CalcFovY unten anpassen)
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;
}
Dann nenne es wie folgt:
// 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
Das berechnete fov_x und fov_y können dann in die folgende perspektivische Matrix (OpenGL-Konvention) eingefügt werden:
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
Auf diese Weise erhalten Sie ein an das Seitenverhältnis angepasstes horizontales FOV, das das vertikale FOV unabhängig von Auflösung und Seitenverhältnis beibehält.