Bir Simülasyonun Anatomisi

Bağımsız oyun geliştiricisi olmanın en büyük zorluğu, maddî zorluklardır. Bunun üstesinden gelebilmek için yapılanlar ya bağımsızlığınızı, ya zamanınızı, ya da yaşam enerjinizi elinizden alır.
Ama bazen turnayı gözünden vurmanız da mümkündür.
İşte bu yazı, böyle bir olayın hikâyesidir.

Paralycid’i geliştirmeye başladığımızdan beri harcanan paranın haddi hesabı var; ama bazı şeyler sürekli erteleniyor. Yapabildiğimiz iş üzerinden freelance kazanç sağlamak ise neredeyse imkânsız. Zaten Türkiye içerisinde firmalar ölü seviciliği yaparak sakız parasına sakız fabrikası kapatma derdindeler. Yine de bilgi ve beceriyi kullanma doğrultusunda bir şeyler elde etmek gerekiyordu ki, ekipteki çekirdek elemanlardan biri, Marco, bana kendi çalıştığı yerin bir simülasyona ihtiyacı olduğunu söylediğinde tam da bunları düşünüyordum.

İstenen şey basitti, ama bunun için bir okyanusu hem görsel hem de fiziksel olarak simüle etmem gerekiyordu.

Marco, Unity’den ziyade UDK’yı sever, bense UDK ve CryEngine yerine Unity’yi severim. Bunun sebebini önceki yazılarımda belirtmiştim (Pattern Oriented). Ne var ki, gerçekçi ve harika görünen bir okyanus manzarasını UDK’da yaratmak çok kolaydı. Orasına eyvallah, peki geri kalan mekanikler? Nasreddin Hoca gibi ‘bildiğimizden şaşmayalım’ diyerek aynı şeyi Unity’de yapmak istedim.

1) Unity’nin Kendi Su Sistemi

Unity Free ve Unity Pro, kendi içerisinde su shader’ları ile geliyor zaten. Pro versiyonundaki water shader, hem transparen, hem refraction hem de reflection özelliklerini sağlıyor görsel olarak; ama bunlara rağmen sağladığı görselliğin durumu bu:
Unity Pro WaterUnity Pro Water

Görüldüğü üzere, çağın çok gerisinde kalmış bir görsel sistem oluşturuyor bu maalesef. Özellikle de bir okyanusta. Belki kıyı şeridi için ‘yeterli’ düzeyde bir görsellik sağlayabilir; ama Reflections’ı yapmaya başladığımdad Gemlik kıyısını bunla yapmam ben şahsen. Jöle gibi duruyor.
Hele ki alınabilecek en güzel görsel şu seviyedeyken, Unity ve su bir araya gelmemeli bence:
Unity Pro Water

Dolayısıyla ben de Unity için yazılmış pluginleri araştırmaya başladım. Belki daha güzel okyanus sahneleri vardı.

2) Triton for Unity3D

Triton for Unity3D

Şimdi, Triton nispeten daha güzel görünüyor. Dalgalar ve suyun kaldırma kuvveti mekaniği de kendi içinde geliyor. Görsellik tamamen tatmin edici değil; ama istediğim mekanikler işin içinde. Biraz shader kalitesi ile oynarım derken, bir baktım ki 475 dolar.

Triton for Unity3D

Açıkçası ben buna 475 dolar vermem. Dolayısıyla Triton bir seçenek olmaktan çıktı benim için.

3) Livenda DX11 Ocean

Ecnebilerin deyişiyle, ‘Now, this is a killer!’.
Kesinlikle tam aradığım şeydi bu.
Livenda DX11 Ocean for Unity3D

Ne var ki, halen geliştirilme aşamasında ve geliştiricilerle iletişime geçtiğimde bana bir alfa buildi göndermenin söz konusu olamayacağını öğrendim. Dolayısıyla, bu iş de burada böyle kaldı. Aramalarıma devam etmek zorundaydım.

4) Tasharen Water / Suimono Water System / Dynamic Water v2

Unity için yazılmış çok sayıda su/deniz/okyanus sistemi mevcut.

Bunlardan ilki Tasharen Water.
Tasharem Water
Görselden belli olduğu üzere Age of Empries 2 seviyesinde bir su görseli sağlıyor. Direk es geçtim.

Sonrasında Suimono Water System var.
SUIMONO Water
Görselliği cezbedici, fizik olarak da isteneni lâyığıyla veriyor; ama halen beta aşamasında ve sürekli çökme, FPS düşüşleri ve ufak tefek sıkıntılar son kullanıcıya geçmemi engelliyor.
Ayrıca şuradaki videoda farkedileceği üzere köpükler o kadar statik ki, görselliği bozuyor ve ucuz numara gibi görünüyor. Livenda’nınki bunun yanında harika; ama işte hem Suimono hem Livenda beta aşamasında ve sadece kendi kendine suyla oynamak oluyor tek yapılabilen.

