Rất nhiều tác dụng của FOV là tốc độ di chuyển của bạn trên thế giới nhanh như thế nào (nó vẫn có cùng tốc độ; đây hoàn toàn là sự cảm nhận). Với FOV quá rộng, dường như bạn sẽ di chuyển rất nhanh, với quá hẹp dường như bạn sẽ di chuyển rất chậm. Ngang 90 độ dường như là "điểm ngọt" và nhà phát triển trò chơi có thể điều chỉnh tốc độ di chuyển mong muốn cho từng trò chơi từ đó.
Cũng có trường hợp 4 lần 90 độ là 360 độ, đó là một vòng tròn. Thiết lập FOV ngang để nó ánh xạ độc đáo vào các góc phần tư trước / trái / sau / phải xuất hiện có ý nghĩa.
Và cuối cùng là hạt dẻ cũ của ưu tiên và quán tính. Tôi không chắc liệu có trò chơi nào cung cấp FOV do người chơi điều chỉnh trước Quake không, nhưng Quake đã làm và nó được mặc định là 90 độ theo chiều ngang; thật dễ dàng để tưởng tượng các trò chơi khác chỉ cần chọn 90 độ từ đó.
Điều đáng chú ý là ngày nay 90 độ đang trở nên ít phổ biến hơn, với các trò chơi (FPS đặc biệt hiện đại) có giá trị thấp hơn một chút - trong hoặc khoảng 80.
Nếu bạn muốn chỉnh sửa khía cạnh FOV của mình, bạn có thể sử dụng cái gì đó như thế này (Tôi không giả vờ đó là cách duy nhất hoặc tốt nhất, nhưng nó phù hợp với máy tính FOV tại http://www.emsai.net/projects/widescreen / fovcalc / ; điều này giả định tỷ lệ khung hình cơ bản là 4: 3 (bạn có thể điều chỉnh điều đó trong lệnh gọi tới CalcFovY bên dưới))
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;
}
Sau đó gọi nó như:
// 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 và fov_y được tính toán sau đó có thể được cắm vào ma trận phối cảnh sau (quy ước 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
Điều này sẽ cung cấp cho bạn một FOV ngang được điều chỉnh theo khía cạnh, duy trì FOV dọc không phân biệt độ phân giải và tỷ lệ khung hình.