Autor Wątek: Pileczka - kat odbicia  (Przeczytany 3879 razy)

Offline chester

  • Użytkownik

# Styczeń 08, 2010, 21:32:02
Witam

Odrazu przejde do rzeczy.. mam taki oto kod


  if(y==450) kierunek_y=-1;
  if(y==0) kierunek_y=1;

  y+=kierunek_y;

  if(x==610) kierunek_x=-1;
  if(x==0) kierunek_x=1;

  x+=kierunek_x;

za jego pomoca odbijam sobie moja pileczka od krawedzi na mojej planszy 640x480.

Moj problem polega na tym ze chcialbym aby moje odbicie bylo bardziej naturalne. Wyczytalem gdzies ze mozna by to bylo zrealizowac za pomoca funkcji trygonometrycznych.



Teraz obliczam wektor a i c. Obliczam cos mojego kata i zamiast y+=kierunek_y wstawilbym y+=cos(a/c).
Czy moje myslenice jest dobre ? Bo przy takim rozwiazaniu pojawia mi sie duzo problemow ktorych nie moge obejsc. Poczytalem co nieco tutki o wektorach itp. ale i tak idzie mi troche ciezko.

Offline Mr. Spam

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

Offline janisz

  • Użytkownik
    • Janisz's blog

# Styczeń 08, 2010, 22:27:57
Prawie dobrze. Pędkość piłki któr to też wektor, który należy rozbić na dwa wektory składowe równoległe do każdej z osi. I teraz w zalezności od której ścianki piłka się odbija zmieniasz konkretny wektor składowy na przeciwyny. Jeżeli np. kierunek_x = 3 a kierunek_y = 4 to piłeczka ma prędkość pięć, jest zwrucona do góry pod kątem ok. 53* ( sinA = 0.8 ) to jeżeli teraz odbije się od górnej ścianki to jej prędkość pionowa powinna się zmienić na przeciwną czyli kierunek_y *= -1. Samo dodawanie jakiekolwiek funkcji trygonometrycznej nic tu nieda, one mogą się przydac jeżeli chcesz losować kąt i dobrac predkości składowe.

Jeszcze się przyjrzałem i cos(a/c) - wyciągasz cosinus z cosinusa?

Offline Avaj

  • Użytkownik

# Styczeń 09, 2010, 00:37:24
prawo odbicia: kąt padania = kąt odbicia

Offline Dab

  • Redaktor
    • blog

# Styczeń 09, 2010, 00:45:31
prawo odbicia: kąt padania = kąt odbicia
Przy założeniu że powierzchnia od której piłka się odbija jest nieruchoma.

Offline lastseeds

  • Użytkownik

# Styczeń 09, 2010, 00:52:42
mu chyba chodzi o straty energii ?

Offline mach12

  • Użytkownik
    • www.mach12.pl

# Styczeń 09, 2010, 01:15:53
@up
Oj wątpię  ;)

Offline chester

  • Użytkownik

# Styczeń 09, 2010, 14:09:35
faktycznie napisalem cos z cos moj blad,

ktos tam pisal o stracie energi, nie nie, mi chodzi o najprostsze odbicie pileczki od sciany bez brania pod uwage masy, grawitacji, oporow itp. ja i bez tego mam problemy.

Kat padania usiluje obliczyc za pomoca funkcji cos. Czy madrze ? nie wiem. Wtedy bym zastosowal to prawo odbicia. Janisz mi chodzi wlasnie oto ze jak piszesz gdy pileczka odbije sie np. od gornej scianki to jej predkosc nie wynosila -1 tylko tam 0.63424 itp. bo tak wychodzi np. z funkcji cos. Wtedy zamiast y+=1 zrobilym y+=0.63424.

Czyli w mojej petli glownej mialbym:

x+=1;
y+=0.63424; // ta wartosc wziolem z a/c.

  if(y>=445 && y<=450) kierunek_y=-1;
  if(y>=0 && y<=5) kierunek_y=1;



  y+=cos(780); // a/c

  if(x==610) kierunek_x=-1;
  if(x==0) kierunek_x=1;

  x+=kierunek_x;

Tak to probuje mniej wiecej zrealizowac, i tak probuje juz od paru dni ;)

Offline Kamma

  • Użytkownik

# Styczeń 09, 2010, 14:27:12
Funkcje trygonometryczne będziesz potrzebował tylko przy kolizjach piłeczki z powierzchniami nachylonymi ( kąt nachylenia różny od 0 lub 90 stopni ). Jeśli występują u Ciebie tylko ściany pionowe i poziome, to odbicie polega na przemnażaniu jednej ze współrzędnych wektora prędkości piłki przez -1.

Offline chester

  • Użytkownik

