为什么90°horz / 60°转换默认的FPS视野?


14

据我了解,垂直视场应调整为:

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

也就是说,视野应与用户的距离和屏幕尺寸相匹配。

在许多FPS中,水平FoV的默认值为90°,而垂直FoV的默认值为60°(假设16:9)。一个示例是CryEngine。但是对于16:9 20“屏幕(可视区域的对角线,即约40 cm x 25 cm),此默认值将要求用户的眼睛距屏幕20 cm,以便获得正确的透视图。

因此,要么我在计算中犯了一个错误,要么一定是有理由为什么您故意选择了不足的FoV值。

默认FoV为90°horz / 60°vert的原因是什么?


我确实知道,随着景色的变幻,较高的FOV可以使游戏感觉更快。这似乎是一个设计选择,还取决于您正在播放的设备。您测量了哪些FPS?
Anko

@Anko好吧,我做了一些“研究”,发现了很多论坛帖子,它们针对不同的游戏将默认FoV设置为90°horz。另外,我阅读了一些CryEngine文档,并在其示例游戏中使用了FoV。
dyp

原因为,为什么FOV是默认的任何值设置为是,它通常是没有意义的设置值不是恒定的。大多数显示器都没有传感器来告知用户头部的距离。因此90度是一个“不错的猜测”。我想您可能会说这相当于说“我们所有20个”屏幕的用户都应坐在距其20cm的位置。”您是否要降低FOV,因为大多数用户离他们的显示位置都更远?你得平移多看看你的周围,使一个游戏更吸吮我。
史蒂芬路

简单的答案:因为在播放时感觉很好,并且不会像逐渐变宽的FOV那样引入不适当的失真。在任何3D编辑器中,使用相机角度进行测量都很容易,尝试不同的值并亲自观察。不简单的答案:这是共济会的阴谋。
Patrick Hughes

Answers:


6

我认为当尝试模仿“通过人眼看”时,具有90deg的FoV感觉很自然。如果您使用屏幕来模拟进入虚拟世界而不是第一人称视角的窗口,则您的计算将是正确的。图像,您将不得不看到世界在距头部80厘米处有一个20英寸的镜框...


1
但是,不是“透过一扇窗户进入虚拟世界”是什么?哦,您还可以将东西“伸出”到屏幕表面。
dyp

4
对于第一人称视角游戏,FoV非常有限可能会令人烦恼并损害游戏玩法和沉浸式IMO,因为您所看到的东西远少于现实生活中所习惯的。就个人而言,我发现任何低于90°的地方都不足够。想象一下,站在水平角视场角为65°的方形房间的一角,这在主机游戏中似乎很常见-您将无法看到整个房间,迫使您不断向左右看以保持意识。那会让我在现实生活中发疯:)

1
是的,当然是。做到这一点us.123rf.com/400wm/400/400/ronstik/ronstik1112/ronstik111200016/...用手指在你的面前(80厘米远)模拟20"的屏幕。现在想象一下这是所有你能看到的。至于melak47指出,这很烦人。现在将这个模拟的20英寸屏幕/框架移动到离头部20cm的地方,它应该与您的实际视野大致匹配。
德克,

3
确实,由人为的广阔视野引起的错误观点是完全不自然的,而且我个人经常发现它造成的压力和烦人的失真。但是尝试通过20°-30°的窥视孔查看所有内容仍然是无限可取的,这就是典型的单个监视器所暗示的“现实”视角。谈论隧道视野!
Ilmari Karonen

3

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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.