Come posso considerare lo slancio nella mia simulazione spaziale?


8

Sto provando a creare un semplice motore fisico 2D in questo momento e sto incontrando alcuni problemi per capire come incorporare lo slancio nel movimento di un'astronave.

Se mi muovo in una determinata direzione a una determinata velocità, sono in grado di aggiornare facilmente la posizione della mia nave (Posizione + = Direzione * Velocità). Tuttavia, se la nave ruota affatto e io ricalcolo la direzione (in base al nuovo angolo verso cui la nave è rivolta), e accelero in quella direzione, come posso prendere in considerazione lo slancio per modificare la "linea" che la nave percorre? Attualmente la nave cambia istantaneamente direzione e continua alla sua velocità attuale in quella nuova direzione quando premo il pulsante di spinta. Voglio che sia un movimento di virata più graduale in modo da dare l'impressione che la nave stessa abbia una certa massa.

Se c'è già un bel post su questo argomento, mi scuso, ma nelle mie ricerche non è emerso nulla. Fammi sapere se sono necessarie ulteriori informazioni, ma spero che qualcuno possa facilmente dirmi come posso lanciare la velocità di massa * nell'aggiornamento del mio ciclo di gioco.


Se stai cercando qualcosa di più su come programmare il movimento, potresti voler guardare il gioco gratuito Trascendenza, un altro sparatutto spaziale 2D che lo usa. Forse puoi guardare i suoi script o chiedere agli sviluppatori come hanno fatto
Mastersteviekun,

Risposte:


7

Sembra che tu abbia la Posizione e la Direzione come vettori e la Velocità come uno scalare?

Se è così, cambia anche Velocity in un vettore e poi fai qualcosa del genere:

Force = Direction * Power
Acceleration = Force / Mass
Velocity += Acceleration * ElapsedTime
Position += Velocity * ElapsedTime

La direzione è un vettore di lunghezza unitaria che indica l'intestazione della tua nave. La potenza è la quantità di spinta che vuoi aggiungere (zero quando non è necessaria alcuna accelerazione) ElapsedTime è il tempo tra il gioco Aggiorna le chiamate per mantenere il movimento regolare anche quando il tuo framerate sta cambiando

Se vuoi saperne di più puoi cercare Euler Integration


1
Sì e il prossimo passo è modellare la legge di Newton F = m * a. Quindi, invece di usare una costante "Potenza" per ottenere l'accelerazione, usi Accelerazione = Forza / massa. Quindi quando si applica la spinta, la si applica come un vettore di forza. In questo modo potrai applicare facilmente altre forze sulla tua astronave sommando tutti i vettori di forza e calcolando l'accelerazione corrispondente. Inoltre, puoi giocare con la massa come variabile separata.
TerryB,

Terry ha ragione, ho dimenticato di includerlo nel mio post originale.
Mr Bell,

Grazie signor Bell / Terry. Entrambe le equazioni sopra elencate mi hanno aiutato a farlo programmaticamente. Avevo molti problemi a capire come avrebbe funzionato cercando di usare i galleggianti dappertutto. Dopo aver cambiato tutto tranne la massa in vettori (grazie al leftium sopra), sono stato finalmente in grado di far funzionare le cose.
Josh Petite,

8

Invece di manipolare direttamente la velocità , aggiungi un'altra variabile: l' accelerazione , che gradualmente, gradualmente altera la velocità :

Dalla fisica classica ( leggi del moto di Newton ):

a =  F/m  // a Force will result in a smaller acceleration on objects with more mass
v += a    // acceleration is the rate of change in velocity
p += v    // velocity is the rate of change in position    

dove:

a = acceleration, v = velocity, p = position
F = force, m = mass

(Nota m è l'unico valore scalare; F, a, v e p sono tutti vettori 2D o 3D)

Inoltre, ci sono in realtà due direzioni:

  1. La direzione verso cui è rivolta la nave. La forza dei motori viene applicata lungo questo vettore.
  2. La direzione in cui la nave si sta effettivamente muovendo (a causa della quantità di moto). Questo è il vettore di velocità v.

Ho risposto a una domanda correlata su StackOverflow: matematica dei movimenti della navicella spaziale 2D . C'è del codice di esempio in quella risposta.


Si noti che in una simulazione basata su tick utilizzando quel metodo si otterranno risultati errati. Le formule di base sono corrette nel continuo mondo della fisica, ma dovrai ottenere un'integrazione numerica per ottenere risultati accurati. Maggiori dettagli qui: gafferongames.com/game-physics/integration-basics
Tetrade

Finalmente ha funzionato. Grazie mille a tutti. Ci è voluto un po 'di tempo per capire come analizzare questo evento di input in modo saggio insieme al mio aggiornamento (oltre a incorporare l'utilizzo del tempo).
Josh Petite,
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.