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 ...
- Wiedząc, kiedy wykryć, kiedy jest miejsce do wypełnienia, a następnie dodać kulki do tego miejsca.
- Usuwanie kulek z przestrzeni, gdy się kurczy.
- 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:
.
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ść!
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.
źródło