Kısaca: Unreal Engine için iki sözle bir su sistemi inşa ediyoruz: doğru görünen su (çünkü ışık, renk ve köpük fiziksel olarak hesaplanır, sahne başına elle ayarlanmaz) ve davranan su: herhangi bir mesh'i yüzeye bırak, doğru biçimde yüzsün, devrilsin ya da batsın, sıfır kurulumla. Etkin geliştirmede. Bu yazı neyi kapsadığını, referans fotoğraflarla kendimizi nasıl sorumlu tuttuğumuzu, kaldırma kuvvetinin neden herkesin atladığı zor kısım olduğunu ve araç setinin geri kalanının yanında nereye oturduğunu açıklıyor.
Aşılacak standart. Bunu gerçek kılanı fark et: kırılan dalgalardan doğan köpük, uçurumları yiyen pus, tüm dalga boyunca beyaz köpük istatistiği: hiçbiri elle yerleştirilmiş değil, hepsi fizik. Koyduğumuz çıta budur.
Neden bir su sistemi daha?
Çoğu oyun suyu tam olarak tek bir ışık koşulunda harika görünür: mağaza ekran görüntüsündeki. Güneşi kaydır, kapalıya geç, kamerayı su hattının yarısına indir, ve dağılır.
Aynı derecede önemli, daha sessiz bir başarısızlık daha var: neredeyse her su sistemi yüzen nesneleri sonradan akla gelen bir şey gibi ele alır. Bir tekne şablonu, bir sayfa ponton kurulum talimatı ve kimsenin denize rastgele bir sandık atmayacağı dile getirilmemiş varsayımı elde edersin. Oyuncular denize sürekli sandık atar.
Şu anda tek bir pakette bir arada bulunmayan iki şey istedik: her aydınlatmayı atlatan sinema kalitesinde bir görünüm ve hiç kurulum gerektirmeyen fiziksel davranış. Hiçbiri, bir ekran görüntüsü güzel görünene dek parametreleri kurcalayarak elde edilmez, çünkü bir ekran görüntüsü tek güneş altında tek bir karedir ve ikisinden biri değiştiği an, zevke göre ayarlanmış su dikişlerini gösterir. Yani projenin temeli bir özellik listesi değil. İnsanın tartışamayacağı bir kabul testidir: bir fotoğraf.
Zevke değil, fotoğraflara karşı yargılanır
Geliştirme, sabit kamera ve aydınlatma sözleşmeleri olan referans fotoğraflarla kapılanır: fiziksel ışık birimleri, kilitli bir tonemapper ve geçti mi kaldı mı kararını veren algısal bir fark metriği, bir art director'ın o günkü ruh hâli değil.
İki referans kanoniktir ve zıt olsunlar diye seçilmiştir:
- Berrak bir göl, kamera su hattında. Yarı hava, yarı su, artefakt bandı olmayan dalgalı bir sınır; mesafeyle koyulaşan yeşilimsi kıyı tipi su; üstündeki yüzeyle uyuşan kayalardaki kostikler; arayüzde doğru kırılan batık kütükler. Bu; kırılmayı, su hattı geçişini ve su altı renk soğurumunu aynı anda test eder.
- Tam kapalı gökyüzü altında bir fırtına kıyısı. Güneş yok, parıltı bandı yok: deniz, yumuşak gökyüzü yansıması, doygunluğu düşük gri-yeşil, beyaz köpük istatistiği ve uçurumlar üstündeki pus üzerinden okunmalı. Bir şamandıra dalgayı inandırıcı bir periyot ve eğimle biner; davranış kabulün parçasıdır, yalnızca durağan görüntü değil.
Kapalı referans bilerek ikisinden biridir. Güneşli su Dünya'daki her renderer'ı pohpohlar, çünkü speküler parıltı bir yığın günahı gizler. Güneşi al, su kareyi yalnızca yansıma pürüzlülüğü, renk ve hareketle taşımak zorunda kalır. Dürüst test budur ve çoğu sistemin sessizce kaçındığıdır. Yalnızca güneşte iyi görünen bir okyanus çıkmaz.
Kamera tarafı su tarafı kadar katı belirlenir, çünkü bir fotoğraf karşılaştırması yalnızca kamera hile yapamadığında adildir. Bu; gerçek fiziksel ışık şiddetleri (rastgele bir parlaklık kaydırıcısı değil, 100.000 lüks civarında bir öğle güneşi), sabit bir pozlama ve referans başına sabit bir tonemapping ve bloom yapılandırması demektir. Tonemapper'ı değiştir, herhangi bir su herhangi bir fotoğrafa uydurulabilir. Tonemapper'ın ilk çakıldığının nedeni tam da budur.
Drop-a-Mesh: ödev olmadan yüzmek
Herhangi bir mesh'i bir Numivo su gövdesine sürükle, hemen doğru davranır: sistem otomatik olarak bir fizik proxy'si kurar, gerçek dalga yüksekliğinden kare başına yer değiştiren hacmi hesaplar ve gerçek yoğunluktan yüzer-mi-batar-mı sonucunu türetir.
Su altı bir yerdir, bir post-process değil. Renk derinlikle soğurulur, ışık huzmeler hâlinde süzülür ve baş üstündeki arayüz temiz geçilmeli, çünkü göl referansı bu üçünü aynı anda dürüst tutmak için vardır.
Bir kütük yüzer ve uzun tarafına yuvarlanır. Bir sandık sallanır. Taş bir heykel batar. Kurulum yok, ponton yerleştirme yok, script yok. Kaputun altında:
- çarpışma şekli, nesnenin gerçek hacmini ölçmek için otomatik olarak vokselleştirilir, asenkron ve varlık başına önbelleğe alınır, yani yalnızca bir kez olur;
- kaldırma kuvveti her kare fiziksel olarak hesaplanır: yer değiştiren hacim, suyun yoğunluğuna karşı; tatlı su ve tuzlu su gerçekten farklıdır (tuzlu su daha yoğundur, o yüzden aynı sandık denizde bir göldekinden daha yüksek biner);
- yüzer-mi-batar-mı yoğunluktan gelir, kütle bölü proxy hacmi; varsayılan olarak bir "bu yüzmeli mi?" kutusu yoktur, çünkü varsayılan fiziğin kendisidir;
- kararlılık, proxy'nin hacminin nasıl dağıldığından doğar: üstü ağır sandıklar devrilir, omurgası ağırlıklı gövdeler kendini doğrultur, bir kalas düz yatar;
- yüzen nesneler yüzeye geri bağlanır: dalgacıklar, dümen suları, su hattında bir köpük halkası ve çarpmada sıçrama efektleri.
Actor'da geçersiz kılmalar için küçük bir panel var: yüzmeye zorla, batmaya zorla, bir sönümleme kaydırıcısı, dümen suyu ve sıçrama anahtarları, ama bir geçersiz kılma fiziği değiştirmek yerine fiziği ölçekler. Bir kaya bloğunu yüzmeye zorla, yine de doğru periyotla sallanır ve doğru dümen suyunu bırakır; sadece daha hafifmiş gibi davranır. Bu ayrım önemli: çözücüyü yok sayan zorlanmış sonuçlar bir düzleme yapıştırılmış props gibi görünür ve oyuncular bunu anında fark eder.
Tasarım hedefi açık sözlü ve canlı çalıştırabilmek istediğimiz bir demo: biri denize yirmi rastgele prop sürükler ve her şey öylece davranır, önce tek bir ayarlar penceresi açmadan. O demo bir öğreticiye ihtiyaç duyuyorsa, özellik başarısız olmuştur.
Neyi kapsar
Kıyıya yakın su, açık okyanus, su altı ve mağara gölcükleri hepsi birinci sınıftır: ayrı dalga ve çapraz denizli spektrum tabanlı dalgalar, gerçekten kırılan dalgalardan köpük, su altı ışık huzmelerini süren kostikler ve sinematik efektler altında kararlılık.
Suya önem veriyorsan önemli olan ayrıntılar:
- Dalgalar oşinografik spektrumlardan gelir (gerçek denizleri betimlemekte kullanılan aynı istatistiksel modeller), yönlü yayılım ve bağımsız denetlenebilir dalga ile. Bir deniz durumu bir hava kararına dönüşür: "yükselen fırtına, batıdan uzun dalga", fırtınalı görünene dek ittiğin otuz kopuk kaydırıcı yerine.
- Köpük boyanmış bir maske değildir. Dalgaların gerçekten kırıldığı yerde doğar, zamanla eskir ve rüzgâr altında çizgilenir. Boyanmış köpük sahte suyun en yaygın ele veren işaretidir, çünkü temsil etmesi gereken fizikle birlikte hareket etmez.
- Su altı gerçek bir yerdir. Derinliğe göre doğru renk soğurumu (önce kırmızı gider, sonra yeşil, dalış görüntülerinden herkesin bildiği derin maviyi bırakarak), dibi aydınlatan aynı kostik alandan türetilen ışık huzmeleri ve klasik sert artefakt bandı olmadan su hattında bir geçiş.
- Mağara gölcükleri kendi muamelesini görür: durgun ya da zar zor hareket eden su, damla rahatsızlıkları, yarı karanlıkta yansımalar, çünkü sakin bir iç gölcük açık okyanustan farklı hataları ortaya çıkarır.
- Sinematikler kabul kriterleridir, sonradan akla gelen bir şey değil. Yüzey; alan derinliği, hareket bulanıklığı ve film graini altında kararlı kalmalı: grain uygulanınca beliren speküler fireflies yok, yavaş bir kameranın strobing'e çevirdiği titreme yok.
Neden kaldırma kuvveti herkesin atladığı kısım
Görünüm iyi bir shader'la taklit edilebilir ama davranış edilemez: inandırıcı bir yüz-ve-bat, gerçek zamanlı bir hacim tahmini ve kararlı bir çözücü ister, ki bu gerçekten zordur, o yüzden çoğu sistem bir tekne prefab'ı verir ve durur.
Rahatsız edici mühendislik gerçeği şudur: güzel bir su shader'ı çözülmüş bir problemdir, genel bir kaldırma kuvveti çözücüsü değildir. Bir dalganın görünümünü taklit etmek bir doku-ve-normal problemidir; keyfi, daha önce görülmemiş bir mesh'i o dalgada doğru oturtmak, kare hızında çalışması, hızlı zaman adımlarını atlatması ve bin üçgenlik bir kaya bir fırtına dalgasıyla buluştuğunda patlamaması gereken bir fizik problemidir. O boşluk, çoğu motorda "su"nun "etkileşemeyeceğin güzel bir düzlem" anlamına gelmesinin ve etkileşimli kısmın, var olduğunda, elle yapılmış bir tekne olmasının nedenidir.
O boşluğu kapatmak (davranışı görünüm kadar otomatik kılmak) bu projenin var olma nedenidir ve bir hafta sonu shader işi yerine referans-fotoğraf disiplini artı gerçek bir çözücü gerektirmesinin nedenidir.
Ne zaman kullanabilirsin?
Unreal Engine uzantısı olarak geliştirmede, kademeli bir sunumla: kinematik bir yüzme önizlemesi tam fizik çözücüsünden önce iner, böylece sahneler erken doldurulabilir. Bir tarih duyurmuyoruz; referans görüntüler ne zaman bittiğine karar verir.
Kademelendirme bilinçlidir. Kinematik bir önizleme (nesneler tam kuvvet simülasyonu olmadan dalga yüzeyini izler) önce gelir, böylece sanatçılar ağır çözücü hâlâ sağlamlaştırılırken mesh bırakıp bir deniz doldurabilir, yani sonucu fizik kesinleşmeden çok önce hissedersin. Tam çözücü, otomatik proxy ve eksiksiz panel sonra gelir. İlerleme ve kilometre taşları herkese açık yol haritasında görünür, bir lansman günü sürprizinde değil.
Yanında çıkacağı araç seti (scatter, mesh blending, grid'ler, ölçüm) bugün ücretsiz denenebilir. Herkese açık bir su build'i var olduğu an haber almak istersen, siteden bağlanan Discord, ilk duyurulacağı ve referans görüntülerin geçti/kaldı karşılaştırmalarının gerçekleştikçe paylaşılacağı yerdir.
Mini SSS
Numivo'nun diğer araçlarını gerektirecek mi? Hayır, aynı ailede, tek başına durmak üzere tasarlanmış bir uzantı. Yine de aynı ilkeyi paylaşır: sonuçlar fiziksel olarak mümkün olan her yerde motor-yerel verilere pişirilir, böylece yaptığın şey senindir.
Hangi motor sürümleri? Güncel Unreal Engine 5 sürümleri. Ayrıntılar, uzantı herkese açık bir build'e yaklaştıkça yol haritasına iner; şimdi vaat edilip sonra revize edilmez.
Motorun yerleşik suyundan farkı ne? Yerleşik su sistemleri görünümde güçlü, genel etkileşimde zayıftır: kaldırma kuvveti tipik olarak ayrı, elle ayarlanmış bir bileşendir. Buradaki bütün mesele, görünümün ve davranışın tek bir fiziksel temelli sistemden gelmesi ve referans-fotoğraf kapısının görünümü aydınlatmalar boyunca dürüst tutmasıdır.
Neden çıkıştan önce duyuruyoruz? Çünkü referans-fotoğraf yönteminin kendisi mesele. Çıtayı herkese açık gösterip ona göre ölçülmeyi, kimsenin inceleyemeyeceği bitmiş bir şeyi açıklamaya tercih ederiz. Bu yazı, yazıya dökülmüş o çıtadır. Bizi ona göre tutun.