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:
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:
- 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.
Da die andere ausgezeichnete Antwort etwas theoretisch erscheint, ist hier die einfache Codeversion:
quelle
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.
quelle