Wie berechnet man die Fall- und Beschleunigungsgeschwindigkeit?


9

Ich denke an ein Landerspiel, bei dem du ein Raumschiff kontrollierst und es landen musst, ohne abzustürzen. Was ist eine einfache Formel zur Berechnung der Fall- oder Beschleunigungsgeschwindigkeit in Bezug auf die Arbeitszeit von Zeit zu Zeit für Motoren?

Antworten:


28

Der einfachste Weg ist die Euler-Integration. Sie müssen den Positionsvektor und den Geschwindigkeitsvektor speichern. Bei jedem Frame:

  • Messen Sie die seit dem letzten Integrationsschritt verstrichene Zeit: dt
  • Berechnen Sie die Kraft, die Ihren Motoren zusteht: F.
  • Berechnen Sie den Beschleunigungsvektor: A = F / m wobei m die Raumschiffmasse ist.
  • Addiere den Schwerkraftvektor: A = A + G stelle sicher, dass G zum Zentrum des Planeten zeigt
  • Aktualisieren Sie den Geschwindigkeitsvektor V = V + A · dt
  • Aktualisieren Sie den Positionsvektor X = X + V · dt

( x für Skalare, X für Vektoren)

Stellen Sie sicher, dass dt klein ist ...

| G | beträgt ungefähr 9,8 m / s² für die Erde und ungefähr 1,6 m / s² für den Mond

Im Allgemeinen beträgt die Aktraktionskraft aufgrund der Gravitalwechselwirkung:

Newtons Gesetz der universellen Gravitation

Es betrifft jeden Körper und zeigt auf den anderen.

Der G- Skalar ist die sehr bekannte Gravitationskonstante und beträgt etwa 6,67e-011 N (m / kg) ²

Da Sie an Beschleunigung interessiert sind:

Beschleunigung

Sie müssen nur die Masse (m2) und den Radius (r) des Planeten kennen, um Ihre Beschleunigung zu berechnen.

Normalerweise ist die Beschleunigung, die den Planeten in Richtung Ihres Raumschiffs bewegt, vernachlässigbar, da m1 im Vergleich zu m2 normalerweise vernachlässigbar ist.

Wenn Sie jedoch versuchen, auf einem kleinen Asteroiden zu landen, müssen Sie wahrscheinlich die allgemeine Formel verwenden, um diese Kraft im zweiten Schritt zum Gesamtkraftvektor hinzuzufügen.

BEARBEITEN:

Bei Bedarf einige Hinweise zur Implementierung. Du wirst brauchen:

  • Eine Vektorbibliothek
  • Motormodell
  • Phisics-Modell
  • Kollisionserkennung
  • Benutzeroberfläche (Eingabe und grafische Darstellung)

Zuallererst die Vektorbibliothek: Ihr Spiel kann mono / bi / tree / four ... dimentional sein, soweit Sie Ihren Fall als Projektion eines 3D-Wortes betrachten, halten die physischen Roules.

Wenn n die von Ihnen gewählte Dimension ist (in Ihrem Fall wahrscheinlich 2 oder 3), muss die Bibliothek Folgendes haben:

  • eine Vektorspeicherentität (eine Liste von n Gleitkommazahlen für jeden Vektor)
  • ein Summenoperator (Summenkomponente für Komponente)
  • ein skalarer Multiplikationsoperator (jede Komponente multipliziert mit einem Float)
  • eine Punktmultiplikation zwischen Vektoren (Komponente für Komponente multiplizieren und alle zusammenfassen)
  • die Vektorlänge (Quadratwurzel eines Vektors Punkt-multipliziert mit sich selbst)

Sie können eine Bibliothek verwenden, die dies tut, oder eine selbst implementieren. Ein Vektor kann eine Struktur oder eine Klasse sein. Sie haben die Wahl.

Jeder Motor sollte beschrieben werden durch:

  • ein Vektor, der seine Schubstärke und -richtung angibt
  • ein Skalar, der den Kraftstoffverbrauch pro Sekunde bei voller Leistung angibt;

Ihre Benutzereingabe wird verwendet, um jedem Motor eine Zahl zu geben, die zwischen 0 (nicht verwendeter Motor) und 1 (volle Leistung) liegt: dem Motorfaktor (Verbrauchsfaktor).

Multiplizieren Sie den Motorfaktor mit seinem Schubvektor, um das echte Vertrauen des Motors zu erhalten und alle Ergebnisse aller verfügbaren Motoren zusammenzufassen. Dies gibt Ihnen das F des zweiten Schritts.

Ihr Motorfaktor kann verwendet werden, um den tatsächlichen Kraftstoffverbrauch für jeden Motor zu ermitteln: Multiplizieren Sie den Motorfaktor mit dem Kraftstoffverbrauch und mit dt , um den momentanen Kraftstoffverbrauch zu ermitteln. Sie können diesen Wert von der Variablen für die Gesamtkraftstoffkapazität abziehen (dies gibt Ihnen die Möglichkeit, Ihre Gesamtmasse m zu aktualisieren, wenn die Kraftstoffmasse beträchtlich ist).

Jetzt können Sie die Integration verwenden, um die neue Position zu berechnen und die Kollision mit Ihrer Planetenoberfläche zu überprüfen. Verwenden Sie gegebenenfalls die Länge des Geschwindigkeitsvektors, um anzugeben, ob die Landung erfolgreich oder katastrophal war.

