7

Ich berechne das Ergebnis durch kollidierende Paare von konvexen 2D-Objekten (ohne Rotation), mit the basic equations on wikipedia. Wenn jedoch gibt es Abhängigkeiten, wie zwei Objekte ein anderes Objekt in der gleichen Zeit treffen:Wie werden mehrere gleichzeitige elastische Kollisionen behandelt?

enter image description here

Wie hier mit Objekten 1 und 2 3 an der exakt gleichen Zeit treffen, der paarweisen Ansatz scheitert . Abhängig von der Reihenfolge berechne ich die Kollisionen (1-3 zuerst oder 2-3 zuerst), ich werde unterschiedliche Ergebnisse erhalten. Wiederholte Iterationen durch die Kollisionen ergeben weiterhin auftragsabhängige Ergebnisse.

Ich habe es bereits eingerichtet, damit ich herausfinden kann, welche Objekte miteinander in Kontakt stehen, also weiß mein Code, wenn eines dieser Paare berechnet wird, dass Objekt 3 in diesem Moment mit einem anderen Objekt kollidiert 3 Kollision wird über die 2-3 Kollision wissen, und umgekehrt). Ich werde wissen, welche Kanten/Ecken mit was in Berührung kommen.

Was auch immer Lösung muss robust sein ... Zum Beispiel, wenn die Einrichtung komplizierter, wie diese zwei Beispiele hergestellt:

enter image description here

Der Prozess muss in der Lage sein, dass und schlechter zu behandeln. Jede mögliche Kette gleichzeitiger Kontakte/Kollisionen. Ich werde alle Daten zur Hand haben, um sie zu beschreiben, also muss ich "nur" wissen, wie man den allgemeinen Fall dieser Systeme löst. Ich mache gerade nichts mit Rotation, was die Dinge vereinfacht.

Es scheint, als würde es die Gruppierung von Objekten erfordern, aber die Interferenz, die durch Kanten verursacht wird, die nicht orthogonal sind (siehe das letzte Beispiel mit einem Sechseck), würde diesen Ansatz zum Scheitern bringen.

Ich sah a similar question, die zuvor gefragt wurde, aber die Antwort wurde nie überprüft (Sackgasse?). Ich bin mir nicht sicher, wie die Schockausbreitung auch mein erstes Beispiel lösen würde, da C sich nach der ersten Kollision wegbewegt ... also, welcher Schock soll sich ausbreiten? edit: Ok, ich sehe jetzt, dass gleichzeitige Kollisionen und Schockausbreitung zwei verschiedene Ideen sind, deshalb erschien es nicht sinnvoll.

+0

Es gibt tatsächlich eine Antwort auf die Frage, die Sie verknüpfen, und das könnte sein, was Sie suchen. –

+0

@AlexSzatmary Ich bin mir nicht sicher, wie dieser Ansatz auf mein erstes Beispiel anwendbar ist. Sobald eine Kollision auftritt, wird sich C wegbewegen ... Es gibt keinen Schock, der sich ausbreitet, wenn es um die zweite Kollision geht. – user173342

Antwort

4

Diese Art von dynamic simulation of multi-contact physics führt zu einer linear complementarity problem. Es gibt Algorithmen zur Lösung von this kind of problem; Die Mathematik ist verwandt mit der, die für lineare Programmierprobleme verwendet wird.

Die Notwendigkeit zur Lösung dieser Art von Problem ist häufiger als Sie vielleicht denken. Jede Art von vage realistischer Simulation (d. H. Mit Schwerkraft-, Boden- und inelastischen Kollisionen) wird bald mit Objekten enden, die aufeinander liegen; den Übergang von dynamischen Kollisionen im Weltraum, zu gleitenden und rollenden Objekten, zu "block-stacking" -Konfigurationen präzise und robust zu handhaben, kann technisch anspruchsvoll sein.

Ich empfehle für das Thema nach books or other resources suchen. Welche Techniken Sie tatsächlich benötigen, hängt von Ihrer spezifischen Anwendung ab, aber Sie können möglicherweise einige Bibliotheken finden, die Ihnen helfen.

1

Abhängig von der Reihenfolge ich die Kollisionen berechnen (1-3 zuerst oder 2-3 zuerst), werde ich unterschiedliche Ergebnisse erhalten.

Das ist richtig. Dies ist darauf zurückzuführen, wie die Physik von Kollisionen funktioniert. Betrachten dieses einfache Beispiels der erste Abbildung unter Verwendung von:

m_1 = m_2 = m_3 
u_1 = u_2 
u_3 = 0 
x_1 = x_2 + d 

Der einzige Unterschied zwischen 1 und 2 ist, dass 1 bis 3 näher ist durch d. 1 hits 3 first, stoppt und v_3 wird zu u_1 (u ist initial und v ist final velocity). Weil u_2 und das neue v_3 gleich sind, werden beide Objekte 2 und 3 mit konstanter Geschwindigkeit nach rechts mit einem konstanten Abstand d zwischen ihnen verfahren; sie werden sich nie berühren. Wenn 1 und 2 vertauscht sind, das heißt, wenn x_2 = x_1 + d, dann trifft 2 auf 3 und stoppt, und 1 folgt nach 3 nach d.

