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