FOV의 효과는 세계를 얼마나 빠르게 움직이는 지에 달려 있습니다 (여전히 같은 속도입니다. 순전히 지각입니다). 가로 FOV가 너무 넓 으면 매우 빠르게 움직이는 것처럼 보이고 너무 좁 으면 매우 느리게 움직이는 것처럼 보입니다. 수평 90 도는 "스위트 스폿"인 것처럼 보이며 게임 개발자는 개별 게임에 대해 원하는 이동 속도를 조정할 수 있습니다.
또한 4 곱하기 90 도는 360 도인 원입니다. 앞 / 왼쪽 / 뒤 / 오른쪽 사분면에 잘 맞도록 수평 FOV를 설정하면 의미가있는 것 같습니다.
그리고 마지막으로 오래된 우선 순위와 관성이 있습니다. Quake 이전에 어떤 게임에서 플레이어 조정 가능 FOV를 제공했는지 확실하지 않지만 Quake는 수평으로 90도를 설정했습니다. 다른 게임이 거기에서 90도 정도 올라 오는 것을 상상하기 쉽습니다.
게임 (특히 현대 FPS)이 약간 낮은 값 (약 80 또는 약 80)으로 설정됨에 따라 오늘날 90 도는 덜 일반적입니다.
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를 제공합니다.