Ich habe einen Algorithmus geschrieben, um eine Kollision zwischen zwei Kugeln mit Impulserhaltung zu lösen. Es scheint genau wie erwartet in meinen Simulationen zu funktionieren. Hier ist der Code:
public void Resolve()
{
var r = 0.5; // coefficient of restitution
var m = Ball1.Mass + Ball2.Mass;
var ua = Ball1.Velocity.Magnitude * Math.Cos(Ball1.Velocity.Angle(Normal));
var ub = Ball2.Velocity.Magnitude * Math.Cos(Ball2.Velocity.Angle(Normal));
var va = (r * Ball2.Mass * (ub - ua) + Ball1.Mass * ua + Ball2.Mass * ub) / m;
var vb = (r * Ball1.Mass * (ua - ub) + Ball1.Mass * ua + Ball2.Mass * ub) / m;
Ball1.Velocity -= Normal * (ua - va);
Ball2.Velocity -= Normal * (ub - vb);
}
Jetzt möchte ich auch, dass dies funktioniert, wenn mehr als zwei Kugeln gleichzeitig kollidieren. Mein anfänglicher Gedanke war, dass ich diese Gleichung einfach mehrmals für jeden Kontakt zwischen Kugeln lösen könnte. Wenn ich eine Situation wie eine "Newtons Wiege" habe, in der die Kugeln "seriell" in Kontakt sind, ist es einfach, jede Kollision einzeln zu lösen und ohne die Kugeln zu bewegen, einfach weitermachen und die nächste und die nächste berechnen usw bis zum Erreichen des letzten Balls, der mit aller Energie endet, die auf dem Weg nicht verloren geht. Das funktioniert auch gut, wenn auch nicht sehr schnell.
Aber was ist zum Beispiel in einem Fall, in dem drei Kugeln V-förmig in Kontakt sind und die unterste Kugel diejenige mit einer Geschwindigkeit ist (in diesem Fall nach oben)? Ich meine, wie verteile ich jetzt die Energie auf die anderen beiden Kugeln? Die Gleichung, die ich habe, funktioniert nur für zwei Bälle und jetzt sehe ich nicht mehr, wie ich das iterativ berechnen kann. Können Sie mir dabei helfen, wie ich damit denken soll? Kann ich meine Resolve-Funktion so ändern, dass sie mit einer beliebigen Anzahl von Bällen funktioniert? Ich meine mit einem Satz von Bälle mit Verbindungsflächen und Anfangsgeschwindigkeitsvektoren, was werden die resultierenden Geschwindigkeiten sein? Gibt es dafür eine allgemein bekannte Lösung?
Notiz:
Ich habe die Methode ausprobiert, die derzeit als Antwort markiert ist, aber ich habe leider in einigen Setups etwas seltsame Ergebnisse erhalten. Sei gewarnt. Ich werde wahrscheinlich wieder dazu zurückkehren, eine Kollision nach der anderen zu lösen. Ich werde diese Informationen aktualisieren, wenn ich dies mehr versucht habe.
Sie müssen ein System von einrichten Gleichungen mit Impuls-Unbekannte, wenn abgeleitet von der Bälle, während nur von ihnen kollidieren irgendwann.
So geht's:
Erstellen Sie eine (Block-)Matrix mit allen Massen, aber auch von Reihen
Sie suchen nach der Geschwindigkeitsänderung aufgrund all der Impulse aus den Kollisionen. Wenn Sie die Summe aller Impulse kennen würden (wieder drin Vektor), dann würden Sie die Geschwindigkeitsänderung schreiben als
Ein ... kreieren Kontaktpaarblockmatrix . Jede Spalte stellt einen Kontakt zwischen zwei Körpern dar ( ), indem sie den Kontaktnormalenvektor enthält im -ten Blockposition und dem negativen Normalenvektor im -te Blockposition. Zum Beispiel:
Konstruiere ein Vektor unbekannter Impulsgrößen für jedes Kontaktpaar.
Berechnen Sie die relative Geschwindigkeit jedes Kontaktpaares ( Vektor) durch Projektion der Geschwindigkeiten entlang der Kontaktnormalen
Stellen Sie das Kollisionsgesetz in Bezug auf die Relativgeschwindigkeiten vor und nach der Kollision auf.
Setzen Sie 3. 5. und 7. zusammen, um zu machen
Wenn alle Impulse berechnet sind, ändert sich jeder Körpergeschwindigkeitsvektor um
Beispiel
Stellen Sie sich drei Kugeln vor, die gleichzeitig einschlagen:
Verwenden Sie dieses MATLAB
Skript, um ihre endgültigen Geschwindigkeiten zu finden:
%% Example triple impact (with 3D vectors)
% Three spheres impact at the same time. See Figure for their
% masses, positions and velocities before impact
% define unit vectors
o_ = [0;0;0];
i_ = [1;0;0];
j_ = [0;1;0];
k_ = [0;0;1];
R = 20;
r_1 = R*i_
r_2 = -R*i_
r_3 = R*tand(60)*j_
% Three possible contacts: 1*2, 2*3, 1*3
n_12 = (r_2-r_1)/norm(r_2-r_1)
n_23 = (r_3-r_2)/norm(r_3-r_2)
n_13 = (r_3-r_1)/norm(r_3-r_1)
% velocity vectors before impact
v_1 = o_;
v_2 = -1.0*n_12
v_3 = -2.0*n_13
v = [v_1;v_2;v_3]
% mass matrix
M = blkdiag(5.0*eye(3),4.0*eye(3),3.0*eye(3))
% contact pair matrix
Z = [-n_12, o_, -n_13; n_12, -n_23, o_; o_, n_23, n_13]
% Z =
%
% 1.0000 0 0.5000
% 0 0 -0.8660
% 0 0 0
% -1.0000 -0.5000 0
% 0 -0.8660 0
% 0 0 0
% 0 0.5000 -0.5000
% 0 0.8660 0.8660
% 0 0 0
% coefficient of restitution
eps = 0.5
% impact speeds
u_imp = Z.'*v
% impulses
J = -(1+eps)*inv(Z.'*inv(M)*Z)*u_imp
% J =
%
% 1.7021
% 2.1702
% 4.6277
% velocity vector change
Dv = inv(M)*Z*J
% final velocity
v_final = v+Dv
% v_final =
%
% 0.8032
% -0.8015
% 0
% 0.3032
% -0.4699
% 0
% 0.5904
% 0.2303
% 0
% check for error
actual = Z.'*(v+Dv); %(relative speeds after impact) =
expected = -eps * u_imp; % -eps*(relative speeds before impact)
err = actual-expected
% err =
%
% 1.0e-015 *
%
% -0.1110
% -0.6661
% -0.6661
Im letzten Teil überprüfe ich die Ergebnisse gegen das Kontaktrecht und der Fehler ist ~1e-15
.
v
Komponenten können Sie beliebige Werte verwenden.v=[v1x,v1y,v2x,v2y,v3x,v3y,...,vnx,vny]
Leider muss ich Jonathan Wheeler zustimmen: Es gibt keine anderen Formeln, und Ihre aktuelle Methode ist wahrscheinlich die beste, die es gibt, sogar für nur 3 Bälle.
Bei Newton's Cradle ist das Ergebnis gleich, ob sich die Bälle berühren oder nicht. Eine leichte Lücke zwischen den Kugeln ergibt das gleiche Endergebnis. Dies deutet darauf hin, dass Ihr Ansatz, die Kollision mehrerer Körper in eine Folge von paarweisen Kollisionen aufzuteilen, das richtige physikalische Ergebnis liefert. In der Praxis ist dies fast immer möglich, denn wenn die Auflösung erhöht wird – also der Zeitschritt in der Simulation verkleinert wird – dann tritt zuerst eine paarweise Kollision auf.
Der Nachteil besteht, wie Sie bereits bemerkt haben, darin, dass dieses Verfahren möglicherweise übermäßige Berechnungen erfordert, da es zu vielen erneuten Kollisionen zwischen demselben Körperpaar kommen kann. Wenn die Simulation in Echtzeit angezeigt wird, könnte die gesamte Simulation merklich verlangsamt werden, wenn eine solche Kollision auftritt. Daher die Notwendigkeit einer Methode, um das Ergebnis ohne so viel Iteration zu bestimmen.
Außer in einigen Situationen, in denen eine gewisse Symmetrie vorliegt, gibt es (soweit mir bekannt) keine bekannte geschlossene Formel, die das Ergebnis auch für einen 3-Körper-Kollision angibt, vergleichbar mit Gleichungen für den 2-Körper-Kollision. Dies liegt daran, dass die gleichzeitige Kollision von 3 starren Körpern unbestimmt ist – dh es gibt nicht genügend Einschränkungen, um die Anzahl der Variablen anzupassen.
Wie Garyp vorschlägt, bietet die Einbeziehung elastischer Verformungen und Kräfte in das Modell mehr Einschränkungen, sodass das Ergebnis bestimmt werden kann. Das Modellieren verformbarer Körper erhöht jedoch die Komplexität des Programms, und aufgrund der Kopplung zwischen Kräften erfordern die resultierenden Gleichungen wahrscheinlich eine numerische Lösung durch Iteration. Es entsteht also das gleiche Problem einer erhöhten Rechenzeit.
Symmetrische Kollisionen von 3 identischen Kugeln umfassen (i) den kolinearen Fall und (ii) eine Kugel, die sich senkrecht zu den anderen 2 bewegt, die entweder stationär sind oder sich mit der gleichen Geschwindigkeit in die gleiche oder entgegengesetzte Richtung zur ersten bewegen. Solche symmetrischen Fälle werden jedoch bei einer Simulation vom Molekularbewegungstyp äußerst selten sein.
Fazit: Wenn Sie möchten, dass Ihre Simulation eine genaue Darstellung einer realen 3-Körper-Kollision ist, ist Ihre aktuelle Methode (Lösen aufeinanderfolgender paarweiser Kollisionen mit ausreichender Zeitauflösung) wahrscheinlich die effizienteste verfügbare. Die gleiche Methode behandelt alle Kollisionen mit mehreren Kugeln.
Nützliche Referenzen
Frage zu elastischen Stößen und Impulserhaltung / Energieerhaltung Starrkörperstoß
, 3 Kreise im Kontakt
Berechnung eines 3-Wege-Kreisstoßes
Forschungsartikel
Ein propagatives Modell des simultanen Aufpralls: Existenz, Einzigartigkeit und Konsequenzen für das Design Überlegungen
zum gleichzeitigen Aufprall
Machen Sie einen sinnvollen Aufprall: Modellierung simultaner Reibungskollisionen in räumlichen Mehrkörpersystemen
Newtons Wiege rückgängig gemacht: Experimente und Kollisionsmodelle für die normale Kollision dreier fester Kugeln ( Zugang über paywall )
The Two Ball Bounce Problem
A State Transition Diagram for Simultaneous Collisions with Application in Billard Shooting
Restitutionseigenschaften bei direkter zentraler Kollision dreier unelastischer Kugeln
Two Interpretations of Rigidity in Starr Body Collisions ( ResearchGate Listing with citations )
Dies ist nur eine Teilantwort, aber hoffentlich hilft es.
Es gibt zwei Prinzipien, die Sie beachten müssen, wenn Sie nach Bewegung suchen. Energieerhaltung und Impulserhaltung . Nämlich,
Im Allgemeinen ist das „Drei-Körper“-Problem ziemlich schwer zu lösen, und wenn Sie können, ist es vielleicht besser, die Kollision von drei Kugeln in drei Kollisionspaaren zu modellieren. Ich glaube nicht, dass das Lösen dieser Erhaltungsgleichungen oben zu einem eleganten formalen Wann führen wird .
Garyp
Sammy Rennmaus