Jak symulować ciśnienie za pomocą cząstek?


11

Próbuję symulować ciśnienie za pomocą zbioru kulistych cząstek w budowanej przeze mnie grze Unity. Kilka uwag na temat problemu:

  • Celem jest wypełnienie stale zmieniającej się przestrzeni 2d / pustki małymi, pozbawionymi tarcia kulkami. Gra próbuje zasymulować rosnącą presję coraz większej liczby obiektów wpychanych w tę przestrzeń.
  • Sam poziom ciągle przewija się od lewej do prawej, co oznacza, że ​​jeśli wymiary przestrzeni nie zostaną zmienione przez użytkownika, automatycznie się zmniejszą (skrajna lewa część przestrzeni będzie ciągle przewijać poza ekran).

Zastanawiam się, jakie są niektóre podejścia, które mogę podjąć, aby rozwiązać te problemy ...

  1. Wiedząc, kiedy wykryć, kiedy jest miejsce do wypełnienia, a następnie dodać kulki do tego miejsca.
  2. Usuwanie kulek z przestrzeni, gdy się kurczy.
  3. Strategie symulowania nacisku na kule, tak aby „eksplodowały na zewnątrz”, gdy powstanie więcej miejsca.

Obecne podejście, które rozważam, polega na użyciu stale poruszającej się ściany, która jest poza ekranem i porusza się wraz z ekranem, jak pokazano na tym zdjęciu:

nacisk!.

Ta ruchoma ściana popchnie i uwięzi kule w przestrzeni. Jeśli chodzi o dodawanie nowych sfer, zamierzałem, aby albo (1) sfery powielały się po wykryciu wolnego miejsca, LUB (2) spawnowały je po lewej stronie przestrzeni (tam, gdzie jest ściana) - popychając pozostałe kule do wypełnić przestrzeń. Przewiduję problemy z pomysłem nr 1, ponieważ prawdopodobnie nie stworzyłoby to / nie symulowałoby presji; pomysł nr 2 wydaje się bardziej obiecujący, ale rodzi pytanie, jak zapewnić lokalizację dla tych nowych cząstek kuli (i konsekwencje ich odradzania, gdy nie ma miejsca).

Z góry dziękuję za waszą mądrość!

Odpowiedzi:


6

Nie jestem do końca pewien, co chcesz osiągnąć, czy ściana odpycha cząsteczki, gdy przestrzeń zjeżdża z ekranu, mechaniką gry?

Jeśli chodzi o twoje trzy punkty, myślę, że te zachowania pojawiłyby się, gdybyś traktował swoje cząstki w ten sposób: Niech każda cząstka odpędzi każdą inną cząstkę odwrotnie proporcjonalną do odległości, a także zderzy się ze ścianami twojej przestrzeni, aby je zatrzymać.

Cząsteczki znajdujące się blisko siebie odpychałyby się nawzajem, a tym samym rozprzestrzeniałyby, wypełniając pustą przestrzeń, dopóki nie zostaną zatrzymane przez przeszkody. Jeśli / kiedy ściany poruszają się, aby zmniejszyć przestrzeń i popychają cząstki, zostaną one popchnięte bliżej innych cząstek, odepchną je silniej, co z kolei popchnie inne cząstki, zwiększając ogólne ciśnienie.

Byłoby to bardzo podobne do symulacji n-ciała z ujemnym przyciąganiem, więc w zależności od liczby cząstek obliczenie odpychania dla każdej cząstki z każdą inną cząstką może być dość kosztowne. Możesz spróbować to uprościć, ponieważ każda cząstka jest odpychana tylko przez uśredniony środek ciężkości masy cząstek, co może powodować dziwne zachowanie w długich cienkich obszarach z zakrętami (gaz nie rozszerza się w obszary, które wyginają się od środek ciężkości, na przykład).

Jeśli chodzi o tworzenie i usuwanie cząstek (aby upewnić się, że jest odpowiednia ilość, aby wizualnie wypełnić przestrzeń, którą zakładam?), Prawdopodobnie nie chcesz po prostu dodawać ani usuwać cząstek, gdy brakuje gęstości, ponieważ to wprowadziłoby więcej cząstek odpycha inne cząsteczki, a tym samym zwiększa lub zmniejsza ciśnienie.

Więc możesz chcieć wprowadzić czynnik do obliczania odpychania, powiedzmy, zacznij od 1.0, a kiedy dodasz x cząstek, zrób nowy współczynnik n / (n + x), gdzie n jest liczbą wszystkich cząstek przed dodaniem nowych.


2

Ciśnienie (jak w gazie) jest wynikiem zwykłych elastycznych zderzeń między cząstkami i między cząstkami a ścianą. Po prostu mierzysz liczbę zderzeń ze ścianami, aby uzyskać wartość swojego ciśnienia.

Dwie podane idee nie mają bezpośredniego związku z ciśnieniem, ponieważ ciśnienie jest podawane ze stałą ilością cząstek w zamkniętej objętości i danej temperaturze (co powoduje, że cząsteczki poruszają się szybciej lub wolniej).

Jeśli dodasz cząstki do tego zamkniętego układu, ciśnienie powinno wzrosnąć, ponieważ w całym układzie jest więcej energii (właśnie dodałeś nową cząstkę o danej temperaturze <-> prędkości).


cząstki powinny mieć masę dla zderzeń sprężystych, ponieważ zakłada się, że ściany mają masę bliską + nieskończoności
Aron_dc

Powiedziałem: „ciśnienie to ilość kolizji na raz ze ścianami”, które nie są w 100% precyzyjne. W zderzeniu sprężystym bierzesz impuls tej cząstki i mierzysz, ile impulsu jest dana ściana. Jeśli więc jedna cząstka zderzy się ze ścianą w kierunku pionowym, ściana otrzyma impuls o wartości 2 mv (m = masa cząstki; v = prędkość cząstki). Więc faktycznie mierzysz nadchodzący impuls na ścianie. Cząstka jest właśnie odbijana (v przed zderzeniem = -v po zderzeniu). Pomaga to nawet zmierzyć ciśnienie mieszanin różnych gazów (różne m dla cząstek).
Aron_dc

0

W każdej pętli należy wykonać iterację przez wszystkie cząstki, a następnie obliczyć ostateczną siłę działającą na tę cząsteczkę. Zasadniczo ściana zawsze daje im wektor siły dodatniej na osi x, jeśli zderzają się z nim (cząstka. X - cząstka. R <= 0).

Następnie każda cząstka, z którą zderzają się, daje im również wektor siły, w zależności od kąta między nimi. Zbierasz te kąty dla wszystkich cząstek, obliczasz średnią i gotowe!

Istnieje również wiele technik optymalizacji, których możesz tutaj użyć, po prostu zapoznaj się z samouczkiem fizyki piłki. Zasadniczo chcesz iterować przez każdą parę cząstek tylko raz i obliczyć wektor siły dla obu i zapisać go w nich.

Zasadniczo będzie to symulować gazy, a jeśli dasz im stałą siłę, również płyny, jak sądzę.

Jeśli chodzi o tworzenie i usuwanie cząstek, implementuję klasę ParticleEmitter, która ma pozycję, kierunek i kilka innych przydatnych rzeczy. Twój przykład byłby lepszy z emiterem, który może tworzyć cząstki w pewnym zakresie, a nawet lepiej, prostokącie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.