首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么90°horz /60度是默认的FPS视场?

为什么90°horz /60度是默认的FPS视场?
EN

Game Development用户
提问于 2013-04-09 19:52:20
回答 2查看 7.4K关注 0票数 14

据我所知,垂直视野应调整为:

代码语言:javascript
运行
复制
fov = 2 * arctan(0.5*screenHeight / distanceEyeScreen);

也就是说,视图字段应该匹配用户与屏幕的距离和大小。

在许多FPS中,水平FoV的默认值为90°,垂直FoV为60°(假设16:9)。CryEngine就是一个例子。但是对于16:9 20英寸的屏幕(可见区域的对角线,即大约40厘米x25厘米),这个默认值将要求用户的眼睛离屏幕20厘米,以便获得一个前瞻性的正确视图。

所以,要么我在计算中犯了错误,要么你会故意选择一个不适当的FoV值。

默认FoV为90°或60°的原因是什么?

EN

回答 2

Game Development用户

回答已采纳

发布于 2013-04-09 20:10:04

我认为,当你试图模仿“透过人眼观察”时,拥有90度的FoV是一种自然的感觉。如果您使用屏幕模拟进入虚拟世界的窗口,而不是第一人称透视图,您的计算将是正确的。图片你将不得不看到世界通过一个20“框架80厘米远离你的头.

票数 6
EN

Game Development用户

发布于 2013-04-09 20:43:28

FOV在很大程度上影响了你在这个世界上的移动速度(它仍然是相同的速度;这纯粹是感性的)。如果水平视野太宽,你的移动速度会很快,而太窄的时候,你的移动速度会很慢。水平90度似乎是“甜蜜点”,游戏开发人员可以从那里为单个游戏调整期望的运动速度。

同样,4乘以90度等于360度,这是一个圆。设置水平视场,使其很好地映射到前面/左/后/右象限似乎是有意义的。

最后是优先和惰性的老栗子。我不确定是否有任何游戏在地震前提供玩家可调的视场,但是Quake做到了,并且默认为水平90度;很容易想象其他游戏只是从那里上升到90度。

值得注意的是,现在90度越来越不常见了,游戏(特别是现代FPS)的价值略低一些--在80英寸左右。

如果你想要纠正你的FOV,你可以使用这样的方法(我不认为这是唯一或最好的方法,但它与http://www.emsai.net/projects/widescreen/fovcalc/上的FOV计算器是一致的;这假设相对于4:3的基本纵横比(您可以在下面调用CalcFovY时调整这一点)

代码语言:javascript
运行
复制
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;
}

然后把它叫做:

代码语言:javascript
运行
复制
// 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约定)中:

代码语言:javascript
运行
复制
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

这将给你一个方面调整的水平视场,保持垂直视场,无论分辨率和高宽比。

票数 4
EN
页面原文内容由Game Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://gamedev.stackexchange.com/questions/53601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档