Ich weiß ganz genau, wie ich nach Kollisionen suchen soll, aber ich weiß nicht, wie ich mit der Kollision richtig umgehen soll.
Vereinfacht gesagt, wenn zwei Objekte kollidieren, verwende ich einige Berechnungen, um die Geschwindigkeitsrichtung zu ändern. Wenn ich die beiden Objekte nicht bewege, überlappen sie sich immer noch und wenn die Geschwindigkeit nicht groß genug ist, kollidieren sie auch nach dem nächsten Update. Dies kann dazu führen, dass Gegenstände ineinander stecken bleiben.
Was aber, wenn ich versuche, die beiden Objekte so zu verschieben, dass sie sich nicht überlappen? Das klingt nach einer guten Idee, aber ich habe festgestellt, dass es sehr kompliziert wird, wenn es mehr als zwei Objekte gibt. Was ist, wenn ich die beiden Objekte bewege und eines davon mit anderen Objekten kollidiert, sodass ich sie ebenfalls bewegen muss und sie möglicherweise mit Wänden usw. kollidieren können?
Ich habe ein Top-Down-2D-Spiel im Sinn, aber ich glaube nicht, dass das viel damit zu tun hat. Wie werden Kollisionen normalerweise gehandhabt?
Diese Frage wird im Auftrag von Wooh gestellt
quelle
Antworten:
Daniel Kodicek behandelt dieses Thema in seinem Buch Mathematik und Physik für Programmierer sehr ausführlich .
Kodicek führt zwei Schritte aus, um eine natürlich wirkende Kollisionsauflösung zu erzielen:
Ich habe eine Demo hochgeladen, die auf Kodiceks Kollisionserkennung und -auflösung basiert .
Update: Hier ist ein Kollisionserkennungs- und Auflösungsalgorithmus , der der Kodicek-Methode sehr ähnlich ist. Mit Quellcode . Ich empfehle weiterhin Kodiceks Buch, da sein Algorithmus etwas anders implementiert und viel ausführlicher erklärt wird.
quelle
Was ist, wenn Sie die Kollision überprüfen, bevor sich die Objekte bewegen, anstatt danach? Oder mit anderen Worten, Sie lehnen die neue Position ab, wenn die Objekte kollidieren, und verwenden in diesem Fall die alte wieder?
Pseudocode:
Auf diese Weise stoßen die Objekte aneinander , wenn sie kollidieren . Wenn Ihr Aktualisierungsschritt klein genug ist, sollte der Spieler nichts Merkwürdiges in der Darstellung bemerken.
quelle
Wenn sich zwei Objekte überlappen, prüfen Sie, ob sie sich aufeinander zu oder voneinander weg bewegen. Machen Sie die Kollision nur, wenn sie sich aufeinander zubewegen.
Mit Vektormathematik ist es ziemlich einfach. Berechnen Sie einfach:
dot_product (B.position - A.position, A.velocity - B.velocity)
Bei positivem Ergebnis bewegen sich die Objekte aufeinander zu.
quelle
Ich könnte falsch verstehen, aber es sieht so aus, als würden Sie zwei Fragen stellen: 1. Was sind einige allgemeine Methoden zum Umgang mit der Kollisionsauflösung? Der Begriff, den Sie suchen, ist "impulsbasierte Simulation", und es gibt eine Reihe von Artikeln, die diesbezüglich verfassen kann es besser gerecht machen als ich.
Zusammenfassend lässt sich sagen, dass Sie Ihre Physiksimulation im Impulsraum, der Masse mal Geschwindigkeit ist, schrittweise ausführen möchten.
Glücklicherweise können für die Winkelantwort die größten und kleinsten Trägheitsmomente immer auf zwei orthogonale Achsen (in 2D) reduziert werden, was bedeutet, dass eine Matrixmultiplikation im Allgemeinen funktioniert, und wenn Sie diese mit der X- und Y-Achse ausrichten, wird sie zu ein 2D-Vektor.
Wenn Sie eine Kollision haben, ermitteln Sie die Reaktion auf der Grundlage der linearen und winkeligen Momente am Kollisionspunkt. Ein guter Fudge-Faktor ist, wenn Sie eine gegenseitige Durchdringung haben, eine gewisse Strafkraft anzuwenden (wie oben erwähnt), um die beiden Körper voneinander zu trennen.
Ab diesem Punkt werden Sie am Ende immer mehr Regeln hinzufügen, um das abweichende Verhalten zu kontrollieren, wie z. B. das Begrenzen des maximalen Drehimpulses, damit sich die Dinge nicht wie Spitzen drehen, usw., aber dies ist ein guter Anfang.
Halte es einfach, wenn du kannst.
Der einzige Weg, dies zu tun, ist mit einem System von linearen Gleichungen und viel Lösen. Der praktische Weg, dies zu tun, besteht darin, ein System wie das oben beschriebene zu haben und die Physik mit der Zeit auf natürliche Weise aufzulösen.
Die meisten Spiele, die Dinge wie Rollen oder Stehen auf sich bewegenden Oberflächen tun, haben ein Hybridmodell, bei dem Ihre Füße an einer Oberfläche (oder Rädern an der Straße) befestigt sind, um dem Zeitsprung der Physik Rechnung zu tragen (was zu Durchdringungsreaktionszyklen führen würde und würde nicht funktionieren).
Hoffe das hilft. Wenn Sie mathematische Beispiele benötigen, lassen Sie es mich wissen.
quelle
Die Art und Weise, wie dies normalerweise in Physik-Engines gelöst wird, ist das Anwenden einer Strafkraft. Das Bewegen des starren Körpers nach dem Durchdringen sieht nicht gut aus, wenn sich Ihre starren Körper mit höheren Geschwindigkeiten bewegen (es treten kurzzeitige Ruckbewegungen auf). Als ersten Schritt sollten Sie dies jedoch versuchen und prüfen, ob es Ihren Anforderungen entspricht.
A
penalty force
wirkt wie ein Feder-Dämpfer, bei dem die Strafkraft umso größer ist, je mehr Sie in den starren Körper eingedrungen sind, und in nachfolgenden Rahmen verringert wird. Betrachten Sie es als Federn. Wenn zwei starre Körper sich gegenseitig durchdringen, stoßen sie jeweils auf eine unsichtbare Feder, die ihr Fortschreiten dämpft (dh ein weiteres Durchdringen verhindert) und die zuvor genannten Mittel anwendet,penalty force
bis die Körper nicht mehr durchdringen.Es ist ein weit gefasstes Thema, aber mit den obigen Informationen können Sie hoffentlich loslegen.
quelle