2D Su Simülasyonu için Fikirler


18

Ben oldukça büyük (çağrı) bloke / bloke değil dizi (yandan bakıldığında) karşı 2D su simülasyonu herhangi bir girdi arıyorum. Aşağıdaki fikirleri buldum:

Hücre Otomataları

Hücre otomatlarını kullanarak CPU üzerinde büyük bir parralel simülasyonu yapın . Kurallar kadar basit:

  • Eğer tabana açık bir hücre varsa, ona hareket ettirin.
  • Sol ve sağ hücreleri kontrol edin, ikisinden rastgele bir tane seçin ve ona hareket edin.

Artıları

  • Uygulaması basit.
  • Çok oyunculu sistemde anlamlı / deterministik.

Eksileri

  • Muhtemelen gerçekten yavaş.
  • İkna edici değil.

GPU'da Akışkanlar Dinamiği

Aşağıdaki gibi bir dokuya karşı GPU'da yaklaşık bir akışkan dinamiği yaklaşımı gerçekleştirin:

+------+-----+-----+-------+
|R     |G    |B    |A      |
+------+-----+-----+-------+
|vX    |vY   |NULL |Density|
+------+-----+-----+-------+

Artıları

  • Muhtemelen gerçekten hızlı.
  • Oldukça inandırıcı olabilir.
  • Başka bir piksel gölgelendirici doğrudan oluşturabilir.

Eksileri

  • Uygulaması zor.
  • Tweak zor.
  • Seviyemin büyüklüğünde tek bir doku ayıramıyorum.
    • Izgara alanlarını üst üste bilebilirim, ancak bu daha fazla karmaşıklık katacaktır.

Parçacıklar

Suyu simüle etmek için parçacıklar kullanın. Katkı harmanlama kullanarak işleme sırasında ve daha sonra suya net kenarlar vermek için alfa kanalına bir çarpma fonksiyonu uygulayın.

Artıları

  • Muhtemelen güzel görünecek.
  • Uygulaması kolaydır.
  • Oluşturması kolay.
  • Çok oyunculu bir sistem için anlamlıdır, ancak transfer etmek için biraz bant genişliği gerektirir.

Eksileri

  • Parçacıklar arası etkiler muhtemelen yavaş olacaktır (mahalle araması).
  • Katı boşluklardan suyun 'sızmasına' neden olabilir (çünkü katı boşluk küçüktür, örneğin 1 piksel).
  • Parçacık boyutuna bağlı olarak suda garip deliklere yol açabilir.
  • Yukarıdakilerin her ikisi de, partiküllerin gerçek boyutlarından daha yakın kaymasına izin verilerek hafifletilebilir, ancak partiküller arası ve partikül / peyzaj performansı ile ilgili sorunlara neden olur.

Başka fikir var mı?

Not: Bu bir tahmin, burada fiziksel olarak doğru su aramıyorum - sadece 'yeterince iyi' bir şey (hızlı ve kirli bonus puanları). Oyun çok oyunculu, bu yüzden maalesef tüm seviyenin sürekli olarak simüle edilmesi gerekiyor.

Yanıtlar:


12

suyu her taklit etmeye çalıştığımda, su seviyesini temsil eden bir dokuya düşük geçiş filtresi uyguladım . Uygulanması çok basittir, ancak su seviyesinde büyük dalgalar üretebilecek büyük değişiklikler aldığınızda başarısız olur. Bu yöntemde suyun nehir uçları gibi her zaman sabit bir seviyeye sahip olduğu bazı yerler vardır. bu gibi durumlarda, söz konusu piksel için renklerin biraz üzerinde.

Artıları:

  • uygulaması kolay
  • sakin sularda gerçekçi sonuçlar
  • GPU kullanarak hızlı hesaplama
  • statik su seviyelerini veya su kaynaklarını tanımlamak kolay

Eksileri:

  • dalgaları simüle edememe

Dalgalı sular için Cell Automata algoritmanıza benzer bir şekilde kullanıyorum, ancak mevcut durumdan sonraki adımı hesaplamak için gölgelendiricileri kullanmama izin veren küçük bir değişiklikle, işte sudo kodu, yine her birinde su seviyesini temsil eden bir doku var piksel rengi:

foreach (pixel p) in oldTexture
{
    newtexture.pixels[p.x,p.y]    += p.color / 5;
    newtexture.pixels[p.x+1,p.y]  += p.color / 5;
    newtexture.pixels[p.x-1,p.y]  += p.color / 5;
    newtexture.pixels[p.x,p.y+1]  += p.color / 5;
    newtexture.pixels[p.x,p.y-1]  += p.color / 5;
}

bu algoritma, öncekine benzer özelliklere sahiptir, ancak dalgalı sularda sakin olanlar yerine daha iyi çalışır. ikisinden birini kullanmak için simüle ettiğiniz denize dayalı seçim.

Sonunda her pozisyon için su seviyesini söyleyen bir dokuya sahip olursunuz, bir sonraki adımda bir şekilde sonuç almanız gerekir, en kolay yol su seviyesi verilerine dayanan bir ağ oluşturmaktır.


Teşekkürler, bu harika bir cevap. Soruyu bir süre daha açık bırakacağım; ama görünüşe göre buralarda bir soru soran bir ustalığım var :).
Jonathan Dickinson

daha iyi sonuçlar elde etmek için bu algoritmaları karıştırabilirsiniz.
Ali1S232

Ekran görüntüsüne ne dersiniz?
ashes999

@ ashes999 Ekran görüntüm yok, ancak burada aynı algoritma uygulandı! youtube.com/watch?v=avJPrL9UJ28
Ali1S232
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.