Autor Wątek: [Box2D] Problem z pociskiem  (Przeczytany 1146 razy)

Offline Furry

  • Użytkownik
    • DevBlog

# Maj 28, 2011, 20:55:41
Witam, mam pytanie w jaki sposób zrobić by pocisk w naturalny sposób leciał z danym wektorem początkowym i jednocześnie w miarę widoczny sposób ulegał grawitacji?
Próbowałem używać setLinearVelocity na dynamic body ale jednorazowe użycie tego niestety sprawia, ze niezależnie jak duży wektor podam i tak mi go(chyba) znormalnizuje i pocisk zacznie spadać po kilku metrach w dół. Czy mógłby mi ktoś polecić sprawdzony sposób "odpalania" pocisków tak by leciały w "naturalny" sposób i żebym ręcznie nie musiał zmniejszać liearVelocity przy każdym obliczeniu?

Offline Mr. Spam

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

bs.mechanik

  • Gość
# Maj 28, 2011, 22:41:37
Przylozyc sile o danej wartosci i zadanym wektorze ?

Offline dmx81

  • Użytkownik

# Maj 28, 2011, 23:38:53
no tutaj to czysta fizyka -> google -> wikipedia - > rzut poziomy, rzut ukosny
zeby wygladalo realistycznie - musisz podac relatywne wartosci, tzn jesli twoj ekran ma np 100 metrow (bo np postac ma procentowo do ekranu iles tam - tak na oko okreslic sobie musisz jakies proporcje) to musisz odpowiednio okreslic, jaka predkosc poczatkowa ma twoj pocisk, ewentualnie mniej fizycznie mozesz zrobic, zmniejszajac wartosc grawitacji. bawilem sie kiedys tym w allegro i bez problemu mozna bylo narysowac pocisk spadajacy po sekundzie lotu, a mozna bylo zrobic, aby pocisk przelecial z ta sama szybkoscia, obnizajac sie jedynie o kilka pikseli. oczywiscie sama predkosc przelotu przez dlugosc ekranu tez mozna bylo zmieniac. jak pisalem wyzej - poprostu poczytaj (lub jesli juz wczesniej czytales, bo przeciez jakies rownanie u siebie wykorzystujesz) i ustal proporcje wartosci

ps,zalaczam ten malutki programik, zobacz, czy o cos takiego ci chodzi, pochodzi on z czasow poczatkow mojego programowania, wiec nie spodziewaj sie nie wiem czego, ale o zasade dzialania chodzi :)

PS> nie da rady, za duzy zalacznik, podaje wiec kod - funkcje odpowiedzialna za dzialanie:

// dane poczatkowe
float pozycja_starty=400,pozycja_startx=30,wysokosc=0;  // y tutaj to wysokosc podlogi na ekranie
float x=pozycja_startx,y=pozycja_starty,t=0,kat=-20,g=9.81,V=70  // strzalkami moge pozniej zmieniac predkosc wystrzalu i kat wystrzalu- powiedzmy dla 110 leci powoli opadajac, dla 70 leci niecale pol ekranu, dla 150 nawet nie zaczyna opadac

// a pozniej rysowanie pocisku na pozycji x,y

x=pozycja_startx+V*t*cos(kat*3.14/180);
y=pozycja_starty+(V*t*sin(kat*3.14/180))+(g*pow(t,2)/2);
// t to zmiana wartosci pomiedzy klatkami lub jak u mnie dalem sobie:
t+=0.007;
// lecz bardzie prawidlowo powinno pobierac sie czas od ostatniej klatki, ale to bylo tylko do testow

Offline Rect Code

  • Użytkownik

# Maj 29, 2011, 10:51:33
@up ale fizyk z ciebie (:

Offline Furry

  • Użytkownik
    • DevBlog

# Maj 29, 2011, 23:50:38
Przylozyc sile o danej wartosci i zadanym wektorze ?
No właśnie tak też robie (czyli applyForce uzywam) ale efekt ten sam :/