Determinare la posizione di un oggetto lungo una curva nel tempo


8

Ho alcuni oggetti nel mio gioco che vengono "lanciati". Al momento sto cercando di implementarlo facendo seguire a questi oggetti una curva parabolica. Conosco il punto iniziale, il punto finale, il vertice e la velocità dell'oggetto.

  1. Come posso determinare in qualsiasi momento o frame quali sono le coordinate x & y?
  2. Una curva parabolica è anche la curva giusta da usare?

I tuoi input sono ambigui. Presumo che vertice significhi la posizione di partenza. E il punto finale indica la posizione finale. Cosa significa velocità? Quanto lontano può viaggiare l'oggetto in un secondo? La velocità è quanto tempo dovrebbe impiegare l'oggetto per arrivare dall'inizio alla fine?
deft_code

Ci scusiamo per non essere chiaro. Proverò a renderlo semplice: vorrei far muovere una palla da un lato dello schermo (x = 0) all'altro lato (x = 480), iniziando da y = 0 e raggiungendo un massimo di y = 320 (a metà strada, x = 240). Voglio che lo faccia per oltre 2 secondi. Da queste informazioni, posso determinare da una formula le mie coordinate xey per ciascun fotogramma?
Ben Williams,

Risposte:


4

Cosa stai cercando un diagramma parametrico della funzione parabolica. È più semplice fare in modo che la funzione parametrica usi un intervallo di p ∈ [0,1].

La forma canonica per una parabola parametrica è

k: = una costante
f_x (p) = 2kp
f_y (p) = kp²

Usando questa formula e qualche algebra di base per il morphing delle funzioni e ho ottenuto

p ∈ [0,1] → x, y ∈ [0,1]
o in altre parole mantenere p tra 0 e 1 e x, y sarà anche tra 0 e 1.
x = p
y = 4p - 4p²

Quindi per ottenere queste funzioni produrrà i numeri che stai cercando.

float total_time = 2;
float x_min = 0;
float x_max = 480;
float y_min = 0;
float y_max = 320;

float f_x( float time )
{
   float p = time/total_time;
   return x_min + (x_max-x_min)*p;
}

float f_y( float time )
{
   float p = time/total_time;
   return y_min + (y_max-y_min)*(4*p-4*p*p);
}

la tua notazione è un po 'confusa. il tuo f_xusa l' f_yaccelerazione acome metà velocità? Dovresti farlo x(t) = x0 + vx0*tey(t) = y0 + vy0*t + .5*ay*t*t
Tobias Kienzler il

Non ho intenzionalmente usato le formule di movimento di Eulero. aed terano solo nomi scelti male. Dovresti notare che non c'è un componente di velocità nelle formule. Il movimento di Eulero e le parabole parametriche non sono la stessa cosa, ma sono molto simili poiché il volo balistico traccia un percorso parabolico.
deft_code,

4

Trovare l'equazione di una curva su cui vuoi spostare il tuo oggetto è un modo per realizzare ciò che vuoi, ma probabilmente non è il migliore.

Invece, di solito si tiene traccia delle proprietà locali di un oggetto (velocità, accelerazione) e quindi si utilizzano questi valori per aggiornare la posizione dell'oggetto in ogni fotogramma.

Da quando hai citato una parabola, suppongo che stai lanciando una palla in 2D e vuoi che cada lungo l'asse y. Quindi, il tuo oggetto ha un'accelerazione costante nella direzione y (chiamiamola così g) e nessuna accelerazione nella direzione x. Quando l'oggetto viene lanciato gli viene data una certa velocità, chiamiamolo vxe vy.

Quindi, ogni fotogramma dell'applicazione aggiungerebbe l'accelerazione dell'oggetto alla sua velocità, quindi aggiungere la velocità alla sua posizione. Qualcosa di simile a:

vy += g;
x += vx;
y += vy;

Fai questo ogni frame e la tua palla inizierà a muoversi. C'è molto altro da sapere su questo, ma è un inizio.


Sto lanciando una palla in 2D, ma la palla ha un'accelerazione nella direzione x. Voglio che venga lanciato da un lato dello schermo all'altro (vedi commento sulla domanda originale). Capisco come aggiornare basato su VX e VY, ma non sono sicuro su come aggiornare quei valori stessi.
Ben Williams,

2
@Ben Williams Devi solo impostare il vx e il vy all'inizio. E aggiungi gravità al vy ogni fotogramma. Potresti anche avere un attrito moltiplicando sia la VX che la Vy per un numero inferiore a 1 (qualcosa come 0,95 potrebbe funzionare a seconda della frequenza dei fotogrammi). Cerca su Google "palla che rimbalza YourProgrammingLanguageHere" e probabilmente otterrai alcuni tutorial di base, ma utili.
Attaccando

3
In realtà, se sai che il tuo oggetto sta seguendo una traiettoria parabolica, è molto, molto meglio implementarlo come una funzione curva, piuttosto che passi fisici discreti. Sì, inizialmente può essere "più difficile" codificare, ma il vantaggio è che il movimento del tuo oggetto viene disaccoppiato da problemi di frame rate.
Blair Holloway,

1
In secondo luogo, @Blair, a meno che non si separi il framerate fisico dal framerate video, ciò potrebbe causare effetti orribili come errori di clipping
Tobias Kienzler,


0

Nei giochi per console utilizziamo spesso l' interpolazione bicubica per risolvere questo problema. Innanzitutto, campiona la posizione di un oggetto a intervalli regolari di tempo t. Per un proiettile, aggiungere l'accelerazione gravitazionale [0, dy / dt / dt] alla sua velocità [dx / dt, dy / dt] ad ogni intervallo. Registra tutte le coordinate [x, y] così generate in un array.

Successivamente, per ricostruire la posizione dell'oggetto [x, y] per una data t, leggi i quattro campioni più vicini a quella t dal buffer che hai registrato: [t-1, t, t + 1, t + 2]. Miscela i quattro campioni in base ai coefficienti nell'articolo di Wikipedia collegato per ottenere un movimento fluido nello spazio.

Questo non è fisicamente accurato come eseguire calcoli di fisica al volo, ma consente la licenza artistica e l'economia di scala per assistere la simulazione.

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.