UPBGE için Parçacık Sistemi

Bu yazımda UPBGE için hazırladığım parçacık sisteminden, oyun motorları için parçacık sisteminin neden önemli olduğundan ve bu parçacık sistemini yaparken başımdan geçenleri açıklamaya çalışacağım… Parçacık sistemini kullanarak kendi oyunlarınız için ateş, duman gibi efektler yapabilirsiniz.

Aşağıdaki videoda konu hakkında kısa bir tanıtım yapmaya çalıştım.


İndir “UPBGE Particle System v1.0” PARTICLE_SYSTEM.rar – 80 defa indirildi – 414 KB


LICENSE TERMS / LİSANS KOŞULLARI

Creative Commons Lisansı

Hami Cihat SERTCAN isimli yazarın Particle System for UPBGE başlıklı eseri bu Creative Commons Atıf 4.0 Uluslararası Lisansı ile lisanslanmıştır. https://hamisertcan.com/2020/06/03/upbge-icin-parcacik-sistemi/ bağlantısındaki esere dayalı olarak.


Parçacık sisteminin nasıl kullanılacağını gösterdiğim video:

Oyun yapımı, birçok farklı uzmanlık alanının ortak çabasının sonucudur. Senaryo yazımı, grafik tasarımı, modelleme, kemik giydirme, animasyon, efekt yapımı, müzik yapımı, kodlama ve arayüz tasarımları bu uzmanlık alanlarından bazılarıdır. Bu disiplinlerin bazıları diğerlerinden net sınırlarla ayrılır ancak bazıları da farklı disiplinlerin geleneklerini içerisinde barındırır. İşte efekt yapımı da bunlardan birisidir. Efekt yapımı için grafik tasarımı, modelleme, kodlama gibi birçok farklı uzmanlık alanın bilgisinden faydalanılır.

Peki parçacık sistemi dediğimiz şey nedir ? Parçacık sistemleri kullanılarak nasıl efekt yapılır ?

Bunu açıklamak için bir patlama anını hayal etmenizi istiyorum. Efrafta farklı ebatlarda ve özelliklerde objeler olsun. Patlama, bu objelerin bazılarını daha küçük parçalara ayırır. Çok çeşitli ağırlık ve özelliklerdeki objelerden oluşan bu parçacık harmanını, farklı hızlarda ve ivmelerde hareketlendirir. Bu patlama anını oyunumuzda canlandırmaya çalışalım. Binlerce irili ufaklı parçacığı tek tek seçerek onlara farklı animasyonlar yapmamız ne kadar mümkün olabilir ? İşte bu sebeple tüm bu parçacıkların oluşturduğu rastgele hareketleri simüle edebilecek bir sisteme ihtiyaç duyarız. Parçacık sistemi dediğimiz şey de tam olarak bu işi yapar. Sistem rastgele belirlediği hız, ivme rotasyon gibi değerleri rastgele parçacıklarla ilişkilendirir. Onların renklerini, şekillerini manipüle eder.

Parçacık sistemleri tasarımcısına, arayüzünde hız, ivme, renk, boyut gibi ayarlar sunar. Tasarımcı benzetmek istediği olayı bu ayarları şekillendirerek oluşturmaya çalışır. Söz gelimi bir fırtına anını canlandırmak istiyorsa, çeşitli dallar, yapraklar, kağıtlar vb. objelerden bir model kümesi oluşturur. Sonra tüm bu objelerle parçacık sistemini ilişkilendirerek olayı gerçeğe yakın şekilde simüle etmeye çalışır. İşte oyunlardaki efektler de genellikle oyun motorlarının içerisinde bulunan bu parçacık sistemleri ile yapılırlar.

