Poisson Disc Sampling Algoritması ile Rastgele Obje Yerleşimi
Unity üzerinde geliştirdiğim oyun projesi, rastgele olarak konumlandırılmış bir takım objeler (Ağaç, Taş, Geyik, Düşman gibi) barındıran seviyeler içeriyordu. Bu objelerin yerleştirilmesi üzerine ilk akla gelen yöntemlerden birisi olan Rastgele konumlandırma metodunu denedim. Bu algoritmaya göre: Rastgele bir koordinat üretilir. Ardından bu koordinat etrafındaki belirli bir alan kontrol edilir. Eğer belirtilen alan içerisinde başka bir obje bulunmuyorsa obje bu konuma yerleştirilir. Aksi durumda başka bir rastgele koordinat üretilir ve aynı işlemler tekrar edilir. Ta ki sırada yerleştirilecek başka obje kalmayıncaya kadar. Nitekim bu metot, ön görülemez bir yerleştirme haritası izlemektedir. Zaman zaman objeler çok dip dibe iken, kimi zaman da birbirlerinden çok uzak olabilmektedir. Ortada belirli bir harita olmadığından yerleştirilebilecek net obje sayısını önceden bilebilmek mümkün değildir. Bu durum şuanda olmasa da ilerideki geliştirme sürecinde problem yaratabileceğini öngörerek farklı yaklaşımlar araştırmaya koyuldum. Bu noktada karşıma “Poisson Disc Sampling” algoritması çıktı.
Poisson Disc Sampling (PDS) algoritmasının temeline; önceden belirtilen mesafenin (radius) kenar ortay uzunluğuna eşit olduğu, karelerden meydana gelen hücreler konumlandırılabilir. Üretilmiş olan koordinat bu hücrenin içerisindeki herhangi bir yere konumlanabilir. Bir sonraki koordinat ise bu noktadan herhangi bir doğrultuda radius ile radius*2 arasında rastgele bir uzaklıkta oluşturulur.
Üretilen ilk sanal konum (aslen üretilen konumlar arasında yer almaz), algoritmanın çalışması için belirlenmiş düzlemin tam ortasında konumlandırılır. Oluşturulacak bir sonraki noktalar için kontrol işlemi gerçekleştirilecektir. Kontrol işlemi sırasında bütün bir alan yerine üretilen nokta merkezde olmak üzere 5x5 hücrelik bir alanın değerlendirilmesi yeterlidir. Zira çakışma sağlayabilecek noktalar var ise bu hücrelerden birisinde konumlanmıştır. Bu yaklaşım, Unity’nin Physics kütüphanesinde bulunan OverlapSphere() fonksiyonuna alternatif oldukça verimli bir yöntemdir. Zira PDS algoritmasını yürütebilmek için fiziksel bir obje üretilmesine gerek yoktur.
PDS algoritması ile rastgele oluşturulmuş bir konum haritası yukarıdaki gibidir. Oyunun çalışmasından önce oluşturulan harita yerleştirilebilecek objelerin olası konumları hakkında bilgi verirken, yerleştirilebilecek max obje sayısının belirli olması, yaşanabilecek hataların önceden yakalanabilmeleri hususunda önemli bir koz niteliğindedir.
İlk başta gerçekleştirmek istediğim: rastgele obje yerleşimi konusuna geri dönecek olursak; elimde PDS algoritması ile oluşturulmuş, sınırları önceden belirli olan, haritalandırılabilir bir konum listesi varken; geriye tek kalan bu noktalar üzerine istediğim objeleri rastgele biçimde yerleştirmek olacaktır. Bu sayede nihai sonuç yukarıdaki gibi olur. Şuana kadar yaptığım testler ve gözlemlerim doğrultusunda, PDS algoritması ile rastgele obje yerleştirme metodunu; ön görülebilir, performanslı ve ihtiyaç doğrultusunda manipülasyona elverişli olması sebebiyle verimli bir yöntem olarak değerlendirmekteyim.