# Styczeń 09, 2010, 14:48:59
Funkcje trygonometryczne będziesz potrzebował tylko przy kolizjach piłeczki z powierzchniami nachylonymi ( kąt nachylenia różny od 0 lub 90 stopni ). Jeśli występują u Ciebie tylko ściany pionowe i poziome, to odbicie polega na przemnażaniu jednej ze współrzędnych wektora prędkości piłki przez -1.

  if(y==450) kierunek_y=-1;
  if(y==0) kierunek_y=1;

  y+=kierunek_y;

  if(x==610) kierunek_x=-1;
  if(x==0) kierunek_x=1;

  x+=kierunek_x;

Kamma zgadza sie wszystko. Tu jest kod ktory realizuje to oczym mowisz. Ale ja chce zbadac kat pod jakim pileczka lecaca z sciany 'a' uderza w sciane 'b' i wypuscic ja pod takim samym katem. Czemu sie tak uparlem juz tumacze, napisalem gre w ktorej odbijam sobie pileczka od scian, taki ping-pong. Wszystko mi dziala ale chcialbym aby ruch mojej pileczki byl bardziej naturalny. Nawet zainteresowalem sie ksiazka "fizyka gier dla programistow" i innymi z tego tematu ale teraz juz wiem ze nic z tych ksiazek bym nie zrozumial dlatego zostalo mi liczyc na pomoc na forum.

Offline mwojt

  • Użytkownik

# Styczeń 09, 2010, 14:59:50
kierunek piłki lepiej zapisać zmienną 0-360 stopni (kąt)
nx = sin(kąt*3.1415923865/180)*szybkość;
ny = cos(kąt*3.1415923865/180)*szybkość;
piłka_x+=nx;
piłka_y+=ny;
a później pokombinować coś z odbiciami.

Offline RedHot

  • Użytkownik

# Styczeń 09, 2010, 15:18:17
prawo odbicia: kąt padania = kąt odbicia
Przy założeniu że powierzchnia od której piłka się odbija jest nieruchoma.
A jak będzie wyglądała ta sytuacja w przypadku ruchomej powierzchni ?

// 400 post  ;D

Offline Avaj

  • Użytkownik

# Styczeń 09, 2010, 16:03:58
http://www.flashzone.pl/forum2/showthread.php?t=48440

polecam ostatni post z tego tematu, wektory upraszczają sprawę

Offline Kamma

  • Użytkownik

# Styczeń 09, 2010, 16:05:21
Kamma zgadza sie wszystko. Tu jest kod ktory realizuje to oczym mowisz. Ale ja chce zbadac kat pod jakim pileczka lecaca z sciany 'a' uderza w sciane 'b' i wypuscic ja pod takim samym katem. Czemu sie tak uparlem juz tumacze, napisalem gre w ktorej odbijam sobie pileczka od scian, taki ping-pong. Wszystko mi dziala ale chcialbym aby ruch mojej pileczki byl bardziej naturalny. Nawet zainteresowalem sie ksiazka "fizyka gier dla programistow" i innymi z tego tematu ale teraz juz wiem ze nic z tych ksiazek bym nie zrozumial dlatego zostalo mi liczyc na pomoc na forum.

Dwa wektory:

n = [nx, ny] wektor normalny powierzchni odbicia
V = [Vx, Vy] wektor prędkości piłki

Kąt ALFA między powierzchnią, a wektorem prędkości:

cos BETA = ( nx*Vx+ny*Vy ) / ( |n| * |V| )
BETA = arc cos ( nx*Vx+ny*Vy ) / ( |n| * |V| )
ALFA = BETA - 90 stopni (lub PI/2)
« Ostatnia zmiana: Styczeń 09, 2010, 16:06:54 wysłana przez Kamma »

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Styczeń 09, 2010, 23:51:50
Dwa wektory:

n = [nx, ny] wektor normalny powierzchni odbicia
V = [Vx, Vy] wektor prędkości piłki

Wektor prędkości po odbiciu:

V' = V - 2n(V o n)

Czyli:

d = Vx*Vx + nx*nx
V' = [ Vx - 2*nx*d, Vy - 2*ny*d ]

Wektor normalny musi mieć przy tym długość jednostkową.

Offline chester

  • Użytkownik

# Styczeń 10, 2010, 13:40:12
o rany... zalamaliscie mnie tymi wzorami troche, mowic ze nigdy bym na to nie wpad to sobie moze odpuszcze ale myslalem ze bedzie to nieco prostsze (choc pewnie to trudne nie jest)

Dwa pytania:
We wzorze V' = V - 2n(V o n) symbol "o" oznacza ?
I w temacie ponizej w tym dziale na forum przeczytalem ze warto czasami skorzystac z gotowego juz silnika.
Box2D - Czy warto zainteresowac sie tym silnikiem czy sobie odpuscic ? Pytam na tle tego do czego bylby mi on potrzebny czyli odbijania pileczki od scian.