Czy w ogóle dobrze kombinuję?
Pogubiłem się w Twoich rozważaniach. Chyba nie tylko ja. Rozłóżmy to zagadnienia na czynniki pierwsze, jeśli chodzi o samą fizykę. Po pierwsze mamy następujące dane:
1 m = 50 px
FPS = 60
g = 10 m/s^2
h = 2 m
Pierwsze co trzeba by policzyć to czas takiego skoku. Skok (dokładnie ruch wzdłuż pola grawitacyjnego) jest zjawiskiem symetrycznym (pomijając opór powietrza), tzn. najpierw obiekt ma jakąś prędkość początkową Vp (i to tylko od tej prędkości zależy jak obiekt wysoko się wzniesie), w najwyższym punkcie V = 0, po czym obiekt opada osiągając przy powierzchni Ziemi ponownie Vp. Skoro jest to symetria, to ograniczmy się tylko do sytuacji od wyskoku z V = Vp do osiągnięcia punktu w którym V = 0.
Policzmy więc czas trwania takiego zjawiska. Skorzystajmy ze wzoru na drogę w ruchu jednostajnie przyspieszonym (opóźnionym) oraz z danych wejściowych, przy czym załóżmy s = h:
s = (g * t^2) / 2 => t = sqrt(2 * s / g)
-----------------------------------------
t = sqrt(2 * 2 [m] / 10 [m/s^2]) = 0.63 s
Czyli wznoszenie (jak i opadanie) takiego obiektu powinno trwać 0.63 s, całkowity czas trwania skoku to 1.26 s. Ale wróćmy tylko do połowy skoku, w końcu zjawisko jest symetryczne. Nasz FPS wynosi 60, tak więc aby wyświetlić to zjawisko na ekranie potrzebujemy N klatek:
N = t * FPS
------------------
N = 0.63 * 60 = 38
Jedyne co jeszcze musimy znaleźć, to wysokości na jakich jest obiekt w poszczególnych klatkach. Policzmy prędkość początkową, jaką powinien posiadać obiekt, by wznieść się na te 2 metry. To jest już proste, wystarczy zauważyć że ruch do góry, to to samo co spadek obiektu z przyspieszeniem g w czasie t (tak, tak, symetria). Tak więc obiektowi trzeba nadać prędkość:
Vp = g * t
------------------------------------------------
Vp = 10 [m/s^2] * 0.63 [s] = 6.3 m/s ~ 22.7 km/h
by ten osiągnął żądaną wysokość. Czyli wyrzucamy obiekt nadając mu prędkość Vp, a ponieważ obiekt stara się uciec z pola grawitacyjnego Ziemi, to musimy zastosować wzór na drogę w ruchu jednostajnie opóźnionym:
s = Vp * t - (g * t^2) / 2
OK, ale tutaj czas mamy w sekundach. Wiemy, że powinniśmy wyświetlić N klatek. Musimy znaleźć zależność między sekundami a klatkami, a więc odwrotność FPS:
dt = 1 / FPS
Natomiast drogę chcemy otrzymać w pikselach, nie zaś w metrach, musimy ją przeskalować, by ostatecznie otrzymać:
s[px] = 50*(Vp*(i/FPS) - (g*(i/FPS)^2)/2)
Policzyłem to sobie w Pythonie, by sprawdzić czy się nie pomyliłem w rachunkach, oto output:
Frame: 1 -> Y: 0.000 pix = 0.000 m
Frame: 2 -> Y: 5.191 pix = 0.104 m
Frame: 3 -> Y: 10.242 pix = 0.205 m
Frame: 4 -> Y: 15.154 pix = 0.303 m
Frame: 5 -> Y: 19.926 pix = 0.399 m
Frame: 6 -> Y: 24.559 pix = 0.491 m
Frame: 7 -> Y: 29.053 pix = 0.581 m
Frame: 8 -> Y: 33.407 pix = 0.668 m
Frame: 9 -> Y: 37.622 pix = 0.752 m
Frame: 10 -> Y: 41.697 pix = 0.834 m
Frame: 11 -> Y: 45.633 pix = 0.913 m
Frame: 12 -> Y: 49.429 pix = 0.989 m
Frame: 13 -> Y: 53.086 pix = 1.062 m
Frame: 14 -> Y: 56.603 pix = 1.132 m
Frame: 15 -> Y: 59.981 pix = 1.200 m
Frame: 16 -> Y: 63.220 pix = 1.264 m
Frame: 17 -> Y: 66.319 pix = 1.326 m
Frame: 18 -> Y: 69.279 pix = 1.386 m
Frame: 19 -> Y: 72.099 pix = 1.442 m
Frame: 20 -> Y: 74.780 pix = 1.496 m
Frame: 21 -> Y: 77.321 pix = 1.546 m
Frame: 22 -> Y: 79.723 pix = 1.594 m
Frame: 23 -> Y: 81.985 pix = 1.640 m
Frame: 24 -> Y: 84.108 pix = 1.682 m
Frame: 25 -> Y: 86.092 pix = 1.722 m
Frame: 26 -> Y: 87.936 pix = 1.759 m
Frame: 27 -> Y: 89.641 pix = 1.793 m
Frame: 28 -> Y: 91.206 pix = 1.824 m
Frame: 29 -> Y: 92.632 pix = 1.853 m
Frame: 30 -> Y: 93.918 pix = 1.878 m
Frame: 31 -> Y: 95.065 pix = 1.901 m
Frame: 32 -> Y: 96.072 pix = 1.921 m
Frame: 33 -> Y: 96.940 pix = 1.939 m
Frame: 34 -> Y: 97.669 pix = 1.953 m
Frame: 35 -> Y: 98.258 pix = 1.965 m
Frame: 36 -> Y: 98.707 pix = 1.974 m
Frame: 37 -> Y: 99.018 pix = 1.980 m
Frame: 38 -> Y: 99.188 pix = 1.984 m
Zauważmy, że jest to tylko sam ruch ku górze. Opadanie będzie symetryczne, jeśli chodzi o wartości wysokości.