Domanda

Sto cercando un modo per aumentare o diminuire la velocità di un movimento circolare senza problemi.

Usando l'equazione parametrica di un cerchio, posso spostare un oggetto in un cerchio nel corso del tempo:

x = center_x + radius * sin(time * speed)
y = center_y + radius * cos(time * speed)

Il problema di questo approccio è che non riesco a fare semplicemente speed = speed + 1 per accelerare l'oggetto perché si traduce in movimento a scatti. Questo ha senso perché i valori xey vengono ricalcolati ogni frame basato su valori assoluti anziché rispetto alla precedente posizione dell'oggetto.

Un altro approccio potrebbe essere quello di utilizzare un vettore che rappresenta la velocità dell'oggetto, quindi applicare un movimento circolare al vettore invece:

v_x = radius * sin(time * speed)
v_y = radius * cos(time * speed)
x = x + v_x
y = y + v_y

Il problema con questo approccio è che se cambio la velocità allora il raggio sarà aumentare o ridurre. Ciò ha senso perché il movimento è relativo alla posizione corrente e quindi il tempo è essenzialmente ignorato se modificare la velocità.

Un'implementazione mi viene in mente che potrebbe funzionare sta usando un vettore che punta dall'oggetto al centro del cerchio. Poi ho potuto calcolare la tangente del cerchio alla posizione dell'oggetto con il vettore perpendicolare, normalizzare e scalata con la velocità. Non ho ancora implementato questo perché sembra eccessivo per un problema come questo, quindi per favore fatemi sapere se esiste una soluzione più semplice. Grazie!

È stato utile?

Soluzione

La velocità è la velocità di variazione dell'angolo, un cambio di velocità influisce solo il cambiamento dell'angolo per l'ultimo intervallo, così:

delta = time - lastTime
angle = angle + delta * speed

x = center_x + radius * sin(angle)
y = center_y + radius * cos(angle)

dove lastTime deve tenere il tempo dell'ultimo ciclo, capito?

Altri suggerimenti

L'hai detto tu: si vuole modificare la velocità angolare . Ora cambiare in velocità angolare, nel mondo reale, è limitato dal inertion angolare di un oggetto. Ciò significa che non può andare 'discreta' a passi di 1.

Piuttosto, la velocità angolare è l'integrale della accelerazione angolare. Angolare posizione è l'integrale della velocità angolare.

Così, per un'accelerazione angolare costante, si può dire

velocità (t) = t * + acc vel [t = 0] .

e

angolo (t) = t 2 * acc / 2 + vel [t = 0] * t + angolo [t = 0] .

Poi si può calcolare la posizione cartesiani con il peccato e cos dell'angolo.

L'accelerazione angolare possono variare (piuttosto) discreto.

Non stai utilizzando l'accelerazione correttamente se si sta semplicemente facendo speed = speed + 1. Più genericamente, si vuole fare questo:

accel = 1;
speed = speed + (accel * timeDelta);

Inoltre, Accel = 1 è piuttosto un grande cambiamento velocità angolare in radianti - provare un valore inferiore, dire PI / 16. Se è necessario l'accelerazione di essere quella grande e vuole ridurre al minimo la visibilità dei movimenti a scatti, si consiglia di provare con alcuni sfocatura di movimento.

Per un liscio aumento della velocità angolare, è necessario aggiungere un'accelerazione angolare

x = raggio * cos (theta)
y = raggio * sin (theta)

theta (t) = theta (0) + omega (0) * t + 0.5 * alfa * t ^ 2

dove t è il tempo, theta (0) è la posizione angolare al tempo 0, omega (0) è la velocità angolare al tempo 0 (sarebbe uguale al parametro velocità) e alfa è il parametro di accelerazione angolare, che scegliere di essere qualcosa di adatto.

con

time * speed

per indicare fino a che punto il cerchio si è percorsa è semplicemente sbagliato. Ha senso solo se la velocità non cambia mai.

Al contrario, è necessario memorizzare la distanza percorsa in una variabile, e quindi aumentare la variabile di un importo a seconda della velocità attuale e l'intervallo di tempo da quando l'ultimo pareggio.

I suggerimenti altri devono utilizzare l'accelerazione sono buoni, troppo. Provare qualcosa di simile

v = v + a;
d = d + delta * v;

x = center_x + radius * sin(d)
y = center_y + radius * cos(d)

È necessario pensare a questo in termini di velocità angolare. Si sta calcolando l'angolo, theta, come il tempo di velocità *, che non ha senso se la velocità è il senso convenzionale di velocità, vale a dire la distanza / tempo. velocità angolare è l'angolo / tempo (cioè, radianti / sec o gradi / sec). velocità convenzionale sarà la distanza tra i punti di inizio e fine / tempo dopo l'applicazione velocità angolare.

x = center_x + radius * sin(time * speed + offset)
y = center_y + radius * cos(time * speed + offset)

def change_speed(new_speed):
    offset = time * (speed - new_speed) + offset
    speed = new_speed

offset può iniziare a 0 o realmente qualsiasi valore ... è utilizzato per mantenere la continuità, come

time * old_speed + old_offset == time * new_speed + new_offset
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top