W moim silniku fizyki 2D mogę wykryć zderzenia AABB vs. AABB i rozwiązać je, znajdując najkrótszy wektor penetracji i dodając go do pozycji AABB.
W ten sposób „wypycha” pierwszy AABB poza drugi AABB, ale w ogóle nie radzi sobie ze zmianami prędkości / przyspieszenia.
Jeśli dodam przyspieszenie grawitacyjne do mojej symulacji, prędkość pierwszego dynamicznego AABB rośnie, nawet gdy spoczywa na drugim statycznym AABB. W końcu prędkość stanie się zbyt duża i kolizja nie zostanie wykryta (dynamiczny AABB spadnie przez statyczny).
Próbowałem ustawić prędkość na zero po rozdzielczości, ale najwyraźniej nie działało to dobrze i stworzyłem nierealne symulacje.
Czytam online, że rozwiązywanie kolizji przez ręczne działanie na pozycji lub prędkości jest nieprawidłowe. Próbowałem wdrożyć siły (na razie masa jest „zakodowana” 1):
void Body::applyForce(sf::Vector2f mForce) { acceleration += mForce; }
void Body::integrate(float mFrameTime)
{
velocity += acceleration * mFrameTime;
position += velocity * mFrameTime;
acceleration = {0, 0};
}
Jeśli zastosuję najkrótszy wektor penetracji jako siłę podczas rozwiązywania kolizji, dynamiczny AABB zostanie „wypchnięty” ze statycznego, ale jego prędkość nigdy nie spadnie w symulacji bez grawitacji i będzie się poruszać wiecznie.
Czy istnieje sposób zastosowania siły „tymczasowej”? Siła, która zajmuje się wypychaniem pierwszego AABB z drugiego AABB, a następnie zatrzymuje się, gdy AABB już nie koliduje?
Cały kod źródłowy dostępny tutaj: https://github.com/SuperV1234/SSVSCollision
źródło
Odpowiedzi:
Po pierwsze, polecam korzystanie z darmowej biblioteki fizyki typu open source, takiej jak Box2D, i skupienie się na aspektach gry, które czynią ją wyjątkową! Jeśli nalegasz na ponowne wynalezienie koła, czytaj dalej ... zauważ, że wszystkie silniki fizyki są przybliżone, a podczas gdy metoda, którą przedstawię poniżej, będzie dokładniejsza niż twój obecny model, wyniki Box2D będą znacznie bardziej realistyczne.
Aby szybko modelować dokładniejszą rozdzielczość kolizji dwóch obiektów A i B:
Proszę spojrzeć na mój przykładowy program asteroid, który demonstruje te koncepcje.
Następnie uwzględnij obiekty ułożone w stos:
Jak już zauważyłeś, używanie prędkości do symulacji obiektów ułożonych w stos / spoczynkowych nie działa dobrze: prędkość to prędkość, którą porusza się obiekt, więc jeśli spoczywa na obiekcie statycznym, prędkość powinna być bliska 0. Nie ma sensu zwiększać prędkość obiektu, aby pojawił się w spoczynku:
To, co powinno się naprawdę wydarzyć, to siła przyspieszenia, która zmierza w przeciwnym kierunku, ponieważ grawitacja powinna anulować grawitację. (To się nazywa normalna siła nacisku). Skrótem jest po prostu nie przykładanie grawitacji do ciał, które nie znajdują się w powietrzu:
Aktualizacja:
źródło
Rozwiązanie tego problemu wymaga dostosowania pozycji i ewentualnie prędkości. Silniki fizyki sztywnych ciał mają solver, który porusza obiekty w czasie z wykorzystaniem praw ruchu Newtona, a także rozwiązuje ograniczenia niepenetracyjne i tarcie. Silniki te mogą obliczyć właściwą kombinację ruchu liniowego i kątowego, aby stworzyć prawdopodobne trajektorie.
Jeśli chcesz tylko rozwiązać nakładanie się, możesz użyć pseudo prędkości, które generują trajektorie oddzielające bez zwiększania pędu. Odbywa się to w solverie pozycji Box2D.
Polecam pobrać moje prezentacje GDC z 2006 i 2007 roku tutaj:
http://code.google.com/p/box2d/downloads/list
Możesz także spojrzeć na Box2D Lite dla uproszczonej implementacji.
źródło
W prawdziwym świecie nie ma siły, która „wypycha” jedno ciało na zewnątrz innego ciała, ponieważ obiekty nigdy się nie przenikają. Najbliższą rzeczą jest normalna siła : stworzona w momencie kontaktu w rzeczywistych zderzeniach, przede wszystkim zapobiega penetracji.
Kąt tej siły normalnej jest prostopadły do powierzchni styku dwóch zderzających się obiektów. Wielkość zależy od siły potrzebnej do zapobiegania penetracji. (Należy zauważyć, że należy stosować tylko składową y siły normalnej, chyba że modelowane są również inne siły, takie jak siła tarcia).
Chociaż możliwe jest jawne modelowanie siły normalnej, łatwiej jest modelować tylko jej skutki:
Opisałem to nieco inaczej w mojej innej odpowiedzi, która dotyczy ogólnie kolizji .
źródło