Die Reihenfolge der Kollisionen ist wichtig, und die Behandlung simultaner Kollisionen wie zwei aufeinanderfolgende momentane Kollisionen führt zu widersprüchlichen Ergebnissen, abhängig von der Reihenfolge, in der die Kollisionen verarbeitet werden.

Kollisionen, die wirklich gleichzeitig auftreten, sind oft ein pathologischer Fall (mathematisch) und müssen wahrscheinlich nicht korrekt für ein Spiel oder sogar für viele wissenschaftliche Modelle aufgelöst werden.

Wenn es wirklich wichtig ist, mehrere elastische Kollisionen korrekt aufzulösen, kann die Mathematik dafür berechnet werden, aber Sie müssen zusätzliche Annahmen hinzufügen.

m_1 u_1 + m_2 u_2 = m_1 v_1 + m_2 v_2 

und Erhaltung der Energie:

(1/2) * m_1 u_1^2 + (1/2) * m_2 u_2^2 = (1/2) * m_1 v_1^2 + (1/2) * m_2 v_2^2 

die Anfangsgeschwindigkeiten der Objekte gegeben, konnte die Geschwindigkeiten der beiden Objekte nach der Kollision der elastischen Stoß zweier Körper wird durch Impulserhaltung gegeben gefunden werden. Wenn Sie diese Gleichungen Konto für ein drittes Objekt ändern wollte,

m_1 u_1 + m_2 u_2 + m_3 u_3 = m_1 v_1 + m_2 v_2 + m_3 v_3 
(1/2) * m_1 u_1^2 + (1/2) * m_2 u_2^2 + (1/2) * m_3 u_3^2 = (1/2) * m_1 v_1^2 + (1/2) * m_2 v_2^2 + (1/2) * m_3 u_3^2 

eine dritte unabhängige Gleichung müssten eingeführt werden. Eine einfache Einschränkung könnte sein, dass die Impulsüberträgen von Objekten 1 und 2 sollen ihre Massen proportional sein:

m_1^2 (v_1 - u_1) = m_2^2 (v_2 - u_2) 

Dies würde für die in Abbildung 1 dargestellte Situation schön: intuitiv, würde ich erwarten, 1 und 2 habe die gleiche Endgeschwindigkeit, und diese Einschränkung würde Ihnen das geben. Seien Sie gewarnt, diese Gleichung hat keine klare physikalische Grundlage und kann in anderen Szenarien seltsame Ergebnisse liefern. Experimentieren Sie und sehen Sie, was gut aussieht.

Die Gleichungen, die Sie auf Wikipedia (die Standard, ziemlich nützliche, Lehrbuchgleichungen) erwähnen, nehmen an, dass es eine unverzügliche Übertragung des Momentums zwischen den zwei Objekten gibt. Dies trifft im wirklichen Leben nicht wirklich zu. Wenn eine Billardkugel eine andere trifft, verformen sich die Kugeln sehr leicht, und diese Verformung braucht Zeit; Diese Zeit liegt im Bereich von Millisekunden oder weniger und ist typischerweise vernachlässigbar.

+0

All dies ist sehr wahr, aber meine Simulation ist viel einfacher als die Realität. Die Zeit hat diskrete Schritte und Objekte sind starr. Während also ein wirklich gleichzeitiger Fall pathologisch sein kann, muss ich leider damit umgehen, da dies in meiner Simulation unvermeidlich ist.Und ich muss es auf deterministische Art und Weise handhaben, sonst wird es Desync zwischen verschiedenen Klienten geben ... Wie auch immer, was wären die Voraussetzungen dafür? – user173342

+0

user173342, versuchen Sie zu modellieren, was wirklich passiert oder nur etwas plausibel ist (zB für ein Spiel)? Sehr verschieden. Real Life Simulationen passen die Schrittgröße in Abhängigkeit von der Konfiguration (Abstand zwischen Objekten und Geschwindigkeit) an. Während Ihr Programm deterministisch sein kann und immer die gleiche Ausgabe produziert, ist es im wirklichen Leben nicht der Fall, wenn Sie die Eröffnungspause im Billard machen. Wenn Sie wollen, dass es plausible, realistische Ergebnisse liefert, müssen Sie wahrscheinlich zufälliges Rauschen einführen, wie es im wirklichen Leben passiert. Es ist schwierig, dies zu einer authentischen Simulation zu machen. Lediglich plausibel ist einfacher. –

0

Führen Sie die einzelnen Kollisionen einzeln durch, aber verwenden Sie immer die Anfangsgeschwindigkeit jedes Objekts. Wenn Sie fertig sind, addieren Sie die Geschwindigkeitsänderungen für jedes Objekt.

(v1_1,v3_1) = collide(u1,u3,m1,m3) 
(v2_2,v3_2) = collide(u2,u3,m2,m3) 
v1 = u1 + (v1_1 - u1) = v1_1 
v2 = u2 + (v2_2 - u2) = u2_2 
v3 = u3 + (v3_1 - u3) + (v3_2 - u3) = v3_1 + v3_2 - u3 

Auf diese Weise wird es nicht auftragsabhängig sein.