Şuan halihazırda amatör ve profesyonel tasarımcılar tarafından kullanılmakta olan Unity ve Unreal Engine gibi oyun motorları içerisinde parçacık sistemleri barındırıyorlar. Ancak benim uzun zamandır kullandığım ve Blender 2.8 sürümünün ardından grafik motoru tamamen değişen ve Blender dan ayrılan Blender oyun motoru, yeni adıyla UPBGE maalesef içerisinde bir parçacık sistemi barındırmıyordu. Zaman içerisinde bu eksikliği gidermek için çabalayan insanlar oldu. Aslında Easy Emit adında bir eklenti bu işin imkansız olmadığını eski oyun motorunda kanıtlamıştı. Ancak yeni oyun motoru için henüz yayımlanmış başarılı bir çalışma yoktu.

UPBGE için parçacık sistemi yapma maceram

UPBGE ile basit bir bilgisayar oyunu yapmaya çalışıyorum ve bu oyun içinde birtakım efektler yapmayı planlıyordum. Önceleri oyunda kullanacağım efektleri basitçe yaparım diye düşünüyordum. Ateş efekti yapmak için çalışmaya başladığımda işlerin rengi tamamen değişti.

Önce ateş efekti için animasyonlu doku oluşturmayı planladım. Ancak animasyonlu dokuların bir takım dezavantajları var. Öncelikle pratik olarak tek bir yüzeye dokuyu atadığınız için gerçekçi bir görünüm elde edemiyorsunuz. Bu sistemde bu tek yüzeyin her zaman kameraya bakması gerekiyor. Bu durumda oyundaki bütün animasyonlu ateş yüzeylerini tanımlamak ve onların kamerayı takip etmeleri için kodlarını yazmak gerekiyordu. Bunun yerine bu yüzeylerin z eksenlerindeki açılarını değiştirerek ve açıları değiştirilen tüm yüzeyleri iç içe ekleyerek kamera hangi açıdan bakarsa baksın bu ateş animasyonunun kısmen doğru şekilde görülmesi sağlanabilir. Ancak burada dokunun sağ ve sol tarafları simetrik olmalı ve animasyonun bitiminden ilk kareye dönüş yumuşak şekilde yapılmalı. Aşağıdaki videoyu izleyerek ne demek istediğimi daha iyi anlayabilirsiniz.

Dokuların sağ ve sol taraflarının simetrik olması gerekliliği estetik olarak ateşin yukarı kısımda birleşmesi gerekliliğini doğuruyor. Ancak gerçekte ateş simetrik değildir, alevler çok çeşitli şekillerde oluşur ve farklı konumlarda son bulurlar. Bu halde animasyonlu doku yapımı ile göz önünde bulunacak ateş efektini yapmak doğru bir yöntem değil. Parçacık sistemine benzer bir şeylerle ateş efektini yapmam gerekiyor…

İlk parçacık sistemi denemem

Aslında ateş dokuları atanmış yüzeyler kullanarak ateşe benzer bir efekt oluşturmak çok da zor değil. Bu iş için sahnedeki belirlenen objeyi konum olarak referans alan ve diğer sahnelerden obje eklemeye imkan sunan scene.addObject komutu kullanılabilir, eklenecek objelere de sürekli çalışacak bir movement (hareket) yazılımı yaparsanız eklenen bütün objeler sizin belirlediğiniz eksende ve hatta rastgele olarak hareket ederler. replace mesh komutu kullanarak ta eklenen objenin dokusunu değiştirebilir ve böylelikle ateş efekti elde edebilirsiniz ki ben bunu ilk denememde yaptım ancak sonucunda karşılaşacağım problemi de biliyordum.

İlk çalışmamın blender dosyasını bulabilirsem (bir talihsizlik sonucu bazı dosyalar silindi) ateş yapımı hakkında yazacağım yazının içinde paylaşırım. İlk denemem tamamen başarısız bir deneme sayılmaz. Bu çalışma karakterin elinde tuttuğu bir meşale için kullanılabilir.

Parçacık sisteminin anahtarı

Şimdi ilk denememin eksi yanından bahsedeyim. Performans sorunları…Oyun esnasında mümkün olduğunca az işlem hesaplanmalıdır. Yani blender oyun motoru için konuşursak mümkün olduğunca az logic bağlantı yapılmalı. Ateş efekti yapmak için diğer sahneden çağıracağınız objelere logic bağlantı yaparsanız, efekt içinde bu objelerden onlarcasını aynı anda sahnenize çağırırsanız sonunda logic sistemi çöker ve fps değerleriniz de size video oyunu değilde resim oyunu oynuyorsunuz hissini yaşatır 🙂

