Ich habe eine einfache Physik-Engine, die Kollisionen löst, indem sie einfach die Position überlappender Körper (vorerst nur Kreise) direkt korrigiert, anstatt nur die Geschwindigkeit zu ändern oder einen Impuls anzuwenden. Die Geschwindigkeit wird erst geändert, nachdem die Auswirkungen bereits behoben sind, oder während des Integrationsteils.
Ich hatte das Problem, dass in Haufen von Objekten die oberen Objekte zu viel Druck auf die Objekte am unteren Rand des Haufens ausüben (dies existiert implizit, es gibt keine Druckmodellierung im Algorithmus), was dazu führt, dass sie durch den Boden geschoben werden. etc.
Ich wollte dies beheben, indem ich die Objekte nach ihrer y-Koordinate sortierte, damit die Kollisionen von unten nach oben aufgelöst werden. Aber jetzt zeigt die Engine ein seltsames Knallverhalten für Objekte, die eigentlich in Ruhe sein sollten (siehe gif).
Ohne nur den Quellcode anzugeben - was könnte das sein?
quelle
Antworten:
Eine Lösung, die ich bei der Verwendung der Positionskorrektur gefunden habe, besteht darin, einige Iterationen durchzuführen und die Stärke mit jeder Iteration zu variieren.
Die erste Iteration hat also eine Stärke von 1 / num_iterations und die letzte eine Stärke von 1. Dies macht meine Simulationen reibungsloser und stabiler als die Verwendung derselben Anzahl von Iterationen mit einer festen Stärke.
quelle
Ihr Problem liegt in der Tatsache, dass Sie keinen "Ruhezustand" für Ihren Körper haben. Jedes physikalische System hat eine Menge Energie, sei es kinetisch, thermisch und so weiter. In der Realität verformen sich feste Objekte leicht und wandeln kinetische Energie in Wärme um, obwohl dies kaum messbar ist. Es ist auch erwähnenswert, dass es in Wirklichkeit kein vollständig festes Objekt gibt. Selbst dichte Materialien wie Diamant haben einen Raum zwischen den Atomen, wodurch die Atomstruktur Raum hat, sich zu biegen und kinetische Energie zu absorbieren.
Um dies relevant zu machen, befinden sich ruhende Körper in einem Zustand, in dem die einzigen wirksamen Kräfte die "Normalkraft" sind, dh die Kraft, die verhindert, dass Körper durcheinander schweben. Die Größe dieser Normalkraft ist proportional zur Dichte der Objekte und wie weit sie sich gegenseitig durchdrungen haben.
Physik-Engines nennen diesen Wert "Slop".
Hier ist der Trick: Berechnen Sie die Neigung, korrigieren Sie die Position der Körper und wenden Sie die Normalkraft basierend auf der Relativgeschwindigkeit der beiden Körper an. Berechnen Sie während der Aktualisierung der Körper selbst die kinetische Energie jedes Körpers. Wenn es unter einem Mindestwert liegt, legen Sie den Körper in den Schlaf, bis eine Kraft von ausreichender Größe auf ihn ausgeübt wird. (normalerweise doppelt so hoch wie der Mindestwert).
quelle
Warum nicht eine "klebrige" Oberfläche hinzufügen und sie allmählich in einer Ruheposition halten lassen? Wenn ein anderes Objekt darauf trifft, überträgt es etwas Energie in das Objekt, wodurch es sich bewegt, aber die klebrige Oberfläche führt dazu, dass es einen Teil dieser Energie verliert und stoppt in einer Ruheposition. Das GIF sieht so aus, als hätte es keine Reibung.
quelle