Offensichtlich können / sollten andere Kollisionsprüfungen durchgeführt werden. Einige Oberflächeneinheiten können nicht als Landepunkt zugelassen werden, sodass jede Kollision tödlich ist.

Ich überlasse es Ihnen, wie Sie Input erhalten und wie Sie Ihr Raumschiff rendern können. Mit dem Motorfaktor können Sie beispielsweise den Motorstatus Frame für Frame rendern.


Das ist großartig, aber einige Ideen, wie man es in Code einbindet, wären großartig.
Dvole

1
wo ich Physik gelernt habe shiffman.net/teaching/nature
Ming-Tang

Dieser Typ kennt seine Physik!
MGZero

7

Da die andere ausgezeichnete Antwort etwas theoretisch erscheint, ist hier die einfache Codeversion:

// Position of the lander:
var positionX =  100.0;
var positionY = 100.0;

// Velocity of lander
var velocityX = 0.0;
var velocityY = 0.0;

// Acceleration due to gravity
var gravity = 1.0;

// If the player is pressing the thrust buttons
var isThrusting = false;
var isThrustingLeft = false;
var isThrustingRight = false;

// Thrust acceleration
var thrust = -2.0;

// Vertical position of the ground
var groundY = 200.0;

// Maximum landing velocity
var maxLandingVelocity = 3.00;    

onUpdate()
{
    velocityY += gravity;

    positionX += velocityX;
    positionY += velocityY;

    if (isThrusting)
    {
        velocityY += thrust;
    }

    if (isThrustingLeft)
    {
        velocityX += thrust;
    }
    else if (isThrustingRight)
    {
        velocityX -= thrust;
    }

    if (positionY >= floorY)
    {
        if (velocityY > maxLandingVelocity)
        {
            // crashed!
        }
        else
        {
            // landed successfully!
        }
    }
}

2
Einfach halten. Ich gehe davon aus, dass dies in etwa dem entspricht, wonach er gesucht hat.
Beska

2

Leider wird die Mathematik hier haarig. Die Antwort von FxIII ist in Ordnung für den allgemeinen Fall eines fallenden Objekts, aber Sie sprechen von einer Rakete - und Raketen verbrennen Treibstoff.

Ich habe Code gesehen, der das macht, aber er war völlig undokumentiert und ich habe es nie geschafft, die Mathematik dahinter herauszufinden. Wenn Sie nicht irgendwie CPU-begrenzt sind, würde ich mich nicht darum kümmern und es einfach brutal erzwingen - der FxIII-Ansatz wird in einem relativ kurzen Zeitraum angewendet und der Schub (oder der Kraftstoffverbrauch) angepasst, wenn Sie die Raketendrosseln zurücknehmen, während der Kraftstoff abbrennt, um aufrechtzuerhalten die angegebene Beschleunigung anstelle des angegebenen Schubes) zwischen jeder Iteration, wenn die Rakete Kraftstoff verbrennt.


Das Auslaufen des Kraftstoffs ist nur ein fallender Parameter. Es ist einfach eine Vektorkraft mit abnehmendem Wert. Liege ich falsch? In einem einfachen Fall haben Sie G gegen F, wobei F der Motor der Rakete und G die Erdanziehungskraft ist: In diesem Fall müssen Sie einfach beide gegeneinander messen. Wenn also kein Kraftstoff mehr übrig ist, fällt F auf 0, also nur Sie müssen G als Vektorkraft auf Ihr Objekt anwenden. Funktioniert für jeden Wert von F. Solange F> = G ist, sollte sich das Objekt in Richtung von F bewegen.
daemonfire300

2
@ daemonfire300: Du missverstehst - ich spreche nicht über den Effekt, dass der Kraftstoff ausgeht, sondern über den Effekt, Kraftstoff zu verbrennen. Eine konstante Gaseinstellung Ihres Motors führt zu einer kontinuierlich steigenden Beschleunigungszahl, eine konstante Beschleunigung zu einer kontinuierlich sinkenden Kraftstoffverbrennungsrate. Dies bedeutet, dass die einfachen Berechnungen, die FxIII liefert, zu falschen Kraftstoffverbrauchszahlen führen.
Loren Pechtel

Der Betrag des Beschleunigungsgewinns von A = F / M beim Verbrennen von Kraftstoff wird ein vernachlässigbarer Wert sein, es sei denn, entweder ist das Verhältnis der Kraftstoffmasse zum Fahrzeug absurd hoch oder die Kraftstoffverbrennungsrate ist ähnlich hoch. Immerhin ist dies ein Spiel.
Patrick Hughes

@Patrick Hughes: Die Menge an Treibstoff, die von einem echten Raketenlander transportiert wird (ich zähle nicht die Mars-Aerobrake / Rocket-Hybrid-Fälle), macht einen wesentlichen Teil seines Gesamtgewichts aus. Unter der Annahme, dass das Verhältnis Kraftstoff: Beschleunigung festgelegt wird, ergibt sich eine sehr falsche Antwort.
Loren Pechtel

1
Dies ist keine Antwort auf die Frage, sondern nur ein Kommentar zur Antwort von @ FxIII.
Jonathan Connell
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.