FOV的许多影响在于您似乎在整个世界中移动的速度(速度仍然相同;这纯粹是感知上的)。如果水平FOV太宽,您似乎移动得很快,而如果太窄,您似乎移动得很慢。水平90度似乎是“最佳位置”,游戏开发人员可以从此处调整各个游戏的所需移动速度。
同样是90度的4倍是360度,这是一个圆。设置水平FOV以使其很好地映射到前/左/后/右象限似乎是有意义的。
最后是优先级和惯性的古老板栗。我不确定在Quake之前是否有游戏提供玩家可调节的FOV,但是Quake确实提供了,并且它默认为90度水平;容易想象其他游戏只是从那里开始呈90度倾斜。
值得注意的是,如今90度正变得越来越少,游戏(尤其是现代FPS)的设定值略低一些-在80左右。
如果您要对FOV进行方面校正,则可以使用以下方式(我不认为这是唯一或最佳方法,但这与http://www.emsai.net/projects/widescreen上的FOV计算器一致/ fovcalc /;这是假定相对于4:3的基本长宽比(您可以在下面的CalcFovY调用中进行调整)
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;
}
然后像这样调用它:
// 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
然后可以将计算出的fov_x和fov_y插入以下透视图矩阵(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
这将为您提供经过宽高比调整的水平FOV,无论分辨率和宽高比如何,都可以保持垂直FOV。