Dynamic Water System, fiziksel olarak isteneni veriyor ama görsel olarak çok geride kalıyor.
Dynamic Water System
Su fiziği olarak harika; ama arkadaş Unity’nin kendi Pro Water shader’ından bile berbat bu ya!

5) Ocean Surface Effects in Unity

Sonuçta okyanus yüzeyi, deniz yüzeyi, veya su yüzeyi dediğimiz şeylerin prosedürel algoritmaları mevcut. DirectX11 ilk tanıtıldığında, yeni su dinamikleri göz dolduruyordu.
Peki bu prosedürel algoritmaları kullanarak böyle bir yüzey yaratmak mümkün değil miydi?

Görünüşe göre gayet mümkün:
Ocean Surface Effect for Unity
Gerçek zamanlı su görselleme algoritmalarının tezleri üzerine kurulu bu sistem, tamamen prosedürel çalışıyor ve sistem üzerindeki ağırlığı da oldukça düşük!
Feribota binmiş olanlar için çok tanıdık bir görüntü bu 😀

Ben de bu sistem üzerinden ilerlemeye karar verdim. Tüm kodlar benim kontrolüm altındaydı nasıl olsa.

5-a)Yansımalar?

5 numaralı görseli kullanmaya karar verdiğimde, su üzerindeki nesnelerin suya bir yansıma bırakmadığını farkettim. Yazılan shader çok özeldi ve böyle bir eklemeyi kabul etmiyordu.
Ben de hemen başka bir yöntem ile, ikinci bir yüzey yaratıp tüm yansımaları onun üzerine almaya karar verdim.
Bu defa da, su yüzeyinin transparan olmayışı bu yansımaları görmemi engelliyordu.

Shader’ı açıp baştan sona inceledim, prosedürel kodu inceledim, ve shader’ın kendisini transparan yapamasam da layer’lar üzerinde çalışırken görselleme sisteminde okyanusu ikinci sıraya aldım. Artık yansımalar da ekrana çiziliyordu.

5-b)Kırılmalar?

Burada çok büyük bir sıkıntı oluştu. Yansımalar çok düzgündü; ama hiçbir deniz yüzeyi çarşaf gibi değildir ve ayna gibi yansıtmaz. Dolayısıyla Refraction denilen, yansımaların kırılması durumunu yapmam gerekiyordu. Bunun için üçüncü bir layer oluşuturup ilk yansıma çizidilen layer’ın üzerine aldım ve bir Post Process gibi, önce çizilen yansımaları kırdım ve kırılmış hallerini ekrana gönderdim.

6) Suyun Kaldırma Kuvveti ve Dalgalar (Buoyancy)

Zurnanın zırt dediği yere geldik.
Bu noktada Unity’nin kendi içindeki fizik sistemi ile oynamaya başladım. Zaten yer çekimi kullanılıyordu. Özel bir editör eklentisi yazarak yer çekimi ile suyun kaldırma kuvvetini karşı karşıya getirdim ve virgülden sonraki basamaklarda olan değişimlerle istediğim etkiyi yarattım. Ama bu defa başka bir sıkıntı baş gösterdi: Model komple yükseliyor ve alçalıyordu, ne sağa sola ne öne arkaya yatma mevcuttu.

Bunun asla çözemeyeceğimi zannederken, önceki eklentilerdeki su fiziklerine baktım fikir almak için, ve prosedürel bir şekilde collider’lar oluşturduğunu gördüm. Yani bir objenin, büyüklüğüne ve efekt kalitesine göre birden fazla noktada hesaplanması gerekiyordu. Hemen lise fizik bilgisi ile işe giriştim:
1 – Ağırlık merkezi belirleme
2 – Prosedürel bir şekilde modele birden fazla collider ekleyerek dalganın ve yer çekiminin noktasal etkilerini belirleme
3 – Tüm parçaları bir araya getirerek anlık momentumu hesaplama
4 – Momentumu modelin Transform değerlerine aktarma. Bu noktada Quaternion’u Euler olarak kullanarak hem modelin o andaki açısı hem de yükselti seviyesi belirlenmiş oldu.

Sonuç olarak, bu sonuca vardım:
tanshaydar_dgs_defence_water_simulation

Hareket noktalarına su sıçratma efekti (splash) eklendiğinde, kontroller üzerinde çalışmak kaldı geriye ve simülasyon, genel hatları ile tamamlandı.

