Saya sedang mengerjakan Roguelike, dan untuk itu saya telah membuat algoritma ray-tracing / casting-of-view (FoV) yang terdiri dari memplot garis Bresenham ke setiap titik dalam lingkaran padat. Ini bebas artefak (dan cukup efisien), tetapi tidak memiliki persyaratan penting saya: simetri (jika Anda dapat melihat monster, ia juga harus dapat melihat Anda).
Berikut adalah contoh perilaku kode saya yang tidak simetris. Pada gambar kiri saya berdiri di sudut (merah 'X' blok = dinding). Saya dapat melihat ubin kanan atas. Namun, jika saya pindah ke salah satu ubin (gambar kanan), saya tidak bisa lagi melihat ubin dari mana saya berasal.
Saya pikir saya mungkin mengincar bentuk Permissive Field of View , tetapi hanya karena artikel Roguebasin menyarankannya untuk simetri. Adakah cara alternatif untuk mendapatkan simetri?
sumber
Jawaban:
Tampaknya Anda memasukkan kotak ketika Anda dapat melihat titik di dalamnya saat mata berada pada titik tetap tunggal.
Namun, Anda hanya perlu memasukkan kotak ketika Anda bisa melihat bagian tengahnya (dengan asumsi "mata" juga ada di tengah). Atau Anda dapat menggambar sinar dari setiap sudut mulai persegi ke sudut-sudut kotak diuji, jika Anda dapat melihat dari mana pun termasuk.
Poin kuncinya adalah bahwa kotak hit dari kotak juga harus menjadi semua lokasi di mana mata harus berada.
sumber