Prawo odbicia

0

Witam. Mam pewien problem z odbiciem (można powiedzieć świetlnym) bo to na tym samym polega. Chcę odbić kulkę o ścianę, tak aby zachowała się realistycznie i zachowała normy prawa odbicia. Na początek zrobiłem w ten sposób, że gdy po uderzeniu o ścianę (punkt x,y) i ówczesnym ustaleniu kierunku przesuwania podejmowałem się odejmowania stałej (mniejszej) wartości od tego kierunku. Stałe to: 90,180,270. Gdy kierunek przesuwania był większy niż 90, a mniejszy niż 180 to równanie wygląda tak:

90 - kierunek(np. 150) = - 60;

to co zostanie odejmuję ponownie od 90

90 - 60 = 30

A więc kierunek odbicia wynosi 30 stopni, jeżeli poprzedni kierunek znajdował się w wartościach pomiędzy 90 a 180 stopni.
I tak analogicznie 90 - 180, 180 - 270, 270 - 360, 0 - 90 (lecz tutaj tak sam jak w 90 - 180)

No dobra jako tako działa i fajnie się odbija, lecz czasami się miesza. Bo ja odbijam tylko o dany punkty zamiast o jakąś krawędź lub pochyły element. Chciałbym, abyście mi doradzili jak to właśnie wykonać, bo już poświęciłem cały dzień, a porządnego efektu nie uzysjałem :(

Bardzo wdzięczny byłbym, gdyby został wykonany jakiś pomocniczy rysunek dla mnie.

Realistyczne odbijanie:
http://www.fotosik.pl/pokaz_obrazek/22b2e3f84840870a.html

A i zapomniałem dodać, że to wszystko opiera się na współrzędnych x,y.

0

Zakładam, że jesteś w stanie uzyskać położenie punktu A=(X, Y) oraz położenie środka kuli O=(x', y'). Wtedy możesz zauważyć, że półprosta AO jest normalną odbicia. Mam nadzieję, że masz metodę do obliczenia punktu O. Jak nie, to musisz wyprowadzić odpowiednie równania.

r - promień kulki
k - kierunek kulki w stopniach
(x, y) - pierwotne położenie kulki
(x', y') - pożądane położenie kulki
t - odległość wykonana przez kulkę
Dla 0<k<90 (tzn. kierunek wskazuje pomiędzy północą a wschodem) zachodzą zależności:

x' = x + t * cos(90-k)
y' = y + t * sin(`code>W pożądanym położeniu punkt A będzie leżał na kulce. Zajdzie więc wtedy zależność:`(X - x')^2 + (Y - y')^2 = r^2
I dla naszego przykładu dla 0<k<90:
(X - x - t*cos(90-k))^2 + (Y - y - t*sin(90-k))^2 = r^2

Z którego da się wyprowadzić równanie kwadratowe na zmienną t. Rzecz jasna, (a) nie wiem, czy nie dałoby się to jakoś zrobić prosto, (b) dobrze byłoby użyć wzorów redukcyjnych, by zamienić trygonometryczna(90-coś) na coś ładniejszego.

A tak w ogóle to nie wiem, czy nie lepiej byłoby do tych zastosowań brać wektorów. Ale skoro już wybrane zostały kierunki, to może się wiązać z dużą przebudową...

0

powiedz odkąd mierzysz kąt to łątwiej będzie Ci wzory napisać

0

Powiedzmy kulka stoi sobie na środku, po czym wybieram dowolny kąt np. 140 (południowy zachód) i podąża ku nie mu. Jeżeli napotka jakąś krawędź to się do niej przystosowuje i wykonuje odpowiednie odbicia. Ja te odbicia właśnie robiłem na zasadzie północ, południe, zachód wschód tak jak to kolega 2x wyżej zauważył. Lecz chciałbym to zmienić bo nie odprowadza odpowiedniego kątu odbicia względem kolizji.

0

skoro 140 jest na poludniowy zachod to zakladam ze zero jest w pionie do gory, a kat mierzysz w lewo. odbicia na scianach pionowych masz zatem:
katpoodbiciu = 360-kat; // lub -kat

odbicia na scianach poziomych:
katpoodbiciu = 180-kat;

pozniej ewentualnie mozesz dodac 360 tyle razy zeby kat znalazl sie w granicach od 0-360

zakladam ze katy masz w stopniach, jesli nie to musisz sobie przerobic :P

0

Coś mi się nie wydaję, żeby to działało. Nie wiem czy dobrze zrozumiałem, lecz po odbiciu pionowej ściany: 360 - 170 = 190 nie będzie wyglądać to realistycznie.

"pozniej ewentualnie mozesz dodac 360 tyle razy zeby kat znalazl sie w granicach od 0-360"

U mnie nie ma rotacji minusowej. Jedynie od 0 - 360. Jedynie co może wypalić to tylko ściana pozioma np. 180 - 50 = 130 tutaj z pewnością da realistyczny wynik.

0

no 170 stopni jest 10 stopni od pionu i 190 jest rowniez 10 stopni od pionu (180 stopni) wiec nie wiem co Ci sie nie zgadza

0

Rysuneczek co aktualnie dzieje się na płaszczyźnie:
http://www.fotosik.pl/pokaz_obrazek/5271ce3702cc42e6.html

Te "wycieki" tak samo się zachowują jak u mnie w aplikacji, dostają takich jakby kulka trzęsień dostała i pełzła w kierunku północnym lub południowym. O zachód i wschód bajecznie się odbija i nie ma co do tego zarzutu. Na zachód i wschód wygląda to tak:

Zachód:
if(0 < Ball[0][a] < 180)
{
Ball[0][a] = 360 - Ball[0][a];
....
}

Wschód:
else if(180 < Ball[0][a] < 360)
{
Ball[0][a] = 180 - Ball[0][a];
Ball[0][a] = 180 + Ball[0][a]; // + i - daje minus
...
}

Zrobiłbym tak samo z północą i południem lecz gdybym zrobił np. taki warunek: if(0 < Ball[0][a] < 90 && 270 < Ball[0][a] < 360) to już wtedy gryzłby się z tymi dwoma powyższymi warunkami, takie jakby "zapożyczanie kątów" w wyniku czego doszło by do dziwadeł typu "Chodź tu do mnie! Nie, lepiej chodź do mnie!".
I naprawdę nie wiem jak to wszystko ze sobą pogodzić. Bo jak już wcześniej wspomniałem wschód i zachód zachowują się idealnie, co widać na rysunku.

0

Przeszukałem forum i znalazłem bardzo krótkie rozwiązanie, a zarazem zaskakujące.

cytuję:

"kazde odbicie bili od jakiejs sciany to kat padania + 90 stopni ..."

Sprawdziłem to i rzeczywiście działa - nie do uwierzenia :D

0

dla mnie bardziej zaskakujący jest ten i podobny warunek:
if(0 < Ball[0][a] < 180)

może chodziło Ci o coś w stylu:
if(0 < Ball[0][a] && Ball[0][a] < 180)

1 użytkowników online, w tym zalogowanych: 0, gości: 1