In meiner 2D-Physik-Engine kann ich AABB-gegen-AABB-Kollisionen erkennen und beheben, indem ich den kürzesten Penetrationsvektor finde und ihn zur Position der AABB hinzufüge.
Dadurch wird der erste AABB außerhalb des zweiten AABB "gedrückt", es werden jedoch überhaupt keine Geschwindigkeits- / Beschleunigungsänderungen behandelt.
Wenn ich meiner Simulation eine Schwerkraftbeschleunigung hinzufüge, wächst die Geschwindigkeit des ersten dynamischen AABB weiter, selbst wenn er auf dem zweiten statischen AABB aufliegt. Schließlich wird die Geschwindigkeit zu groß und die Kollision wird nicht erkannt (der dynamische AABB fällt durch den statischen).
Ich habe versucht, die Geschwindigkeit nach dem Auflösen auf Null zu setzen, aber es hat offensichtlich nicht gut funktioniert und unrealistische Simulationen erstellt.
Ich habe online gelesen, dass das Auflösen von Kollisionen durch manuelles Bearbeiten der Position oder der Geschwindigkeit nicht korrekt ist. Ich habe versucht, Kräfte zu implementieren (Masse ist vorerst eine "fest codierte" 1):
void Body::applyForce(sf::Vector2f mForce) { acceleration += mForce; }
void Body::integrate(float mFrameTime)
{
velocity += acceleration * mFrameTime;
position += velocity * mFrameTime;
acceleration = {0, 0};
}
Wenn ich während der Kollisionsauflösung den kürzesten Eindringvektor als Kraft anwende, wird der dynamische AABB aus dem statischen "herausgedrückt", aber seine Geschwindigkeit wird in einer Simulation ohne Schwerkraft niemals abnehmen und er wird für immer in Bewegung bleiben.
Gibt es eine Möglichkeit, eine "temporäre" Kraft anzuwenden? Eine Kraft, die sich mit dem Herausdrücken des ersten AABB aus dem zweiten AABB befasst und dann aufhört, wenn der AABB nicht mehr kollidiert?
Der gesamte Quellcode ist hier verfügbar: https://github.com/SuperV1234/SSVSCollision