Gagasan untuk Simulasi Air 2D

18

Saya mencari input pada simulasi air dalam 2D, terhadap array yang agak besar (sebut saja) yang diblokir / tidak diblokir (dilihat dari samping). Saya telah datang dengan ide-ide berikut:

Automata Sel

Lakukan simulasi parralel besar-besaran pada CPU, menggunakan sel automata . Dengan aturan sesederhana:

  • Jika ada sel yang terbuka ke bawah, pindahlah ke sana.
  • Periksa sel kiri dan kanan, pilih yang acak dari keduanya dan pindah ke sana.

Pro

  • Mudah diimplementasikan.
  • Bermakna / deterministik dalam sistem multi pemain.

Cons

  • Mungkin sangat lambat.
  • Tidak meyakinkan.

Fluid Dynamics pada GPU

Lakukan perkiraan kasar dinamika fluida pada GPU terhadap tekstur seperti berikut:

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

Pro

  • Mungkin sangat cepat.
  • Bisa sangat meyakinkan.
  • Pixel shader lebih lanjut bisa membuatnya secara langsung.

Cons

  • Sulit diimplementasikan.
  • Sulit untuk mengubah.
  • Saya tidak dapat mengalokasikan satu tekstur ukuran level saya.
    • Saya bisa tumpang tindih dengan area grid, tetapi ini akan menambah kompleksitas lebih lanjut.

Partikel

Gunakan partikel untuk mensimulasikan air. Selama rendering menggunakan campuran aditif dan kemudian menerapkan fungsi multiplikasi ke saluran alpha untuk memberikan tepi air yang segar.

Pro

  • Mungkin akan terlihat bagus.
  • Mudah diimplementasikan.
  • Mudah dibuat.
  • Berarti dalam sistem multi-pemain, meskipun akan membutuhkan bandwidth yang cukup untuk transfer.

Cons

  • Efek antar-partikel mungkin akan lambat (pencarian lingkungan).
  • Dapat menyebabkan air 'bocor' melalui ruang padat (karena ruang padat kecil, misalnya 1px).
  • Dapat menyebabkan lubang aneh di air tergantung pada ukuran partikel.
  • Kedua hal di atas dapat dikurangi dengan membiarkan partikel melayang lebih dekat daripada ukuran sebenarnya, namun akan menyebabkan masalah dengan kinerja antar-partikel dan partikel / lanskap.

Ada ide lebih lanjut?

Catatan: Ini perkiraan, saya tidak mencari air yang benar secara fisik di sini - hanya sesuatu yang 'cukup baik' (poin bonus untuk cepat dan kotor). Gim ini multipemain, jadi sayangnya seluruh level perlu disimulasikan terus menerus.

Jonathan Dickinson
sumber

Jawaban:

12

setiap kali saya mencoba mensimulasikan air, saya akhirnya menerapkan filter lowpass pada tekstur yang mewakili ketinggian air. Ini sangat sederhana untuk diterapkan tetapi gagal setiap kali Anda mendapatkan perubahan besar-besaran di permukaan air yang dapat menghasilkan gelombang besar. Dalam metode ini ada beberapa tempat di mana air selalu memiliki tingkat yang konstan, seperti ujung sungai. dalam kasus-kasus itu Anda hanya warna yang tepat untuk piksel tertentu.

Pro:

  • mudah diimplementasikan
  • hasil yang realistis jika terjadi air yang tenang
  • komputasi cepat menggunakan GPU
  • mudah untuk menentukan level air statis atau sumber air

Kekurangan:

  • tidak dapat mensimulasikan gelombang

untuk perairan bergelombang saya menggunakan cara yang mirip dengan algoritma Cell Automata Anda tetapi dengan perubahan kecil yang akan membiarkan saya menggunakan shader untuk menghitung langkah selanjutnya dari situasi saat ini, di sini adalah kode sudo, sekali lagi saya punya tekstur yang mewakili ketinggian air di setiap warna piksel:

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;
}

Algoritma ini memiliki semua fitur yang mirip dengan yang sebelumnya tetapi berfungsi lebih baik di perairan bergelombang daripada yang tenang. itu pilihan Anda berdasarkan laut yang Anda simulasi untuk menggunakan salah satu dari mereka.

pada akhirnya Anda memiliki tekstur yang memberi tahu Anda ketinggian air untuk setiap posisi, pada langkah berikutnya Anda harus menggambar hasilnya, cara termudah adalah dengan menghasilkan jaring berdasarkan data ketinggian air.

Ali1S232
sumber
Terima kasih, itu jawaban yang cemerlang. Saya akan membiarkan pertanyaan terbuka beberapa saat lagi; tetapi sepertinya saya memiliki bakat untuk mengajukan satu jawaban pertanyaan di sini :).
Jonathan Dickinson
Anda juga dapat mencampur algoritma ini untuk mendapatkan hasil yang lebih baik.
Ali1S232
Bagaimana dengan tangkapan layar?
ashes999
@ ashes999 Saya tidak punya tangkapan layar, tapi di sini algoritma yang sama diterapkan! youtube.com/watch?v=avJPrL9UJ28
Ali1S232