Apakah ada hal seperti jawaban singkat tentang cara melakukan efek tipe Mode 7 / mario kart di pygame?
Saya telah melakukan pencarian di Google secara ekstensif, semua dokumen yang dapat saya buat adalah lusinan halaman dalam bahasa lain (asm, c) dengan banyak persamaan yang tampak aneh dan semacamnya.
Idealnya, saya ingin menemukan sesuatu yang lebih banyak dijelaskan dalam bahasa Inggris daripada dalam istilah matematika.
Saya dapat menggunakan PIL atau pygame untuk memanipulasi gambar / tekstur, atau apa pun yang diperlukan.
Saya benar-benar ingin mencapai efek mode 7 di pygame, tapi saya sepertinya dekat dengan kecerdasan saya. Bantuan akan sangat dihargai. Setiap dan semua sumber daya atau penjelasan yang dapat Anda berikan akan menjadi luar biasa, meskipun tidak semudah yang saya inginkan.
Jika saya bisa mengetahuinya, saya akan menulis definitif bagaimana melakukan mode 7 untuk halaman pemula.
edit: mode 7 doc: http://www.coranac.com/tonc/text/mode7.htm
Jawaban:
Mode 7 adalah efek yang sangat sederhana. Ini memproyeksikan tekstur x / y 2D (atau ubin) ke beberapa lantai / langit-langit. SNES lama menggunakan perangkat keras untuk melakukan ini, tetapi komputer modern sangat kuat sehingga Anda dapat melakukan ini secara realtime (dan tidak perlu ASM seperti yang Anda sebutkan).
Rumus matematika 3D dasar untuk memproyeksikan titik 3D (x, y, z) ke titik 2D (x, y) adalah:
Ketika Anda memikirkannya, itu masuk akal. Objek yang jauh jaraknya lebih kecil dari objek di dekat Anda. Pikirkan tentang rel kereta api yang menuju ke mana-mana:
Jika kita melihat kembali nilai input rumus:
x
dany
akan menjadi piksel saat ini kami sedang memproses, danz
akan menjadi informasi jarak tentang seberapa jauh titik tersebut. Untuk memahami apa yangz
seharusnya, lihat gambar itu, itu menunjukkanz
nilai untuk gambar di atas:Jadi dalam contoh ini,
z
nilainya adalahy - horizon
(dengan asumsi(x:0, y:0)
berada di tengah layar)Jika kita menyatukan semuanya, itu menjadi: (pseudocode)
Satu hal terakhir: jika Anda ingin membuat game mario kart, saya kira Anda juga ingin memutar peta. Yah itu juga sangat mudah: memutar
sx
dansy
sebelum mendapatkan nilai tekstur. Berikut ini rumusnya:dan jika Anda ingin memindahkan melalui peta, cukup tambahkan beberapa offset sebelum mendapatkan nilai tekstur:
CATATAN: Saya menguji algoritme (hampir salin-tempel) dan berfungsi. Berikut ini contohnya: http://glslsandbox.com/e#26532.3 (memerlukan browser terbaru dan WebGL diaktifkan)
NOTE2: saya menggunakan matematika sederhana karena Anda mengatakan Anda menginginkan sesuatu yang sederhana (dan sepertinya tidak terbiasa dengan matematika vektor). Anda dapat mencapai hal yang sama menggunakan rumus wikipedia atau tutorial yang Anda berikan. Cara mereka melakukannya jauh lebih kompleks tetapi Anda memiliki lebih banyak kemungkinan untuk mengkonfigurasi efeknya (pada akhirnya itu berfungsi sama ...).
Untuk informasi lebih lanjut, saya sarankan membaca: http://en.wikipedia.org/wiki/3D_projection#Perspective_projection
sumber
Ini kode untuk membuatnya. Saya adalah kode yang sama dengan tutorial yang saya buat di blog saya . Periksa di sana untuk mempelajari metode Mode 7 dan RayCasting.
Pada dasarnya, kode semu itu:
Berikut adalah kode yang saya buat di JAWA, mengikuti tutorial saya.
Hasilnya adalah:
sumber