Witam serdecznie Kolegów!
Aktualnie jestem w trakcie pisania gry typu labirynt z kulką na procesor ARM STM32F103VCT6. Wszystko mam pięknie i ładnie obsłużone (symulacja odbić od powierzchni płaskich, detekcja kontaktu z otworami) no ale zostało jeszcze najważniejsze - symulacja odbić kulki od kantów prostokąta. I tu niestety zaczynają się schody.
Z punktu widzenia fizycznego sprawa jest prosta, wręcz banalna, mianowicie:
1. Warunkiem #1 zderzenia jest poruszanie się piłki w kierunku danego kantu (czyli dowolna ze składowych prędkości ma wartość wskazującą na zbliżanie się kuli do rogu.
2. Warunkiem #2 zderzenia jest to, że kula znajduje się w odległości równej swojemu promieniowi od kantu (czyli jej powierzchnia styka się z kantem).
3. Kula przy odbiciu zachowuje się tak, jakby odbijała się od powierzchni zawartej w stycznej do jej powierzchnii w miejscu kontaktu. W 2 wymiarach załóżmy, że powierzchnia ta jest prostą o równaniu y=a1x+b1 Punkt końcowy ruchu w danym przedziale czasu należy zatem odbić w symetrii względem tej prostej, natomiast prędkości vx i vy zgodnie z takimi zależnościami opisanymi w programie:
Starałem się przenieść te zależności do programu, dodając jeszcze warunek zapobiegający zapętleniu się przy sprawdzaniu odbicia od danego kantu, jednak nie do końca działa to tak jak powinno (na razie obsługuję tylko lewy górny kant) - po pierwsze kulka znacząco spowalnia w momencie kontaktu z kantem (ale to można zrzucić na jeszcze niezoptymalizowane obliczenia i nie stablicowane funkcje trygonometryczne atan i sin oraz cos), a po drugie i najważniejsze - czasem przelatuje na drugą stronę kantu (wlatuje w przeszkodę).
Sam algorytm główny działa tak jak rosowanie linii. Czyli na początku na podstawie przyspieszenia z akcelerometru wyliczamy prędkość, potem na jej podstawie przesunięcie kulki. I potem od puntku aktualnego do nowego położenia posuwamy sie piksel po pikselu, za każdym razem sprawdzając, czy nie zderzamy się z przeszkodą.
Nie oczekuję oczywiście na gotowca (choć po tygodniu zmagań z algorytmem odbić chciałbym jaknajszybciej przejść do wczytywania poziomów i ich obsługi), ale na naprowadzenie jak to zapisać lub (jeśli ktoś znajdzie lub zna coś ciekawego) wskazanie takiego algorytmu w sieci (trochę stron przejrzałem, ale algorytmu jakie znalazłem nie obsługiwały odbić - po prostu kulka po zderzeniu otrzymywała v=0).
Mile widziane także sugestie dot. samego algorytmu wykrywania odbić.
Z góry dziękuję za pomoc i uwagi merytoryczne.
--------------------------------------------------------
Kod funkcji obsługującej grę:
Kod całego programu (poza bibliotekami):
Aktualnie jestem w trakcie pisania gry typu labirynt z kulką na procesor ARM STM32F103VCT6. Wszystko mam pięknie i ładnie obsłużone (symulacja odbić od powierzchni płaskich, detekcja kontaktu z otworami) no ale zostało jeszcze najważniejsze - symulacja odbić kulki od kantów prostokąta. I tu niestety zaczynają się schody.
Z punktu widzenia fizycznego sprawa jest prosta, wręcz banalna, mianowicie:
1. Warunkiem #1 zderzenia jest poruszanie się piłki w kierunku danego kantu (czyli dowolna ze składowych prędkości ma wartość wskazującą na zbliżanie się kuli do rogu.
2. Warunkiem #2 zderzenia jest to, że kula znajduje się w odległości równej swojemu promieniowi od kantu (czyli jej powierzchnia styka się z kantem).
3. Kula przy odbiciu zachowuje się tak, jakby odbijała się od powierzchni zawartej w stycznej do jej powierzchnii w miejscu kontaktu. W 2 wymiarach załóżmy, że powierzchnia ta jest prostą o równaniu y=a1x+b1 Punkt końcowy ruchu w danym przedziale czasu należy zatem odbić w symetrii względem tej prostej, natomiast prędkości vx i vy zgodnie z takimi zależnościami opisanymi w programie:
ball_xt=2.0*(atanf(a1)+atanf(vx/vy));
ball_yt=cosf(ball_xt);
ball_xt=sinf(ball_xt);
vxn=vy*ball_xt+vx*ball_yt;
vyn=vx*ball_xt+vy*ball_yt;
Starałem się przenieść te zależności do programu, dodając jeszcze warunek zapobiegający zapętleniu się przy sprawdzaniu odbicia od danego kantu, jednak nie do końca działa to tak jak powinno (na razie obsługuję tylko lewy górny kant) - po pierwsze kulka znacząco spowalnia w momencie kontaktu z kantem (ale to można zrzucić na jeszcze niezoptymalizowane obliczenia i nie stablicowane funkcje trygonometryczne atan i sin oraz cos), a po drugie i najważniejsze - czasem przelatuje na drugą stronę kantu (wlatuje w przeszkodę).
Sam algorytm główny działa tak jak rosowanie linii. Czyli na początku na podstawie przyspieszenia z akcelerometru wyliczamy prędkość, potem na jej podstawie przesunięcie kulki. I potem od puntku aktualnego do nowego położenia posuwamy sie piksel po pikselu, za każdym razem sprawdzając, czy nie zderzamy się z przeszkodą.
Nie oczekuję oczywiście na gotowca (choć po tygodniu zmagań z algorytmem odbić chciałbym jaknajszybciej przejść do wczytywania poziomów i ich obsługi), ale na naprowadzenie jak to zapisać lub (jeśli ktoś znajdzie lub zna coś ciekawego) wskazanie takiego algorytmu w sieci (trochę stron przejrzałem, ale algorytmu jakie znalazłem nie obsługiwały odbić - po prostu kulka po zderzeniu otrzymywała v=0).
Mile widziane także sugestie dot. samego algorytmu wykrywania odbić.
Z góry dziękuję za pomoc i uwagi merytoryczne.
--------------------------------------------------------
Kod funkcji obsługującej grę:
Code: c
Kod całego programu (poza bibliotekami):
Code: c