Come calcolare la velocità di caduta e di accelerazione?


9

Sto pensando di creare un gioco lander, in cui controlli un'astronave e devi atterrare senza schiantarti. Qual è una semplice formula per calcolare la velocità di caduta o di accelerazione rispetto all'orario di lavoro ai motori a tempo?

Risposte:


28

Il modo più semplice è l'integrazione di Eulero. Devi memorizzare il vettore di posizione e il vettore di velocità. Ad ogni fotogramma:

  • misurare il tempo trascorso dall'ultimo passaggio di integrazione: dt
  • calcola la forza vecor dovuta ai tuoi motori: F
  • calcolare il vettore di accelerazione: A = F / m dove m è la massa dell'astronave.
  • aggiungi il vettore di gravità: A = A + G assicurati che G punti verso il centro del pianeta
  • aggiorna il vettore di velocità V = V + A · dt
  • aggiorna il vettore di posizione X = X + V · dt

( 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 è:

Legge di gravitazione universale di Newton

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:

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:

  • Una biblioteca vettoriale
  • Modello del motore
  • Modello fisico
  • Rilevazione di collisioni
  • Interfaccia utente (input e rendering grafico)

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:

  • un'entità di archiviazione vettoriale (un elenco di n numeri in virgola mobile per ogni vettore)
  • un operatore somma (somma componente per componente)
  • un operatore di moltiplicazione scalare (ogni componente moltiplicato per un float)
  • una moltiplicazione di punti tra vettori (moltiplica componente per componente e riassumi tutto)
  • la lunghezza del vettore (radice quadrata di un punto vettore mutiplicato da solo)

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:

  • un vettore che indica la sua forza e direzione di spinta
  • uno scalare che indica il consumo di carburante al secondo a piena potenza;

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.


È fantastico, ma alcune idee su come impostarlo nel codice sarebbero fantastiche.
Dvole,

1
dove ho imparato la fisica shiffman.net/teaching/nature
Ming-Tang

Questo ragazzo conosce la sua fisica!
MGZero,

7

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!
        }
    }
}

2
Mantenerlo semplice. Mi aspetto che questo sia in linea con quello che stava cercando.
Beska,

2

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.


L'esaurimento del carburante rappresenta solo un parametro in calo. È semplicemente una forza vettoriale con valore decrescente. Ho sbagliato? In un semplice caso hai G contro F, dove F è il motore del razzo e G la gravità terrestre: in questo caso devi semplicemente misurare entrambi l'uno contro l'altro, quindi se non rimane carburante F scende a 0, quindi solo tu devi applicare G come forza vettoriale al tuo oggetto. Funziona per ogni valore di F. Finché F> = G l'oggetto "dovrebbe" spostarsi in direzione di F.
daemonfire300

2
@ daemonfire300: fraintendete - non sto parlando dell'effetto di rimanere senza carburante, ma dell'effetto di bruciare carburante. Un'impostazione dell'acceleratore costante sul motore produce una cifra di accelerazione in costante aumento, un'accelerazione costante produce una velocità di combustione del carburante in costante calo. Ciò significa che i semplici calcoli forniti da FxIII produrranno numeri di consumo di carburante errati.
Loren Pechtel,

La quantità di accelerazione ottenuta da A = F / M quando il carburante viene bruciato sarà un valore trascurabile a meno che la proporzione della massa di carburante rispetto al veicolo sia assurdamente alta o che la velocità di combustione del carburante sia altrettanto elevata. Questo è un gioco, dopo tutto.
Patrick Hughes,

@Patrick Hughes: la quantità di carburante trasportata da qualsiasi vero lander missilistico (non sto contando i casi di ibrido di freno ad aria / razzo Mars) è una parte sostanziale del suo peso totale. Supponendo il carburante: il rapporto di accelerazione da fissare produrrà una risposta molto sbagliata.
Loren Pechtel,

1
Questa non è una risposta alla domanda, ma solo un commento sulla risposta di @ FxIII.
Jonathan Connell,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.