据我所知,垂直视野应调整为:
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°的原因是什么?
发布于 2013-04-09 20:10:04
我认为,当你试图模仿“透过人眼观察”时,拥有90度的FoV是一种自然的感觉。如果您使用屏幕模拟进入虚拟世界的窗口,而不是第一人称透视图,您的计算将是正确的。图片你将不得不看到世界通过一个20“框架80厘米远离你的头.
发布于 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时调整这一点)
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
这将给你一个方面调整的水平视场,保持垂直视场,无论分辨率和高宽比。
https://gamedev.stackexchange.com/questions/53601
复制相似问题