2012-12-23 21 views
5

Próbuję stopniowo zmniejszać prędkość obiektu za pomocą właściwości "tłumienia". Następnie chcę przesunąć pozycję obiektu za pomocą prędkości. Wygląda to mniej więcej tak:Szybkość tłumienia z deltaTime?

velocity.x *= velocity.damping; 
velocity.y *= velocity.damping; 
x += velocity.x; 
y += velocity.y; 

nie mogły być znacznie prostsze niż i to działa dobrze, ale tutaj jest mój problem: Używam zmienną deltaTime, który zawiera ilość czasu (w sekundach) , że trwała ostatnia aktualizacja mojej pętli gier. Stosując prędkość jest dość prosta:

x += velocity.x * deltaTime; 
y += velocity.y * deltaTime; 

Ale jak mogę odpowiadać za deltaTime kiedy pomnożyć właściwość tłumienia? Moim pomysłem było, aby znaleźć przemieszczenie w X lub Y i pomnożyć deltaTime się, że podobnie jak to:

velocity.x += (velocity.x * velocity.damping - velocity.x) * deltaTime; 
velocity.y += (velocity.y * velocity.damping - velocity.y) * deltaTime; 

Okazuje się, że nie działa. Naprawdę nie rozumiem dlaczego, ale wyniki są różne, gdy testuję. Jeśli po prostu zignoruję tłumienie lub ustawię na 1.0, wszystko działa, więc problem musi być w dwóch ostatnich liniach.

+0

Dlaczego odejmujesz prędkość w ostatnim segmencie kodu? – Matthias

+0

(velocity.x * velocity.damping) to nowa prędkość.x. Odejmuję od tego oryginalną prędkość. X, aby uzyskać różnicę. – user1925315

Odpowiedz

8
velocity.x += (velocity.x * velocity.damping - velocity.x) * deltaTime; 

Oznacza to, że masz stałe przyspieszenie, a nie tłumienie.

velocity.x * (1 - velocity.damping) 

to ilość, o którą zmniejszasz prędkość od aktualnej wartości w jednostce czasu. Jest proporcjonalna do aktualnej prędkości, więc w następnym urządzeniu czasowym można zmniejszyć prędkość o mniejszą wartość, stosując współczynnik tłumienia. Ale pomnażając z deltaTime, odejmiesz tę samą kwotę, obliczoną na podstawie wartości początkowej we wszystkich jednostkach czasu deltaTime.

Załóżmy, że współczynnik tłumienia wynosi 0.9, więc zmniejszasz prędkość o jedną dziesiątą w każdej jednostce czasu. Jeśli użyjesz liniowej formuły (mnożąc z deltaTime), po 10 jednostkach czasu twoja prędkość wyniesie 0, a po 11 zmieni kierunek. Jeśli pójdziesz stopniowo, zaczynając od początkowej prędkości v_0 = 1, można dostać

v_1 = v_0*0.9 = 0.9 
v_2 = v_1*0.9 = 0.81 
v_3 = v_2*0.9 = 0.729 
v_4 = v_3*0.9 = 0.6561 

itd wolniejszy spadek prędkości. Jeśli rozwijać formułę v_4, masz

v_4 = v_3*0.9 = v_2*0.9*0.9 = v_1*0.9*0.9*0.9 = v_0*0.9*0.9*0.9*0.9 = v_0 * 0.9^4 

tak uogólniając, można zauważyć, że formuła powinna być

velocity.x *= Math.pow(velocity.damping, deltaTime); 

(Zakładając Action Script nie różni się od ECMA Script w jaki tej funkcji nazywa się.)

Oczywiście dla velocity.y.

+1

Dzięki za wyjaśnienie. Ma doskonały sens! :) – user1925315

Powiązane problemy