Mam prosty silnik fizyki, który rozwiązuje kolizje, po prostu korygując bezpośrednio położenie nakładających się ciał (na razie tylko kół), a nie tylko zmieniając prędkość lub przykładając impuls. Prędkość zmienia się dopiero po rozstrzygnięciu uderzeń lub podczas części integracyjnej.
Miałem problem polegający na tym, że w stosach obiektów górne obiekty wywierają zbyt duży nacisk (istnieje to domyślnie, w algorytmie nie ma modelowania ciśnienia) na obiekty na dole stosu, co powoduje, że są one wypychane przez podłogi, itp.
Chciałem to naprawić, sortując obiekty według ich współrzędnych y, aby kolizje były rozwiązywane oddolnie. Ale teraz silnik wykazuje dziwne trzaskanie dla obiektów, które powinny być w spoczynku (patrz gif)
Bez podania kodu źródłowego - co to może być?
źródło
Odpowiedzi:
Jednym z rozwiązań, które znalazłem podczas korzystania z korekcji pozycji, jest kilka iteracji i zmienianie siły przy każdej iteracji.
Tak więc pierwsza iteracja ma siłę 1 / num_iterations, a ostatnia ma siłę 1. To sprawia, że moje symulacje są płynniejsze i bardziej stabilne niż zwykłe używanie tej samej liczby iteracji o stałej sile.
źródło
Twój problem polega na tym, że nie masz stanu „spoczynku” dla swoich ciał. Każdy układ fizyki ma pewną ilość energii, czy to kinetycznej, termicznej i tak dalej. W rzeczywistości obiekt stały nieznacznie odkształca się i przekształca część energii kinetycznej w ciepło, chociaż jest to trudno mierzalne. Warto również zauważyć, że w rzeczywistości nie ma czegoś takiego jak całkowicie solidny obiekt. Nawet gęste materiały, takie jak diament, mają przestrzeń między atomami, dając strukturze atomowej miejsce na wygięcie i pochłanianie energii kinetycznej.
Aby było to istotne, ciała spoczynkowe znajdują się w stanie, w którym jedynymi działającymi siłami jest „siła normalna”, to znaczy siła, która uniemożliwia ciałom przepływanie przez siebie. Wielkość tej normalnej siły jest proporcjonalna do gęstości obiektów i odległości między nimi.
Silniki fizyki nazywają tę wartość „spadkiem”.
Oto sztuczka: oblicz nachylenie i popraw położenie ciał oraz zastosuj siłę normalną, w oparciu o prędkość względną dwóch ciał. podczas aktualizacji samych ciał oblicz energię kinetyczną każdego z ciał. Jeśli jest poniżej wartości minimalnej, uśp ciało, dopóki nie zostanie przyłożona siła o wystarczającej wielkości. (zwykle dwukrotność wartości minimalnej).
źródło
Dlaczego nie dodać do nich „lepkiej” powierzchni i sprawić, by stopniowo przylegały do pozycji spoczynkowej, a kiedy uderzy w nią inny przedmiot, przenosi w to pewną energię, powodując jego ruch, ale lepka powierzchnia spowoduje utratę części tej energii i zatrzymanie w pozycji spoczynkowej. gif wygląda na to, że nie ma tarcia.
źródło