Antworten:
Der einfachste Weg ist die Euler-Integration. Sie müssen den Positionsvektor und den Geschwindigkeitsvektor speichern. Bei jedem Frame:
( 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:
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:
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:
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:
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:
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.
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!
}
}
}
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.