Pembuatan Hujan 2D (dan Dinamika Fluida)

11

Saya bereksperimen dengan kondisi cuaca dalam permainan saya, dan saya terkesan dengan cara Starbound menangani hujan. Pada dasarnya, ketika hujan menyentuh tanah, hujan akan tersebar secara horizontal (dan diserap oleh tanah), atau menciptakan tumpukan air (ketika hujan mendarat di dalam lubang di tanah).

Video ini menunjukkan ini dengan jelas: http://imgur.com/gallery/CKCGKbG

Saya tahu bagaimana membuat hujan turun dan memeriksa di mana itu menyentuh tanah, tetapi di situlah saya terjebak. Pertanyaan saya adalah: bagaimana ini bisa dibuat? Dan bagaimana seseorang bisa memodelkan aliran air dengan begitu sempurna, tanpa mematikan kinerja?

Terima kasih sebelumnya!

Pandaqi
sumber
1
Kuncinya adalah sistem dinamika fluida. Saya menduga bahwa ketika hujan mencapai tanah, ia menghasilkan sejumlah kecil air pada posisi itu yang kemudian diproses oleh sistem dinamika fluida seperti biasa. Pada permukaan datar itu diimbangi dengan penguapan, tetapi ketika lereng menyebabkan air berkonsentrasi di suatu daerah, gelombang masuknya lebih kuat daripada penguapan dan genangan air mulai terbentuk.
Philipp

Jawaban:

9

Sistem air Starbound sebenarnya adalah automata seluler berbasis ubin 2D. Setiap ubin di layar yang tidak mengandung lapisan ubin depan, mampu menahan air. Jumlah air dihitung melalui automata seluler.

Informasi lebih lanjut tentang teknik ini di sini:

http://www.gamasutra.com/view/feature/134736/an_intro_to_cellular_automation.php

http://www.jgallant.com/2d-liquid-simulator-with-cellular-automaton-in-unity/

Adapun tetesan hujan, itu adalah partikel. Mereka melayani terutama untuk palsu bahwa sebenarnya ada air yang jatuh dari langit. Air terakumulasi hanya karena permainan tahu saat ini hujan. Tetes individu tidak ada hubungannya dengan pembentukan kolam air yang sebenarnya.

Cara mereka menumpuk, adalah dengan menentukan di mana ada lubang di lapisan atas tanah. Jika ada daerah yang dapat menumpuk air, sel-sel di daerah itu meningkatkan level air mereka.

Starbound juga menangani tekanan air, dan teknik rendering mereka sangat menakjubkan. Mereka memiliki implementasi 2D terbaik dari fisika simulasi air menggunakan automata seluler yang pernah saya lihat.

Berikut ini adalah pandangan primitif dari mesin fisika cair, memanfaatkan teknik automata seluler yang disebutkan di atas. Bagian rendering menjadi sedikit lebih kompleks, karena air Anda diwakili oleh nilai numerik.

http://www.jgallant.com/images/pressuretest.gif

Dalam contoh ini, peningkatan yang sangat sederhana adalah menyembunyikan sel air yang memiliki kurang dari 1 unit penuh air di ubinnya jika tidak ada ubin padat di bawahnya. Tapi kemudian, Anda menyembunyikan aliran air. Alih-alih menyembunyikannya, Anda harus menentukan bagaimana air mengalir, dan kemudian menggambar sprite air yang sesuai di tempatnya.

jallan
sumber
2
Untuk menambah fakta bahwa partikel-partikel hujan palsu memalsukan efek jatuh air: percikan tetesan kecil di permukaan juga tidak terkait dengan partikel-partikel hujan yang sebenarnya tetapi efek yang terpisah. Kombinasi membuatnya tampak seolah-olah tetesan membuat percikan.
Felsir
Wow, itulah tepatnya yang saya cari. Saya pikir saya harus menggunakan beberapa sistem fluida yang terlalu kompleks berdasarkan pada partikel, tetapi sistem grid tampaknya bekerja dengan baik. Padahal, untuk menambahkan tekanan air, saya kira Anda hanya perlu array kedua yang menyimpan nilai tekanan dan mengalir dari tekanan tinggi ke tempat bertekanan rendah? Jika demikian, itu seharusnya tidak terlalu sulit bagi komputer.
Pandaqi
Tidak, yang perlu Anda lakukan dengan tekanan, adalah menambahkan aturan seperti, ubin diizinkan mengandung lebih dari 1 unit penuh cairan. Jika ubin itu memiliki lebih dari 1 unit penuh cairan, dan tidak dapat mengalir sesuai aturan normal - maka buat ubin itu mengalir ke atas. Sesuaikan sehingga memungkinkan lebih banyak air mengalir berdasarkan nilai tekanan ubin itu.
jgallant
3

Ada banyak cara untuk mendekati ini. Seperti biasa 'itu tergantung'

Dan jadi saya kira satu cara akan seperti ini .. Diberikan 'celup di tanah' Overlay 'kotak air' yang mengikatnya. Tanah dan waterbox ditarik berlapis-lapis sehingga tanah ditampilkan terlebih dahulu, setelah waterbox.

setiap kali setetes air menyentuh celup di tanah, tambahkan satu ke dalam air. Saat kotak air mencapai angka ajaib, tambahkan satu baris air. Jadi katakanlah 10 tetes tanah di celup, ini menambahkan satu baris ke kotak air.

Jadi katakan waterbox adalah 32X32 piksel. Tambahkan satu baris warna air dari 0,31-31,31. 10 tetes lagi, buat garis dari 0,30 - 31,30. Jadi, ketika tetesan menumpuk, Anda membangun waterbox dari bawah sampai penuh.

Harapan itu masuk akal.

RobM
sumber