Pengecoran bayangan waktu nyata dalam game isometrik 2D

15

Saya sedang menulis mesin isometrik 2d kecil di C ++ dan saya mencoba menerapkan pengecoran bayangan waktu nyata. Saya mengikuti pendekatan sederhana yang dijelaskan pada halaman ini dan inilah hasilnya (cahaya terletak pada posisi yang sama dari kubus kuning):

masukkan deskripsi gambar di sini

Hasilnya sangat bagus tetapi ada bayangan yang hilang di dinding dan di atas kubus. Berikut adalah contoh tampilannya (saya telah menggambar bayangan yang diharapkan berwarna hijau):

masukkan deskripsi gambar di sini

Semua kubus yang ditarik hanya terbuat dari 3 paha depan 2D yang terletak pada posisi XY dan dengan kedalaman Z (z = x + y). Saya menggunakan OpenGL dengan matriks ortografis (glOrtho). Bayangan digambar menggunakan buffer stensil.

Saya mencari sumber daya atau solusi yang akan membantu saya menyelesaikan implementasi pengecoran bayangan ini.

Terima kasih banyak!

XPac27
sumber
5
Tautan Anda ke "halaman ini" menunjuk ke gambar dan bukan ke halaman. Juga, saya hanya menebak-nebak di sini, tetapi mungkin lebih mudah untuk menyelesaikan masalah itu dalam 3D dan hanya memproyeksikan kamera secara iosmetrik.
Tetrad
Oups, Anda benar, saya memperbaiki tautannya. Tentunya akan lebih mudah dengan proyeksi 3D tetapi 2D juga memiliki kelebihannya dan saya yakin ada solusi untuk mengimplementasikannya dalam 2D.
XPac27

Jawaban:

6

Untuk atap dan dinding, Anda dapat mencoba untuk menentukan persimpangan antara segmen dinding Anda dan daerah bayangan yang dihasilkan. Anda perlu dua rendering bayangan Anda. Yang pertama akan melakukan apa yang Anda lakukan hari ini (dalam penyimpanan memori). Lulus kedua akan menghitung persimpangan atap dan dinding. Tahap terakhir adalah rendering nyata. DeadMG salah, Anda bisa melakukannya.

Catatan: untuk atap Anda harus memotong area bayangan dan area atap.

sgc
sumber
Terima kasih atas sarannya! Jika mungkin dapat mengoptimalkan lintasan kedua ini dengan memeriksa dinding mana yang harus dihitung menggunakan produk titik segmen mereka dibandingkan dengan yang segmen bayangan. Saya akan mencoba dan mengirim kembali jika itu berhasil.
XPac27
Sudah lama tapi saya akhirnya berhasil berkat saran Anda! Saya hanya membutuhkan 2 metode geometri (satu untuk mengetahui apakah suatu titik berada dalam poligon dan satu untuk mendapatkan persimpangan dua segmen). Saya masih harus menangani atap tetapi kelihatannya mudah diketahui. Anda dapat menonton hasilnya di video ini dan melihat kode sumbernya di sini (saya baru bekerja 1 hari di atasnya sehingga dimungkinkan untuk lebih mengoptimalkannya).
XPac27
@ XPac27 itu luar biasa. Terima kasih telah berbagi.
ashes999
0

Pada dasarnya, apa yang Anda cari tidak dapat dilakukan. Anda ingin mengambil banyak objek 2D dan minta mereka membuat bayangan seolah-olah mereka adalah objek 3D. Jika Anda ingin memiliki bayangan 3D penuh, Anda harus memiliki objek 3D.

DeadMG
sumber
1
Tapi itu bukan casting bayangan 3d seperti dalam pertanyaan. Dinding apa pun benar-benar menghalangi garis pandang ke arah itu, Anda tidak dapat memiliki objek dengan ketinggian bervariasi.
yuriks
0

Solusi yang dijelaskan tidak full 3d karena ia tidak memerlukan solusi 3d penuh. Akan terlihat seperti tetapi tidak. Pembuatan pengecoran bayangan harus dianggap sebagai persimpangan antara volume. Apa yang dia butuhkan tidak terlalu rumit. Ingat (jika Anda punya gaun) malapetaka dan malapetaka seperti mesin rendering. Semua pemrosesan dilakukan pada dua dimensi.

sgc
sumber
0

Mengingat Anda ingin game ini berukuran kecil, bagaimana dengan hanya mengatakan bahwa implementasi bayangan saat ini cukup baik?

Saya akui bahwa saya belum melihat ini dalam aksi, yaitu, saya belum melihat seberapa mengganggu atau tidak mengganggu ketidaksempurnaan bayangan akan ketika game ini dijalankan secara langsung dengan objek dinamis dan sumber cahaya dinamis tetapi menilai dari gambar Anda, saya ' Saya sangat tergoda untuk mengatakan "ini cukup baik, sekarang fokuslah untuk menyelesaikan permainan". Jika implementasi saat ini kecil dan mengeksekusi cepat dan memperbaiki apa yang Anda anggap masalah akan mengubah kode besar dan lambat, saya pikir Anda lebih baik tidak khawatir tentang bayangan itu.

Saya tahu, saya tahu, menyarankan "jangan mencoba untuk memecahkan masalah" sebagai solusi untuk masalah mungkin merupakan praktik yang buruk. Namun, saya jujur ​​ingin mengatakan bahwa itu benar-benar baik karena jika Anda ingin jejak kecil untuk kode Anda.

IllvilJa
sumber