Skocz do zawartości

[SFML 2.0] Odbijanie od ścian


Xedom

Rekomendowane odpowiedzi

Hej ;)

Mam problem z wymyśleniem dobrego sposobu na obliczanie, w jakim kierunku obiekt ma się odbić od ściany.

Ściany są zapisywane na x1, x2, y1 i y2, a obiekt ma wielkość jednego piksela, więc tylko na pozycjach x i y.

Chodzi mi o to, żeby sprawdzać, jaką prędkość x i y powinien uzyskać obiekt przy zderzeniu.

 

Nie wiem, czy to co napisałem jest zrozumiałe, więc moja artystyczna dusza rozkazała mi stworzyć w Paintcie to cudo:

HZeIQid.png

 

Czerwona kropka to obiekt, czarne to ściana, szare to niesamowita wizualizacja odbicia obiektu, a litera "A" to kąt odbicia

(w gruncie rzeczy chodzi o symetrię, nie wiem czy z tego obrazka to widać ;I)

Odnośnik do komentarza
Udostępnij na innych stronach

Pierwszy pomysł, korzystający z wiedzy licealnej :P Być może da się szybciej, być może po poskracaniu wyjdzie to co napisał @adam014(a być może co innego), ale przedstawię swój tok rozumowania.

Nie zraź się do kiepskiego rysunku, powoli wszystko opiszę!

bazgroly.png

1) Mamy dane:

x1, y1, x2, y2 - początek i koniec ściany,

x0, y0 - punkt zderzenia ze ścianą,

wektor v = [vx, vy] (a początek 0, 0 - początek układu współrzędnych) - prędkość kulki

2) Przeskalowuję sobie mój wektor, umieszczając go tak, by jego koniec znajdował się w miejscu zderzenia kulki ze ścianą.

początek wektora: x0 - vx; y0 - vy, koniec: x0, y0.

3) Korzystamy ze wzoru na prostą, na której leżą dwa punkty(licealne, do poszukania w internecie jeśli nie znasz), otrzymujemy prostą, na której leżą x1, y1, x2, y2. Potem, korzystając z kolejnego wzoru, otrzymujemy prostą prostopadłą do niej przechodzącą przez punkt zderzenia.

4) Teraz odbijamy symetrycznie początek wektora względem naszej prostej prostopadłej - kolejny wzór licealny, może być przydatne wcześniejsze poprowadzenie prostej równoległej do naszej początkowej prostej zawierającej ścianę, bo na tej nowej prostej znajduje się docelowy koniec wektora(rysunek).

Otrzymane współrzędne to koniec wektora. Początek wektora zaś to punkt zderzenia.

5) Przeskalowujemy wektor spowrotem, by jego początek pokrywał się z początkiem układu współrzędnych.

 

To wszystko. Proponuję nie robić obliczeń na bieżąco zgodnie z powyższym planem działania, tylko wyprowadzić sobie algebraicznie ostateczne wzory na Vx, Vy(ostateczne współrzędne wektora prędkości, które nas interesują) i zobaczyć co się stanie. Unikniemy dużo niepotrzebnych obliczeń.

 

Pozdrawiam

Odnośnik do komentarza
Udostępnij na innych stronach

v = v0 - 2 * n * dot(v0,n)

 

v - wektor predkosci odbitej

v0 - startowa

n - prosta prostopadla do danej prostej, znormalizowana (tzw. normalna od powierzchni)

dot - iloczyn skalarny

 

@adam

to zadziala tylko przy odbiciu od powierzchni pionowej/poziomej, nie pod dowolnym katem

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...