Tahmin ettiğimden çok daha gerçekçi ve güzel bir seviyeye ulaştım derken, Unity ile yapılan Naval Action oyununu gördüm…
Açıkçası geldiğim nokta resmen şu resmin iki yüz yıl önceki teknolojisi olmuş.

3rdratestorm

Ne var ki, tüm programlama, görsellik, shader, efektler ve bir sürü zıkkım zamazingo, benim gibi daha Unity’yi 10 aydır bilen bir insanın üzerinde olunca, böyle bir profesyonel seviyeye gelmem daha yıllarımı alacaktır. Arkadaşların ulaştığı kalite resmen dudak uçuklatıcı ve denizin tamamı prosedürelmiş kendilerinden öğrendiğim kadarıyla.

Sonuçta, simülasyon olarak istediğim noktaya varabildim ve bunun sunumunu başarıyla yapabildim. Sunum yaptığım insanların Naval Action’dan habersiz olması; Unity, UDK ve CryEngine gibi ‘şeylerden’ habersiz olması, ve en önemlisi “Web Player” istiyor olmaları (benim için en önemli nokta) geri kalan her şeyi önemsiz kılıyor. UDK ve CryEngine doğru düzgün web player çıktısı veremiyor; ve Naval Action gibi bir kalite Web Player üzerinde görüntülenemiyor. Tüm imkânlar ve koşullar göz önüne alındığında, bir simülasyonun anatomisi bu şekilde sonuçlanıyor.


7 Responses

Bir yorum yazın


  • Gökhan on

    “Hemen lise fizik bilgisi ile işe giriştim” ohhhşşşş nasıl mutlu oldum bilemezsin 😀

    Şaka bir yana, ben çoğu oyunda denizin ne kadar gerçekçi olduğuna bakmıyorum, küçük ama üzerinde çok uğraşılan bir detay gibi geliyordu -tabi oyundan oyuna değişerek- sanırım haklı çıkmışım. Gösterdiğin görsellerin hepsini beğendim, ancak son gösterdiğin -bol dalgalı resmin üstündeki- daha iyi duruyor.


    • Tanshaydar on

      Niye ya 😀 Momentum, sıvıların kaldırma kuvveti, yer çekimi… bunlar hep lise müfredatında olan şeyler. Ya da bizimki Fen Lisesi olduğu için iyi verildi bilmiyorum, üniversitede aldığım Fizik dersleri zaman kaybından başka bir işe yaramadı açıkçası.

      Suyun gerçekçiliği konusunda, oyun/simülasyon tamamen suda geçtiğinde işler değişiyor. Yoksa dere, su kıyısı gibi sahneler tamam eyvallah; ama ufak tefek ayrıntı olarak kalıyor. Bioshock 1 ve 2’de olay hep su üzerineydi, Hydrophobia oyunu ise zaten direk su dinamikleri üzerine kurulu.

      Yalnız hepsi güzel geldiyse… Super Mario’daki sulu bölümler yeterli o zaman 😀


  • Gökhan on

    Ooooo Mario’nun sulu bölümleri fenaydı ya, o yüzme tuşuna basmadığnda dibe doğru çekilmesi… anlayamazsınız ! 😀

    Reflections’u hakkında çok bilgim olmadığı için birşey diyemeyeceğim şimdilik, Bioshock ve Hydrophobia’yı da oynamadım zaten 😀

    Lise fiziği de dediğin gibi olağan üstü şeyler öğrenmiyorduk bizim zamanımızda şimdi kuantum falan koymuşlar ama çok havada kalmış 😀


    • Tanshaydar on

      Su fiziği için de Quantum fiziği kullanmaya gerek var mı bilmiyorum? Sonuçta hesaplanabilir şeyler, “tam olarak şu anda hem burada hem orada bulunabilir ama bu” gibi bir şey yok 😀
      Zaten bugün bir buçuk saat Quantum, Kara Delikler, Time Warp’lar, İplik Teoremi üzerine konuştum kafayı kırdırtma bana.


  • Asphodel on

    İlk defa bir blogu bu denli takip ediyorum.Gerçekten anlatımın çok iyi ve hemen hemen anlattığın tüm konular ilgimi çekiyor.Devamını dilerim.


    • Tanshaydar on

      Yazma konusunda düzenli bir çizgi ilerlemiyorum; ama hoşunuza gittiyse ne mutlu bana.


  • Etlisomon on

    Gemilerin suları köpürtmesinden hoşlanıyoruz. Görseller hakkında tek tek bilgi vermeniz hoşuma gitti, elinize sağlık.


Leave a Reply