Autor Wątek: Policzenie trajektori dla kuli  (Przeczytany 1847 razy)

Offline skmskm

  • Użytkownik

# Maj 26, 2013, 12:16:47
Musze policzyć współrzędne celu do gry...
Na razie doszedłem do tego:
Mam czas lotu pocisku (odległość do celu * 2s ).
X - odległość od celu
P - Współrzędne celu
D - Współrzędne strzelca.
V - Wektor kierunkowy znormalizowany od celu(kierunek poruszania się celu).
S - Prędkość celu.
T - czas lotu pocisku

T = X*2

I potrzebuje X i T

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline koirat

  • Użytkownik

# Maj 26, 2013, 12:46:08
Co to jest za wzór to T = X*2 ?  czas równa się dwa razy odległość ?

To co napisałeś jest troszku bezużyteczne, po co podajesz jakieś stałe, czas lotu pocisku to u ciebie zawsze 2 sekundy ?

Powiedz mi czy chcesz coś takiego:

Masz ciało A znajdujące się w pozycji Pa i poruszające się z prędkością opisaną za pomocą wektora Va.
Masz ciało B (pocisk) znajdujące się w pozycji Pb i poruszające się z prędkością M (nie znamy jeszcze kierunku, dlatego skalar).

Teraz chcemy znaleźć kierunek Vb ciała B dla którego ciało A zostanie przez niego trafione.

Tak ?


Offline skmskm

  • Użytkownik

# Maj 26, 2013, 12:50:14
Czas lotu to odległość razy 2 sekundy.(nie wiem czemu ale kula trafia wtedy w sam środek)
tak tylko wolał bym współrzędne celu(jednostka sama namierzy taki punkt)
« Ostatnia zmiana: Maj 26, 2013, 12:52:06 wysłana przez skmskm »

Offline Xirdus

  • Redaktor

# Maj 26, 2013, 13:01:18
Odległość od strzelca do celu liczysz z Pitagorasa - sumujesz kwadraty różnic poszczególnych współrzędnych i pierwiastkujesz - czyli: X=sqrt((Px-Dx)^2+(Py-Dy)^2+(Pz-Dz)^2).


A jeśli celność zależy od czasu lotu, to masz coś baaaardzo nie tak.

Offline skmskm

  • Użytkownik

# Maj 26, 2013, 13:03:10
Ale zanim pocisk doleci do celu już go tam nie będzie :D

Offline Xirdus

  • Redaktor

# Maj 26, 2013, 13:08:15
Znaczy się, ty chcesz gołębia pocisk samonaprowadzający?

Offline skmskm

  • Użytkownik

# Maj 26, 2013, 13:10:59
nie po prostu potrzebuje zwiększyć celność w grze(mają zawsze trafiać w ruchome cele)
Tyle mam aktualnie:
a=((P.x+V.x*S*2X)-D.x)
b=((P.y+V.y*S*2X)-D.y)

pierwiastek{a*a+b*b} = X

Rozłożyłem równanie do:
a*a+b*b=X^2
P.x^2 -2P.x*D.x-D.x^2-2P.x*V.x*S*X+4D.x*V.x*S*X+(V.x*S*2X)^2 +
P.y^2 -2P.y*D.y-D.y^2-2P.y*V.y*S*X+4D.y*V.y*S*X+(V.y*S*2X)^2 =X^2

P.x^2 -2P.x*D.x-D.x^2+P.y^2 -2P.y*D.y-D.y^2=X^2-(2V.x*S*X)^2 -(2V.y*S*X)^2-4D.y*V.y*S*X

P.x^2 -2P.x*D.x-D.x^2+P.y^2 -2P.y*D.y-D.y^2=(1-(V.x*S)^2 - (V.y*S)^2)4X^2-4D.y*V.y*S*X
Poprawka
« Ostatnia zmiana: Maj 26, 2013, 15:29:43 wysłana przez skmskm »

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

  • +7
# Maj 26, 2013, 16:23:57
Załóżmy że strzelec jest w punkcie 0, a X0 to pozycja startowa celu poruszającego się z prędkością S.

Cel w chwili t ma więc pozycję:
X = X0 + t*S

