Mengapa 90 ° horz / 60 ° vert bidang pandang FPS default?

14

Sejauh yang saya mengerti, bidang pandang vertikal harus disesuaikan dengan:

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

Artinya, Bidang Tampilan harus sesuai dengan jarak pengguna ke dan ukuran layar.

Dalam banyak FPS, ada nilai default 90 ° untuk FoV horizontal, atau 60 ° untuk FoV vertikal (dengan asumsi 16: 9). Salah satu contohnya adalah CryEngine. Tetapi untuk layar 16: 9 20 "(diagonal area yang terlihat, yaitu sekitar 40 cm x 25 cm), nilai default ini akan mengharuskan pengguna untuk memiliki mata mereka 20 cm dari layar untuk mendapatkan tampilan yang benar secara perspektif.

Jadi entah saya membuat kesalahan dalam perhitungan saya, atau pasti ada alasan mengapa Anda memilih nilai FoV yang tidak memadai dengan sengaja.

Apa alasan FoV default 90 ° horz / 60 ° vert?

dyp
sumber
Saya tahu bahwa FOV yang lebih tinggi dapat membuat gim terasa lebih cepat saat pemandangan melintas . Tampaknya menjadi pilihan desain, juga tergantung pada perangkat yang Anda mainkan. FPS apa yang Anda ukur?
Anko
@Anko Yah saya sudah melakukan "riset" dan menemukan banyak posting forum yang menyatakan untuk permainan yang berbeda bahwa FoV default adalah 90 ° horz. Plus, saya membaca beberapa dokumen CryEngine dan bermain-main dengan FoV dalam contoh game-nya.
dyp
The Alasan mengapa FOV adalah default nilai apa pun sudah diatur untuk, adalah bahwa hal itu umumnya tidak masuk akal untuk menetapkan nilai yang tidak konstan. Sebagian besar tampilan tidak memiliki sensor yang mengetahui seberapa jauh kepala pengguna. Karena itu 90 derajat adalah "tebakan yang baik". Saya kira Anda mungkin mengatakan itu setara dengan mengatakan "semua dari 20" pengguna layar kami harus duduk sejauh 20cm darinya. "Apakah Anda mengatakan Anda ingin mengurangi FOV karena sebagian besar pengguna duduk lebih jauh dari layar mereka? dan Anda harus menjelajah lebih banyak untuk melihat lingkungan Anda. Itu membuat permainan menjadi lebih membosankan bagi saya
Steven Lu
Jawaban sederhana: karena rasanya cukup enak saat bermain dan tidak menimbulkan distorsi yang tidak semestinya seperti FOV yang semakin luas. Bergaul dengan sudut-sudut kamera mudah dilakukan di setiap editor 3D, coba nilai yang berbeda dan lihat sendiri. Bukan jawaban sederhana: ini konspirasi masonik.
Patrick Hughes
Terkait: gamedev.stackexchange.com/a/47619/14808
Laurent Couvidou

Jawaban:

6

Saya pikir memiliki FoV 90deg adalah apa yang terasa alami ketika Anda mencoba meniru 'melihat melalui mata manusia'. Perhitungan Anda akan benar jika Anda akan menggunakan layar untuk mensimulasikan jendela ke dunia virtual, bukan perspektif orang pertama. Gambar Anda harus melihat dunia melalui 20 "bingkai 80cm dari kepala Anda ...

Beladau
sumber
1
Tetapi bukankah "melihat melalui jendela ke dunia maya" apa yang dimaksud dengan proyeksi perspektif? Oh, dan Anda juga dapat memproyeksikan hal-hal "mencuat" dari layar Anda ke permukaan layar.
dyp
4
Untuk permainan perspektif orang pertama, memiliki FoV yang sangat terbatas dapat mengganggu dan melukai gameplay dan IMO imersi, karena Anda melihat jauh lebih sedikit daripada yang biasa Anda lakukan dalam kehidupan nyata. Secara pribadi, saya menemukan sesuatu yang jauh di bawah 90 ° tidak memadai. Bayangkan berdiri di sudut ruangan persegi dengan FoV horizontal 65 ° yang tampaknya umum untuk permainan konsol - Anda tidak akan dapat melihat seluruh ruangan, memaksa Anda untuk terus melihat ke kiri dan ke kanan untuk mempertahankan kesadaran. Itu akan membuat saya gila dalam kehidupan nyata :)
1
Ya, tentunya. Lakukan ini us.123rf.com/400wm/400/400/ronstik/ronstik1112/ronstik111200016/... dengan jari-jari Anda dan simulasikan layar 20 "di depan Anda (berjarak 80cm). Sekarang bayangkan hanya itu yang bisa Anda lihat. Seperti melak47 tunjukkan, itu akan menjengkelkan. Pindahkan layar / bingkai 20 "yang disimulasikan ini sekarang berjarak 20 cm dari kepala Anda dan itu harus sesuai dengan bidang pandang Anda yang sebenarnya.
Dirk
3
Memang, perspektif salah yang disebabkan oleh bidang pandang artifisial yang luas sama sekali tidak wajar, dan saya pribadi sering menemukan distorsi yang ditimbulkannya membuat stres dan menjengkelkan. Tapi itu masih jauh lebih baik daripada mencoba untuk melihat semuanya melalui lubang intip 20 ° -30 °, yang adalah tentang apa yang "realistis" perspektif pada monitor tunggal khas akan menyiratkan. Bicara tentang penglihatan terowongan!
Ilmari Karonen
3

Banyak efek dari FOV adalah pada seberapa cepat Anda tampaknya bergerak di dunia (masih kecepatan yang sama; ini murni persepsi). Dengan FOV horizontal terlalu lebar Anda akan terlihat bergerak sangat cepat, dengan terlalu sempit Anda akan terlihat bergerak sangat lambat. 90 derajat horisontal tampaknya menjadi "sweet spot", dan pengembang game dapat menyesuaikan kecepatan gerakan yang diinginkan untuk masing-masing game dari sana.

Ini juga terjadi bahwa 4 kali 90 derajat adalah 360 derajat, yang merupakan lingkaran. Menyiapkan FOV horizontal sehingga memetakan dengan baik ke kuadran depan / kiri / belakang / kanan tampaknya masuk akal.

Dan akhirnya ada kastanye tua yang diutamakan dan inersia. Saya tidak yakin apakah ada game yang menawarkan FOV yang dapat disesuaikan pemain sebelum Quake, tetapi Quake melakukannya dan defaultnya adalah 90 derajat horizontal; mudah membayangkan game lain hanya mengambil 90 derajat dari sana.

Perlu dicatat bahwa saat ini 90 derajat menjadi kurang umum, dengan permainan (terutama FPS modern) ditetapkan pada nilai yang sedikit lebih rendah - di atau sekitar 80.

Jika Anda ingin memperbaiki aspek FOV Anda, Anda dapat menggunakan sesuatu seperti ini (saya tidak berpura-pura itu satu-satunya atau cara terbaik, tetapi konsisten dengan kalkulator FOV di http://www.emsai.net/projects/widescreen / fovcalc / ; ini mengasumsikan relatif terhadap rasio aspek dasar 4: 3 (Anda dapat menyesuaikannya dalam panggilan ke CalcFovY di bawah))

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;
}

Kemudian menyebutnya seperti:

// 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 dan fov_y yang dihitung kemudian dapat dicolokkan ke matriks perspektif berikut (konvensi 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

Ini akan memberi Anda FOV horizontal yang disesuaikan dengan aspek yang mempertahankan FOV vertikal terlepas dari resolusi dan rasio aspek.

Maximus Minimus
sumber