Bagaimana mensimulasikan tekanan dengan partikel?

11

Saya mencoba mensimulasikan tekanan dengan koleksi partikel bola di game Unity yang saya bangun. Sepasang orang mencatat tentang masalahnya:

  • Tujuannya adalah untuk mengisi ruang 2d yang terus berubah / kosong dengan bola kecil tanpa gesekan. Gim ini mencoba mensimulasikan tekanan yang terus bertambah dari lebih banyak benda yang didorong ke ruang ini.
  • Level itu sendiri terus bergulir dari kiri ke kanan, yang berarti jika dimensi ruang tidak diubah oleh pengguna, maka secara otomatis akan semakin kecil (bagian paling kiri dari ruang akan terus bergulir di luar layar).

Saya bertanya-tanya apa beberapa pendekatan yang bisa saya ambil untuk mengatasi masalah ini ...

  1. Mengetahui kapan harus mendeteksi kapan ada ruang untuk diisi dan kemudian menambahkan bola ke ruang.
  2. Menghapus bola dari ruang saat menyusut.
  3. Strategi untuk mensimulasikan tekanan pada bola sedemikian rupa sehingga mereka "meledak ke luar" ketika lebih banyak ruang dibuat.

Pendekatan saat ini yang saya renungkan adalah menggunakan dinding yang terus bergerak, yang mati layar dan bergerak dengan layar, seperti yang diilustrasikan gambar ini:

tekanan!.

Dinding yang bergerak ini akan mendorong dan menjebak bola ke ruang. Adapun menambahkan bola baru, saya akan memiliki salah satu (1) bola mereplikasi diri mereka saat mendeteksi ruang kosong, ATAU (2) menelurkan mereka di sisi kiri ruang (di mana dinding itu) - mendorong sisa bola ke mengisi ruang. Saya meramalkan masalah dengan ide # 1 karena ini kemungkinan tidak akan benar-benar membuat / mensimulasikan tekanan; Gagasan # 2 tampaknya lebih menjanjikan, tetapi menimbulkan pertanyaan tentang bagaimana menyediakan lokasi bagi partikel-partikel bola baru ini untuk bertelur (dan percabangan memijahnya ketika tidak ada ruang).

Terima kasih banyak sebelumnya atas kebijaksanaan Anda!

BeachRunnerJoe
sumber

Jawaban:

6

Saya tidak yakin apa yang ingin Anda capai, apakah dinding mendorong partikel saat ruang bergulir dari layar adalah mekanik permainan?

Adapun tiga poin Anda, saya pikir semua perilaku itu akan muncul jika Anda memperlakukan partikel Anda seperti ini: Mintalah setiap partikel memukul mundur setiap partikel lainnya berbanding terbalik dengan jarak, dan juga membuat mereka bertabrakan dengan dinding ruang Anda untuk menghentikannya.

Partikel yang berdekatan akan saling tolak satu sama lain dan dengan demikian menyebar untuk mengisi ruang kosong sampai terhenti oleh rintangan. Jika / ketika dinding bergerak untuk membuat ruang lebih kecil, dan mendorong partikel, mereka akan terdorong lebih dekat ke partikel lain, menolaknya lebih kuat yang pada gilirannya akan mendorong partikel lain, meningkatkan tekanan keseluruhan.

Ini akan sangat mirip dengan simulasi n-body dengan tarikan negatif, jadi tergantung pada jumlah partikel, bisa jadi cukup mahal untuk menghitung tolakan untuk setiap partikel dengan setiap partikel lainnya. Anda mungkin dapat mencoba untuk menyederhanakan ini dengan meminta setiap partikel diusir hanya oleh pusat gravitasi rata-rata dari massa partikel Anda, yang mungkin menghasilkan perilaku aneh di area tipis yang panjang dengan belokan (gas Anda tidak melebar ke area yang menekuk menjauh dari pusat gravitasi, misalnya).

Adapun untuk membuat dan menghapus partikel (untuk memastikan ada jumlah yang tepat untuk secara visual mengisi ruang yang saya kira?), Anda mungkin ingin memastikan untuk tidak hanya menambah atau menghilangkan partikel ketika kepadatannya kurang, karena itu akan memperkenalkan lebih banyak partikel memukul mundur partikel lain, dan karenanya menambah atau mengurangi tekanan.

Jadi, Anda mungkin ingin memasukkan faktor ke dalam perhitungan tolakan, katakan mulai dengan 1.0 dan ketika Anda menambahkan x partikel, buat faktor baru n / (n + x) di mana n adalah jumlah total partikel sebelum menambahkan yang baru.


sumber
2

Tekanan (seperti dalam gas) hanyalah hasil dari tabrakan elastis polos antara partikel Anda dan antara partikel dan dinding. Anda hanya mengukur jumlah tabrakan per kali dengan dinding untuk mendapatkan nilai untuk tekanan Anda.

2 gagasan yang Anda berikan tidak memiliki hubungan langsung dengan tekanan, karena tekanan diberikan dengan jumlah partikel yang konstan dalam volumina tertutup dan suhu tertentu (yang menghasilkan partikel yang bergerak lebih cepat atau lebih lambat).

Jika Anda menambahkan partikel ke sistem tertutup ini, tekanan akan naik, karena ada lebih banyak energi di seluruh sistem (Anda baru saja menambahkan partikel baru dengan suhu yang diberikan <-> kecepatan).

Aron_dc
sumber
partikel harus memiliki massa untuk tumbukan elastis, karena dinding diasumsikan memiliki massa mendekati + infinity
Aron_dc
Saya mengatakan "tekanan adalah jumlah tabrakan per waktu dengan dinding" itu adalah noch 100% tepat. Dalam tabrakan elastis, Anda mengambil impuls partikel itu dan mengukur berapa banyak impuls yang diberikan ke dinding. Jadi, jika satu partikel bertabrakan dalam arah vertikal ke dinding, dinding mendapat dorongan 2mv (m = massa partikel; v = kecepatan partikel). Jadi Anda benar-benar mengukur impuls yang masuk ke dinding. Partikel baru saja dipantulkan (v sebelum tumbukan = -v setelah tumbukan). Ini bahkan membantu mengukur tekanan campuran gas yang berbeda (berbeda m untuk partikel).
Aron_dc
0

Setiap loop, Anda harus mengulangi semua partikel Anda, dan kemudian menghitung gaya final pada partikel itu. Pada dasarnya, dinding selalu memberi mereka vektor gaya positif pada sumbu x, jika mereka bertabrakan dengannya (particle.x - particle.r <= 0).

Kemudian, setiap partikel yang bertabrakan juga memberi mereka vektor gaya, tergantung pada sudut di antara mereka. Anda mengumpulkan sudut-sudut ini untuk semua partikel, menghitung rata-rata, dan ini dia!

Ada banyak teknik optimasi yang dapat Anda gunakan di sini, juga, lihat saja tutorial fisika bola. Anda pada dasarnya ingin mengulangi setiap pasangan partikel hanya sekali dan menghitung vektor gaya untuk keduanya dan menyimpannya di dalamnya.

Ini akan mensimulasikan gas, pada dasarnya, dan jika Anda memberi mereka gaya konstan, cairan juga, saya kira.

Sedangkan untuk membuat dan menghapus partikel, saya menerapkan kelas ParticleEmitter, yang memiliki posisi, arah, dan beberapa hal bermanfaat lainnya. Contoh Anda akan lebih baik dengan emitor yang dapat membuat partikel dalam kisaran tertentu, atau bahkan lebih baik, persegi panjang.

jcora
sumber