İşte bu durumdan kurtulmak için diğer sahnelerden oyuna çağıracağınız ateş dokularının logic bağlantı içermemesi gerekiyor.

Sahneye eklenen objelere işlemler yaptırmak için onları tanımlayan benzersiz bir özelliklerinin olması gerekir. Bu benzersiz özellik normalde objenin ismidir. Ancak blender oyun motorunda sahneye diğer sahnelerden çağırarak eklediğiniz bütün objelerin ismi ana obje ile aynı olur. Bu durumda objeleri tanımlayan başka benzersiz bir özellik gerekiyor.

Eğer sahneye eklenen bütün objeleri birbirlerinden ayırmanızı sağlayabilecek bir özellik bulursanız parçacık sistemi de yapabilirsiniz. Her objeye rastgele bir sayı ekleyerek bu sayıya göre objenin konum, rotasyon, büyüklük, renk gibi birçok özelliğini manipüle edebilirsiniz. Her objeyi istediğiniz doğrultuda ve hızda yönlendirebilirsiniz. İşte bu tanımlayıcı özelliğin anahtarı setParent komutudur.

setParent komutu sayesinde eklenen objeleri bir ana objenin çocukları haline getirirsiniz ve tüm bu çocuklar bir matriste depolanırlar. Her çocuğun matris içerisinde belli bir yeri vardır. Bu yere göre çocuğu çağırıp ona istediğiniz işlemi yapabilirsiniz. Son eklenen çocuğa rastgele bir sayı ekleyebilir. Çocuğa eklediğiniz bir zaman özelliği sayesinde onun replace mesh durumunu, ölüm zamanını, rengini, boyutunu vb. özelliklerini ayarlayabilirsiniz.

İşte bu anahtar komut etrafında şekillenen, çalışmam esnasında daha birçok farklı ve anlatmaya değer sorunla karşılaştım. Ciddi bir araştırma ve onlarca farklı denemenin ardından sizlerle paylaştığım bu parçacık sistemini yapmayı başardım.

Performans açısından parçacık sistemi

Sistemle ilgili birçok performans testi de yaptım, genel olarak sistem sorunsuz çalışıyor ancak çözemediğim bir sorun hâlâ var ki o da parçacık sistemin renk kısmıyla ilgilidir. Özellikle parçacık rengi ve renk değişimi özellikleri açıkken sistem zamanla daha fazla logic işlem hacmine ulaşıyor ve fps değerleri ciddi anlamda düşüyor. Bu sorunu şuan ki bilgim ile çözmem maalesef mümkün olmadı. Gelecekte sorunun kaynağını bulmayı ve bir şekilde çözüme kavuşturmayı umuyorum.

Son olarak

UPBGE oyun motorunun şuanda gördüğü ilgiden daha fazlasını hak ettiğine inanıyorum. Çok uzak olmayan bir gelecekte özellikle amatör oyun geliştiricilerinin UPBGE oyun motoruyla yaptıkları başarılı oyunları görüyor olacağız. Bu süreçte geçmiş tecrübelerimize dayanarak söyleyebiliriz ki dünyanın her yerinden insanlar UPBGE oyun motoruna, farklı şekillerde katkı yapacaklardır. Bende bu çalışmamı paylaşarak bu işe ortak olmaya çalıştım. Kısıtlı bilgim ile bu kadarını yapabildim ancak inanıyorum ki benden çok daha bilgili ve tecrübeli insanlar var ve onlarında gayretleriyle UPBGE daha iyi bir parçacık sistemine kavuşacaktır.

Bilgiyi paylaşmaktan çekinmeyin, unutmayın ki şuan bildikleriniz çoğu başkalarının sizinle paylaştıklarıdır.

Bu yazıda %d yorum var

Bir cevap yazın