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?


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.

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.