Wie kann ich den Impuls in meine Weltraumsimulation einbeziehen?

8

Ich versuche gerade, eine einfache 2D-Physik-Engine zu erstellen, und ich habe einige Probleme, herauszufinden, wie ich den Impuls in die Bewegung eines Raumschiffs integrieren kann.

Wenn ich mich mit einer bestimmten Geschwindigkeit in eine bestimmte Richtung bewege, kann ich die Position meines Schiffes derzeit problemlos aktualisieren (Position + = Richtung * Geschwindigkeit). Wenn sich das Schiff jedoch überhaupt dreht und ich die Richtung (basierend auf dem neuen Winkel, in den das Schiff zeigt) neu berechne und in diese Richtung beschleunige, wie kann ich dann den Impuls berücksichtigen, um die "Linie" zu ändern, auf der das Schiff fährt? Derzeit ändert das Schiff sofort die Richtung und fährt mit seiner aktuellen Geschwindigkeit in diese neue Richtung fort, wenn ich den Schubknopf drücke. Ich möchte, dass es sich um eine langsamere Drehbewegung handelt, um den Eindruck zu erwecken, dass das Schiff selbst eine gewisse Masse hat.

Wenn es zu diesem Thema bereits einen schönen Beitrag gibt, entschuldige ich mich, aber bei meinen Suchanfragen ist nichts aufgetaucht. Lassen Sie mich wissen, wenn weitere Informationen benötigt werden, aber ich hoffe, dass mir jemand leicht sagen kann, wie ich die Geschwindigkeit von Masse * in mein Game-Loop-Update einbringen kann.

Josh Petite
quelle
Wenn Sie mehr über das Programmieren der Bewegung erfahren möchten, sollten Sie sich das kostenlose Spiel Transcendence ansehen, einen weiteren 2D-Weltraum-Shooter, der dies verwendet. Vielleicht können Sie sich die Skripte ansehen oder die Entwickler fragen, wie sie es gemacht haben
Mastersteviekun

Antworten:

7

Es sieht so aus, als hätten Sie Position und Richtung als Vektoren und Geschwindigkeit als Skalar?

Wenn ja, ändern Sie einfach die Geschwindigkeit ebenfalls in einen Vektor und machen Sie dann so etwas:

Force = Direction * Power
Acceleration = Force / Mass
Velocity += Acceleration * ElapsedTime
Position += Velocity * ElapsedTime

Die Richtung ist ein Einheitslängenvektor, der den Kurs Ihres Schiffes angibt. Power ist die Menge an Schub, die Sie hinzufügen möchten (Null, wenn keine Beschleunigung erforderlich ist). ElapsedTime ist die Zeit zwischen Ihren Spiel-Update-Aufrufen, um die Bewegung auch dann reibungslos zu halten, wenn sich Ihre Framerate ändert

Wenn Sie mehr darüber erfahren möchten, können Sie die Euler-Integration nachschlagen

Herr Bell
quelle
1
Ja, und der nächste Schritt besteht darin, das Newtonsche Gesetz F = m * a zu modellieren. Anstatt eine "Leistungs" -Konstante zu verwenden, um die Beschleunigung zu erhalten, verwenden Sie Beschleunigung = Kraft / Masse. Wenn Sie also Schub anwenden, wenden Sie ihn als Kraftvektor an. Auf diese Weise können Sie problemlos andere Kräfte auf Ihr Raumschiff ausüben, indem Sie alle Kraftvektoren addieren und die entsprechende Beschleunigung berechnen. Bedeutet auch, dass Sie mit Mass als separate Variable spielen können.
TerryB
Terry hat recht, ich habe vergessen, das in meinen ursprünglichen Beitrag aufzunehmen.
Herr Bell
Vielen Dank, Herr Bell / Terry. Beide oben aufgeführten Gleichungen haben mir dabei geholfen, dies programmatisch zu tun. Ich hatte große Probleme zu verstehen, wie dies funktionieren würde, wenn ich versuchen würde, überall Schwimmer zu verwenden. Nachdem ich alles außer Masse auf Vektoren umgestellt hatte (dank Leftium oben), konnte ich endlich die Dinge zum Laufen bringen.
Josh Petite
8

Anstatt die Geschwindigkeit direkt zu manipulieren , fügen Sie eine weitere Variable hinzu: Beschleunigung , die die Geschwindigkeit allmählich gleichmäßig ändert :

Aus der klassischen Physik ( Newtons Bewegungsgesetze ):

a =  F/m  // a Force will result in a smaller acceleration on objects with more mass
v += a    // acceleration is the rate of change in velocity
p += v    // velocity is the rate of change in position    

wo:

a = acceleration, v = velocity, p = position
F = force, m = mass

(Anmerkung m ist der einzige Skalarwert; F, a, v und p sind alle 2D- oder 3D-Vektoren)

Es gibt auch zwei Richtungen:

  1. Die Richtung, in die das Schiff zeigt. Kraft von Motoren wird entlang dieses Vektors ausgeübt.
  2. Die Richtung, in die sich das Schiff tatsächlich bewegt (aufgrund des Impulses). Dies ist der Geschwindigkeitsvektor v.

Ich habe eine verwandte Frage zu StackOverflow: 2D-Raumschiff-Bewegungsmathematik beantwortet . Diese Antwort enthält einen Beispielcode.

Leftium
quelle
Beachten Sie, dass bei einer tickbasierten Simulation mit dieser Methode falsche Ergebnisse erzielt werden. Die Basisformeln sind in der kontinuierlichen Welt der Physik korrekt, aber Sie müssen eine numerische Integration durchführen, um genaue Ergebnisse zu erhalten. Weitere Details hier: gafferongames.com/game-physics/integration-basics
Tetrad
Endlich hat das funktioniert. Vielen Dank an alle. Es hat eine Weile gedauert, bis ich herausgefunden habe, wie ich dieses Eingabeereignis zusammen mit meinem Update (und unter Berücksichtigung der Zeitnutzung) analysieren kann.
Josh Petite