Risposte:
Il modo più semplice è l'integrazione di Eulero. Devi memorizzare il vettore di posizione e il vettore di velocità. Ad ogni fotogramma:
( x per scalari, X per vettori)
assicurati che dt sia piccolo ...
| G | è circa 9,8 m / s² per la terra e circa 1,6 m / s² per la luna
in generale la Forza di attrazione dovuta all'interazione gravitale è:
Colpisce ogni corpo e punta verso l'altro.
Lo scalare G è la famosissima costante gravitazionale , è di circa 6,67e-011 N (m / Kg) ²
Dal momento che sei interessato all'accelerazione:
Devi solo conoscere la massa del pianeta (m2) e il raggio (r) per calcolare la tua accelerazione.
In genere l'accelerazione che sposta il pianeta verso l'astronave è trascurabile perché di solito m1 è trascurabile rispetto a m2.
Tuttavia, se stai cercando di atterrare su un piccolo asteroide, probabilmente dovrai usare la formula generale aggiungendo quella forza al vettore di forza totale nel secondo passaggio.
MODIFICARE:
Come richiesto qualche suggerimento per l'implementazione. Avrai bisogno:
Prima di tutto la libreria vettoriale: il tuo gioco può essere mono / bi / albero / quattro ... dimensionale, per quanto tu consideri il tuo caso come una proiezione di una parola 3D, sostengono le regole fisiche.
Se n è la dimensione scelta (probabilmente 2 o 3 nel tuo caso), la libreria deve avere:
Puoi usare una libreria che lo fa o implementarne uno da solo; un vettore può essere una struttura o una classe, la scelta è tua.
Ogni motore dovrebbe essere descritto da:
l'input dell'utente verrà utilizzato per fornire a ciascun motore un numero compreso tra 0 (motore non utilizzato) e 1 (potenza massima): il fattore motore (utilizzo).
Moltiplicare il fattore motore per il suo vettore di spinta per ottenere la vera fiducia del motore e riassumere tutti i risultati di tutti i motori disponibili; questo ti darà la F del secondo passo.
Il fattore motore può essere utilizzato per conoscere il reale consumo di carburante per ciascun motore: moltiplicare il fattore motore per il consumo di carburante e per dt per conoscere il consumo istantaneo di carburante; puoi sottrarre questo valore dalla variabile della capacità totale di carburante (questo ti dà l'opportunità di aggiornare la tua massa totale m se la massa del carburante è considerevole).
Ora puoi procedere utilizzando l'integrazione per calcolare la nuova posizione, verificare la collisione con la superficie del tuo pianeta; se presente, usa la lunghezza del vettore di velocità per dire se l'atterraggio è stato un successo o un disastro.
Ovviamente possono essere / dovrebbero essere effettuati altri controlli di collisione, alcune entità di superficie non possono essere autorizzate come punto di atterraggio, quindi ogni collisione è fatale.
Lascio come ricevere input e come renderti la tua astronave; ad esempio, è possibile utilizzare il fattore motore per visualizzare lo stato del motore fotogramma per fotogramma.
Poiché l'altra eccellente risposta sembra un po 'teorica, ecco la semplice versione del codice:
// 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!
}
}
}
Sfortunatamente, la matematica qui diventa pelosa. La risposta di FxIII va bene per il caso generale di un oggetto che cade ma stai parlando di un razzo - e i razzi bruciano carburante.
Ho visto il codice che lo fa, ma era completamente privo di documenti e non sono mai riuscito a capire la matematica dietro di esso. A meno che tu non sia limitato in qualche modo dalla CPU, non mi preoccuperei e non lo forzerei semplicemente - l'approccio FxIII applicato su una scala di tempo piuttosto breve e regola la spinta (o l'uso di carburante se si calcola il motore a razzo mentre il carburante si brucia per mantenere l'accelerazione specificata anziché la spinta specificata) tra ciascuna iterazione mentre il razzo brucia carburante.