Ich erstelle eine 2D-Physik-Engine, und ich habe Probleme mit einer bestimmten Art von Kollision zwischen beweglichen und unbeweglichen Objekten. Was ich mit "beweglich" meine, ist, dass sich die (x, y) -Werte ändern können, nicht dass sich der Referenzrahmen ändern kann oder nicht.Wie löst man eine 2D-Kollision mit einem unbeweglichen Objekt?
Zum Beispiel wäre ein Ball, der gegen eine Wand schlägt, etwas, das beweglich mit etwas Unbeweglichem kollidiert.
Ich glaube, dass ich so etwas wie Normalkraft in dieser Situation verwenden muß, aber ich bin nicht sicher, wie das für die Suche nach dem Ergebnis der Kollision verwendet werden würde.
Hier ist der Code, den ich bisher habe. Dieser Code ist für eine Kollision zwischen zwei beweglichen Einheiten, aber ich brauche einen Fall für hinzufügen, wenn man sich nicht bewegt:
private static void UpdateEntities(PhysicsEntity a, PhysicsEntity b)
{
var collisionAngle = Math.Atan2(a.Position.Y - b.Position.Y, a.Position.X - b.Position.X);
var angleA = a.Velocity.Direction - collisionAngle;
var angleB = b.Velocity.Direction - collisionAngle;
var vAx = a.Velocity.Magnitude * Math.Cos(angleA);
var vAy = a.Velocity.Magnitude * Math.Sin(angleA);
var vBx = b.Velocity.Magnitude * Math.Cos(angleB);
var vBy = b.Velocity.Magnitude * Math.Sin(angleB);
var vfAx = ((vAx * (a.Mass - b.Mass) + 2 * b.Mass * vBx)/(a.Mass + b.Mass)) * a.Material.Elasticity;
var vfBx = ((vBx * (b.Mass - a.Mass) + 2 * a.Mass * vAx)/(a.Mass + b.Mass)) * b.Material.Elasticity;
var vfAy = vAy * a.Material.Elasticity;
var vfBy = vBy * b.Material.Elasticity;
var magA = Math.Sqrt(Math.Pow(vfAx, 2) + Math.Pow(vfAy, 2));
var magB = Math.Sqrt(Math.Pow(vfBx, 2) + Math.Pow(vfBy, 2));
var dirA = Math.Atan2(vfAy, vfAx) + collisionAngle;
var dirB = Math.Atan2(vfBy, vfBx) + collisionAngle;
a.Velocity.X = magA * Math.Cos(dirA);
a.Velocity.Y = magA * Math.Sin(dirA);
b.Velocity.X = magB * Math.Cos(dirB);
b.Velocity.Y = magB * Math.Sin(dirB);
}
Ich habe versucht, die Geschwindigkeit des unbeweglichen Gegenstand auf das Gegenteil des beweglichen Objekts Geschwindigkeit einstellen, aber das brachte die Dinge dazu, ineinander zu gehen.
Ihr "unbewegliches" Objekt hat einen 'Velocity', die sich ändern können. Ist das etwas wie die Geschwindigkeit, mit der man sich bewegt? – Beta
Ich glaube nicht. Sollte das unbewegliche Objekt nicht die gleiche Kraft in die entgegengesetzte Richtung ausüben? (Ich bin mir nicht ganz sicher, ob Ihre Frage zur Klarstellung war oder wenn Sie mich zur Antwort führen wollen) –
* "Sollte nicht? * Sie haben zwei Entitäten,' a' und 'b'. Welche von ihnen ist unbeweglich, und warum stellst du seine Geschwindigkeit ein? – Beta