Jadi saya berpikir tentang membuat game 2D di mana Anda juga bisa bergerak di sepanjang sumbu Z, dengan mengubah di lapisan mana Anda berada. Tergantung pada kedalamannya saya ingin skala sprite 2D saya.
Suatu ketika, seseorang telah menunjukkan kepada saya sebuah demo di mana dia memiliki banyak sprite 2d, dan dengan menggulirnya dia bisa mengubah kedalaman kamera. Jadi ketika memperbesar, objek akan mendekati pemain, dan tampak lebih besar. Lalu saya bertanya-tanya, seberapa besar seharusnya sebuah benda ketika mendekati 1 unit. Bagaimana Anda menghitungnya? Jadi pria itu mengatakan kepada saya: Ada satu aturan dasar yang saya gunakan: "objek dua kali lebih dekat, muncul dua kali lebih besar."
Sekarang, dengan mengujinya sendiri, saya tahu aturan itu tidak berlaku di dunia nyata;) Tetapi apakah ada beberapa konstanta yang digunakan dalam perhitungan dunia nyata untuk perspektif atau sesuatu? Atau formula?
Saya tahu ini mungkin bukan tempat terbaik untuk mengajukan pertanyaan seperti itu, tetapi karena ini adalah satu-satunya situs yang saya gunakan untuk pertanyaan yang terkait dengan permainan, dan konteks saya adalah sebuah permainan, saya pikir saya akan mencobanya. Juga, saya agak berharap bahwa ada orang ini di sini yang tahu segalanya tentang perspektif 3D dan matriks atau sesuatu, karena mungkin berhubungan dengan game 3D;)
tl; dr:
"sebuah objek dua kali lebih dekat, muncul dua kali lebih besar" Itu tidak benar di dunia nyata. Tapi konstanta atau rumus mana yang benar?
sumber
Jawaban:
Secara umum itu benar, tergantung pada sudut pandang Anda dan ke arah mana ia bergerak, serta sudut pandangnya.
Perhatikan bagaimana dalam tampilan kamera pertama, karena blok Merah tegak lurus terhadap tampilan kamera, objek tampak dua kali lebih besar dalam rasio 1: 2 yang sempurna (Perhatikan panah yang menunjuk bahwa ia menyentuh tepi tampilan setelah dipindahkan) dua kali lebih dekat)
Yang kedua adalah blok ukuran yang sama diputar pada 45 derajat. Saat diputar, tepi bawah tidak lagi pada jarak yang sama dari kamera dengan tepi atas, sehingga tidak terlihat dengan benar skala ke rasio 1: 2 tetapi pada kenyataannya sebenarnya dua kali lebih besar (seperti pada sudut yang sama pada blok biru jauh seperti di blok biru dekat.)
Kesimpulannya ini sebenarnya berarti teman Anda benar dan rasio 1: 1 ("objek dua kali lebih dekat, muncul dua kali lebih besar.") Untuk objek Anda adalah pilihan yang baik.
sumber
Objek dua kali lebih dekat muncul dua kali lebih besar. Ini adalah konsekuensi dari Teorema Thales dan itu benar di dunia nyata.
Orang bisa berpendapat bahwa Teorema Thales adalah alat matematika inti di balik proyeksi perspektif dan apa yang dikenal dalam pipa grafis (OpenGL atau DirectX) sebagai divisi perspektif . Ini adalah teorema yang harus Anda ketahui, dan belajarlah untuk mengenali kapan itu dapat digunakan.
sumber
Sebenarnya itu cukup banyak benar (jika Anda memindahkan objek dua kali lebih jauh terlihat setengah besar) tetapi itu mengaburkan bagaimana ukuran visual objek harus berubah ketika pemirsa bergerak. Khususnya, objek tampak semakin besar semakin cepat semakin dekat. Itu karena pemirsa mencakup setengah jarak jauh lebih cepat ketika objek dekat, dibandingkan dengan ketika objek lebih jauh. Atau dengan kata lain, sementara kecepatan pemirsa konstan, nilai "setengah jarak" berubah ketika jarak ke objek berubah.
sumber
Karena Anda tidak benar-benar bekerja di ruang 3D, kami dapat menganggap sprite tidak pernah berputar (rotasi dapat disimulasikan dengan skewing, dll.) Kendala sederhana ini membuatnya cukup mudah untuk mendapatkan angka yang agak akurat tentang ukuran yang harusnya tergantung pada jarak dari kamera.
Pertama, Anda perlu memahami bagaimana objek 3D dirender. Meskipun kamera menyatu ke satu titik, ada bidang yang tidak terlihat yang bertindak sebagai layar untuk menggambar objek. Satu-satunya hal yang perlu Anda ketahui tentang layar adalah seberapa jauh jaraknya dari kamera.
Berikut adalah diagram tentang bagaimana suatu objek dirender ke kamera pada dua jarak yang berbeda.
Seperti yang Anda harapkan, ketinggian objek tergantung pada jarak dari kamera. TETAPI karena rending terjadi pada bidang culling dekat, kita harus menghitung ketinggian sprite pada titik itu.
Beberapa perhitungan trigonometri dasar akan mengarahkan Anda ke rumus berikut:
CONTOH:
Saya sarankan mulai dengan
v=5
dan kemudian menyesuaikan dari sana berdasarkan tampilannya. Saya bisa melempar biola bersama yang memungkinkan Anda untuk melihat perubahan secara realtime.TL; DR
EDIT: Ketika Anda mengatakan bergerak di sepanjang sumbu z, saya berasumsi Anda akan menginginkan tampilan perspektif (seperti kebanyakan game 3D; penembak, dll.) Matematika untuk menghitung ukuran objek berdasarkan jarak juga akan tergantung pada lokasi dalam bingkai, mirip dengan penglihatan tepi. Sebagai gantinya, saya akan mencobanya dengan matematika saya yang merupakan pandangan ortografis (pikirkan Mario, Angry Birds, Super Smash Bros, dll.). Saya tidak tahu tampilan dan perasaan yang Anda coba capai, tetapi selama itu tampak nyata maka para pemain tidak akan pernah tahu!
DEMO!
sumber
Ini tidak tercakup dan saya pikir ini mungkin bermanfaat: Ini harus dicatat ketika Anda setengah jarak, menggandakan ukuran di kedua dimensi X dan Y akan melipatgandakan luas total sprite. Hal ini karena:
Setelah Memperbesar:
Ini dapat memberi Anda kesan bahwa efek pembesaran terjadi dengan cepat atau terlalu kuat. Anda dapat menyesuaikan faktor dengan mengubah 2 pada rumus di atas menjadi nilai float seperti 1,5 atau 1,33.
Atau, apa yang saya lakukan adalah menyimpan kedalaman kamera (jarak) ke ubin Anda dalam nilai byte bersama dengan terjemahan kamera (X dan Y) kemudian menghitung ukuran ubin yang diproyeksikan sebagai berikut:
Perhatikan bahwa
CameraZ
harus ketat antara 1-255, dan pembatasan itu mungkin bermanfaat atau merugikan bagi Anda di masa depan.sumber