Pocisk wychodzi z punktu zero z wektorem prędkości V. Jego pozycja w chwili t to:
P = t*V

Prędkość pocisku jest zadaną (tylko nie znamy kierunku) jako v0 więc mamy:
|V| = v0

No i szukamy takiego t, dla którego będzie trafienie, czyli:
P = X

Składając to wszystko mamy zestaw warunków:

1. X = X0 + t*S
2. P = t*V
3. |V| = v0
4. P = X

Z połączenia 1+2+4 mamy:
t*V = X0 + t*S

Czyli po uproszczeniu nasze równania to:
X0 + t*(S-V) = 0
|V| = v0

Rozpisując wektory na składowe:
x0x + t*(sx-vx) = 0
x0y + t*(sy-vy) = 0
vx*vx + vy*vy = v0     // tutaj od razu uprościć można pierwiastek

Pozostaje tylko to rozwiązać - na przykład wyciągając vx i vy z pierwszych dwóch równań:
vx = (x0x + t*sx)/t
vy = (x0y + t*sy)/t

... i podstawiając do trzeciego wyjdzie nam:
( (x0x + t*sx)/t )^2 + ( (x0y + t*sy)/t )^2 = v0

Mnożąc obie strony przez t^2 (zakładamy że t=0 nie jest odpowiedzią) wyjdzie nam zwykłe równanie kwadratowe na t:
(x0x + t*sx)^2 + (x0y + t*sy)^2 = v0

Mnożymy:
x0x^2 + t*sx*x0x + (t*sx)^2 + x0y^2 + t*sy*x0y + (t*sy)^2 - v0 = 0

Porządkujemy:
( sx + sy )*t^2 + ( sx*x0x + sy*x0y )*t + ( x0x^2 + x0y^2 - v0 ) = 0

Po czym pozostało rozwiązać zwykłe równanie kwadratowe na t. Z rozwiązań które wyjdą wybieramy najmniejsze t, które jest większe od zera (bo czas nie może być ujemny ani zero, a chcemy trafić jak najszybciej jeżeli są dwie opcje). Może wyjść, że nie ma poprawnych wyników i nie można trafić celu (z reguły: bo pocisk jest za wolny i nie doleci).

Po czym podstawiając wybrane t do wzorów:
vx = (x0x + t*sx)/t
vy = (x0y + t*sy)/t

Mamy finalną prędkość.

Smacznego. :)

Offline skmskm

  • Użytkownik

# Maj 26, 2013, 16:31:19
dzięki teraz musze to jakoś zakodować i będzie git :D
« Ostatnia zmiana: Maj 26, 2013, 17:36:35 wysłana przez skmskm »

Offline Rolek

  • Użytkownik

# Maj 26, 2013, 21:06:25
Z rozwiązań które wyjdą wybieramy najmniejsze t, które jest większe od zera (bo czas nie może być ujemny ani zero, a chcemy trafić jak najszybciej jeżeli są dwie opcje).
Można jeszcze sprawdzić czy cel nie schowa się za przeszkodą i wtedy rozważyć drugą opcję.

PS. Przy dużych t, cel może się zmęczyć i zwolnić lub zmienić kierunek ucieczki ;)

Offline Xirdus

  • Redaktor

# Maj 26, 2013, 21:09:29
PS. Przy dużych t, cel może się zmęczyć i zwolnić lub zmienić kierunek ucieczki ;)
Ciii, toż to moja tajna taktyka unikania strzał w wielu grach! ;D

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Maj 26, 2013, 21:52:56
Cytuj
Można jeszcze sprawdzić czy cel nie schowa się za przeszkodą i wtedy rozważyć drugą opcję.
W klasycznych sytuacjach raczej się dwie opcje nie pojawią - do głowy przychodzi głównie przypadek gdy cel jest szybszy od pocisku, przechodzi obok miejsca strzału i mamy do wyboru albo strzelić w kierunku celu by trafić go zanim przejdzie obok, albo strzelić w przód by obiekt dogonił pocisk i na niego wpadł.

W przypadku gdy pocisk jest dużo szybszy od celu raczej będzie do wyboru t>0 (normalny strzał) oraz t<0 (gdzie mierzyć gdyby obiekt i pocisk poruszały się w przeciwnym kierunku).