2D Magnetartiges Abstoßungsverhalten

7

Wenn jemand ein System zwischen zwei sich kreuzenden Rechtecken entwickeln wollte, so dass sich die Rechtecke schrittweise voneinander wegdrücken, bis sie sich nicht mehr schneiden, wobei die Abstoßungskraft stärker ist, je nachdem, wie tief der Schnittpunkt ist ... was würde die Mathematik aussehen?

TheBroodian
quelle
Sollten sie beschleunigen, bis sie sich nicht mehr kreuzen? Und sollten sie allmählich langsamer werden, um anzuhalten, sobald sie aufhören, sich zu kreuzen?
Mikael Högström
Ja, sie sollten beschleunigen, bis sie sich nicht mehr kreuzen. Wenn sie langsamer werden, sobald sie aufhören, sich zu kreuzen, würde sich die Reibung der Welt darum kümmern, sobald die Rechtecke von ihrer Kreuzung aus nicht mehr beschleunigt werden.
TheBroodian

Antworten:

13
a:Object;
b:Object;

dx:Number = a.x - b.x; //distance by x
dy:Number = a.y - b.y;
distance:Number = Math.sqrt ( dx*dx + dy*dy );

Wenn Sie das Verhalten von Magneten simulieren möchten, möchten Sie die Kräfte auf den Abstand zwischen ihnen stützen. Die Physik sagt es so:

Formel für die Magnetkraft

Aber Sie werden in Ordnung sein mit:

force = Math.floor ( MAX_FORCE / distance );

Und dann müssen Sie Trigonometrie verwenden, um Kraft als Geschwindigkeitsänderung anzuwenden:

var angle:Number = Math.Atan2 ( dy, dx );
var x_speed:Number = force * Math.cos ( angle );
var y_speed:Number = force * Math.sin ( angle );

a.vx += x_speed;
a.vy += y_speed;
b.vx -= x_speed;
b.vy -= y_speed;

//and of course a.x += a.vx etc.
Markus von Broady
quelle
Nachdem ich dies in mein Spiel implementiert habe, funktioniert es fast, aber ich habe ein Problem: Objekt1 ist ein Spielercharakter und Objekt2 ist eine Dummy-Box, die nichts anderes tut, als an Ort und Stelle zu sitzen, wenn keine äußeren Kräfte darauf einwirken. Wenn Objekt1 in Objekt2 verschoben wird und zu weit in Objekt2 drückt, hört es zuerst auf, sich zu bewegen (wünschenswert, wenn man bedenkt, dass sein Schnittpunkt zu weit gegangen ist und zu stark abgestoßen wird, um weiter zu schieben), aber wenn Objekt1 aufhört, in Objekt2 zu beschleunigen, Objekt1 wird aus Objekt2 abgestoßen, aber dann bleibt Objekt2 irgendwie an Objekt1 hängen, und beide
scooten
und beide rutschen in die entgegengesetzte Richtung davon, aus der Objekt1 ursprünglich herausgeschoben wurde. Ich habe keine Ahnung, was dieses Verhalten verursachen würde?
TheBroodian
Ich muss Ihren Code sehen.
Markus von Broady
2
Egal, nochmals vielen Dank für Ihre Hilfe und Ihre Bereitschaft, sich meinen Code anzusehen. Mein oben genanntes Problem war auf meine eigene fehlerhafte Handhabung der Reibung zurückzuführen. Ich habe sie getestet und lokalisiert und behandelt. Alles funktioniert super, nochmals vielen Dank! :)
TheBroodian