Zasada zachowania pędu i energii kinetycznej w kolizji
W idealnej kolizji między dwoma kulami w płaszczyźnie, obowiązują dwie zasady zachowania: pęd jest zawsze zachowywany (niczym nie są oddziaływane w krótkim czasie kontaktu) oraz energia kinetyczna jest zachowywana tylko w przypadku kolizji sprężystych. Wszystko, co determinuje reakcję na kolizję, wynika z połączenia tych dwóch zasad zachowania z geometrią kontaktu.
Aby uprościć problem 2D, należy podzielić prędkość każdej kuli na dwie składowe w momencie uderzenia: składowa równoległa do linii łączącej centra kul (składowa normalna) i składowa prostopadła do niej (składowa styczna). Tylko składowe normalne zmieniają się podczas idealnej kolizji bez tarcia – składowe styczne przechodzą przez punkt uderzenia niezmienione, ponieważ nie ma siły w tym kierunku, aby je zmienić.
n = (x2 − x1) / |x2 − x1| // wektor jednostkowy, od środka 1 do środka 2 v1n = v1 · n v2n = v2 · n // składowe normalne (iloczyn skalarny) v1t = v1 − v1n·n v2t = v2 − v2n·n // składowe styczne (niezmieniłe) Kolizja sprężysta 1D wzdłuż osi normalnej (masy m1, m2): v1n' = [(m1−m2)·v1n + 2·m2·v2n] / (m1+m2) v2n' = [(m2−m1)·v2n + 2·m1·v1n] / (m1+m2) owy prędkość: v1' = v1n'·n + v1t v2' = v2n'·n + v2t Zmniejsza to skomplikowany problem 2D wektorowy do klasycznej formuły kolizji sprężystej 1D, stosowanej wyłącznie wzdłuż osi normalnej, a następnie złączonej z niezmienioną składową styczną. Równe masy wymieniają się ze sobą składowymi prędkości normalnych dokładnie – klasyczny wynik jak w wahadłowym zegarku Newtona – podczas gdy lekka kula uderzająca w bardzo ciężką po prostu odbija się z prawie odwróconym prędkością, ponieważ ciężka kula prawie się nie porusza.
n = (x2 − x1) / |x2 − x1| // unit normal, centre 1 → centre 2 v1n = v1 · n v2n = v2 · n // normal components (dot product) v1t = v1 − v1n·n v2t = v2 − v2n·n // tangential components (unchanged) 1D elastic collision along the normal (masses m1, m2): v1n' = [(m1−m2)·v1n + 2·m2·v2n] / (m1+m2) v2n' = [(m2−m1)·v2n + 2·m1·v1n] / (m1+m2) new velocity: v1' = v1n'·n + v1t v2' = v2n'·n + v2t
Współczynnik zwrotu rządzi wszystkim pomiędzy
Rzeczywiste zderzenia rzadko są idealnie sprężyste – część energii kinetycznej jest tracona na dźwięk, ciepło i odkształcenia. Współczynnik zwrotu e, w zakresie od 0 (idealnie nieelastyczne, obie przedmioty przylegają do siebie i poruszają się z prędkością współzwycięstą) do 1 (idealnie sprężyste, bez utraty energii), skaluje, jak bardzo odwraca się względna prędkość normalną:
e = −(v1n' − v2n') / (v1n − v2n) (względna prędkość rozdzielenia / względna prędkość zbliżania się) Postać oparta na impulsach (używana w większości silników fizycznych): J = −(1 + e) · (v1n − v2n) / (1/m1 + 1/m2) v1' = v1 + (J/m1)·n v2' = v2 − (J/m2)·n Ta postać oparta na impulsach jest dokładnie tym, co silniki fizyczne w czasie rzeczywistym faktycznie implementują: oblicz pojedynczy skalarowy impuls J wzdłuż normalnej z prędkością zbliżania się i współczynnikiem zwrotu, a następnie zastosuj go symetrycznie dla każdej masy. Natychmiast uogólnia się to na tarcie (dodaj impuls tangencjalny ograniczony przez μJ), na ruch obrotowy (zastosuj impuls w punkcie kontaktu zamiast środka masy, co powoduje obrót) i na spoczynek (łańcuchy małych impulsów rozwiązane iteracyjnie, ponieważ dwa przedmioty nie mogą po prostu interpenetrować i rozdzielać się za każdym razem)
e = −(v1n' − v2n') / (v1n − v2n) (relative separation speed / relative approach speed) impulse-based form (used in most physics engines): J = −(1 + e) · (v1n − v2n) / (1/m1 + 1/m2) v1' = v1 + (J/m1)·n v2' = v2 − (J/m2)·n
Zachowanie pędu jako weryfikacja poprawności
Najbardziej przydatnym narzędziem do weryfikacji poprawności implementacji reakcji na kolizje jest wykres sumy pędu i, dla e = 1, sumy energii kinetycznej w czasie. Oba powinny pozostać niezmienne do precyzji numerycznej. Zachowanie pędu jest twardym ograniczeniem formuły impulsu (dwa impulsy są dokładnie równe i przeciwne), więc jeśli symulacja pokazuje dryfujący pęd, błąd prawie zawsze znajduje się w geometrii – użycie niewłaściwej normalnej kontaktu lub rozwiązywanie kolizji o niewłaściwym momencie względem momentu, w którym kule faktycznie się styka.
Frequently asked questions
Dlaczego kuly o równej masie wymieniają się prędkościami dokładnie w zderzeniu sprężystym?
Ustawienie m1 = m2 = m w 1D wzorze na zderzenie sprężyste wzdłuż osi normalnej powoduje, że v1n' spada do v2n a v2n' spada do v1n dokładnie – obie kule wymieniają się komponentami prędkości normalnej całkowicie, co jest podstawą fizyczną tego, dlaczego nieruchoma kula bilardowa ucieka z prędkością wstępnego pocisku, a wstępny pocisk prawie się zatrzymuje.
Co oznacza współczynnik zwrotu równy 0.5 fizycznie?
Oznacza to, że kule oddalają się od siebie po zderzeniu z połową prędkości względnej, z jaką zbliżały się do siebie – część energii kinetycznej wzdłuż linii uderzenia została utracona na ciepło, dźwięk lub deformację, podczas gdy e = 1 zachowuje tę prędkość względną dokładnie, a e = 0 powoduje, że obiekty poruszają się razem z zerową prędkością względnej separacji.
Dlaczego zmiana zachodzi tylko w składowej prędkości normalnej w bezślizgłym zderzeniu?
Ponieważ siła kontaktu między dwoma gładkimi, okrągłymi ciałami działa wyłącznie wzdłuż linii łączącej ich centra – nie ma siły prostopadłej do zmiany ruchu postępowego, więc ta składowa po prostu przechodzi przez zderzenie bez zmian, a całe działanie fizyczne zachodzi wzdłuż osi normalnej.
Wypróbuj na żywo
Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz 2D Collisions i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.
▶ Otwórz symulację 2D Collisions