Autor Wątek: C++ kolizja kółko kółko  (Przeczytany 2452 razy)

Offline qwerty1234

  • Użytkownik

# Styczeń 16, 2011, 17:01:55
Zaimplementowałem kolizje niecentralną koła z kołem wszystko ładnie pięknie tylko jest jeden problem. Po wystąpieniu kolizji ładnie liczy wektor w którą stronę ma lecieć tylko że nie wiem jak przesunąć kółka po wykryciu kolizji żeby nie nachodziły na siebie. Próbowałem cofnąć pozycje o jedną klatkę ale to źle. Wyznaczenie epsilona przesunięcia też nie działa do końca bo mogę cofnąć piłkę na ścianę. Czy macie jakieś pomysły jak to rozwiązać?

Offline Mr. Spam

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

Offline Drraven

  • Użytkownik

# Styczeń 16, 2011, 17:10:51
Jak piłki się dotkną do wyliczasz siłę wypadkową (prędkość piłek kierunki itp) (było na fizyce). I mówisz piłce w którą stronę ma lecieć. Jeśli dotknie ściany to też sprawdzasz to kolizją i robisz to samo.

Offline qwerty1234

  • Użytkownik

# Styczeń 16, 2011, 17:36:54
To mam pisałem wyżej tylko  jeśli kulka najedzie sporym kawałkiem na drugą to każdy zobaczy.  U mnie są dość duże prędkości  wiec nie występuje dotknięcie może najechać kilka pikseli w głąb innej piłki. Dla tego ze różnią się mas,ą promieniem, pędem. Pęd wypadkowy jak wspomniałem wyżej mam policzony poprawnie tylko że jeśli wystąpi kolizja muszę przesunąć jeden lub dwa obiekty tak aby nie zmienić kierunku lotu.
« Ostatnia zmiana: Styczeń 16, 2011, 17:45:09 wysłana przez qwerty1234 »

Offline Adam27

  • Użytkownik

# Styczeń 16, 2011, 17:47:20
To w pętli głównej, w której masz sprawdzanie i reakcję na kolizje, zrób jeszcze jedną pętlę, która będzie w każdej iteracji przesuwała okręgi co jeden piksel i dopiero wtedy sprawdzała kolizje. Będzie to o wiele dokładniejsze i nie będziesz się musiał przejmować przesuwaniem okręgów po zderzeniu.

Offline Oti

  • Użytkownik

# Styczeń 16, 2011, 17:53:45
Będzie to o wiele dokładniejsze
..i o jeszcze-więcej mniej wydajne.

Offline qwerty1234

  • Użytkownik

# Styczeń 16, 2011, 17:55:24
No niby tak ale nie chciałem tak robić bo to takie brzydkie jest :(. Zamierzam porządnie skończyć mój projekt dlatego tego nie użyje to nie jest dobra metoda.
« Ostatnia zmiana: Styczeń 16, 2011, 17:59:53 wysłana przez qwerty1234 »

Offline Xirdus

  • Redaktor

# Styczeń 16, 2011, 18:02:31
Gdy wykryjesz że będzie kolizja, cofnij ruch tych kółek, wylicz po jakim czasie się zetkną, porusz je aż do tego czasu, przy zetknięciu nadaj im odpowiednie wektory prędkości i poruszaj w nowym kierunku przez resztę czasu klatki.

Offline qwerty1234

  • Użytkownik

# Styczeń 16, 2011, 18:04:25
thx dzięki o takie coś mi chodziło

Offline Xirdus

  • Redaktor

# Styczeń 16, 2011, 18:06:16
Jeszcze mi nie dziękuj, najpierw sprawdź czy działa :P

Offline Adam27

  • Użytkownik

# Styczeń 16, 2011, 18:16:41
To jest właśnie mniej więcej to o czym pisałem, tylko z pewną optymalizacją. Mimo wszystko, i tak może dojść do sytuacji, w której przy odpowiednio dużej prędkości okręgi zwyczajnie przez siebie przelecą i kolizja nie zostanie wykryta. Wg mnie lepiej najpierw sprawdzić, czy odległość pomiędzy nimi jest na tyle mała, żeby przy danej prędkości kolizja dała radę zajść w rozważanej klatce, jeśli tak, to dalej robisz tak jak napisał Xirdus, jeśli nie to do pozycji okręgów dodajesz prędkość*delta i koniec. To jest chyba kompromis pomiedzy dokładnością i wydajnością.

Offline qwerty1234

  • Użytkownik

# Styczeń 16, 2011, 18:21:32
Mam pętle czasu rzeczywistego kolizja zawsze będzie wykryta. Tylko niekoniecznie cofniecie do poprzedniej klatki da mi co potrzebuje ale pomyśle nad tym.

Offline Xirdus

  • Redaktor

# Styczeń 16, 2011, 18:27:14
Mam pętle czasu rzeczywistego kolizja zawsze będzie wykryta.
Bez tego co napisał Adam27, w szczególnych wypadkach koła mogą przez siebie przeniknąć. Prawdopodobieństwo takiego zdarzenia rośnie wraz z prędkością kół i maleje z ich wielkością. Dodatkowo, im bardziej "z brzegu" kolizja występuje, tym łatwiej jej nie wykryć.

Offline qwerty1234

  • Użytkownik

# Styczeń 16, 2011, 18:30:04
Mam ograniczenie na prędkość. Dlatego u mnie nie zajdzie. Kolizja z brzegu może być prawdopodobna.
« Ostatnia zmiana: Styczeń 16, 2011, 18:34:39 wysłana przez qwerty1234 »

Offline mach12

  • Użytkownik
    • www.mach12.pl

# Styczeń 17, 2011, 13:48:09
Na gamasutrze gdziś jest o tym artykuł. Jak znajde link to podrzuce. To było jakoś tak że:
- najpierw dlugosc rzutu (oznaczmy D) wektora miedzy srodkami kol na wektor ruchu
- z pitagorasa liczymy trzeci bok (oznaczny bo F) z tak powstalego trojkata (D - przyprostokatna, dlugosc wektora miedzy srodkami - przeciwprostokatna)
- teraz obliczmy dlugosc odcinka T -  liczymy z pitagorasa suma_promieni_kol^2 - F^2= T^2
- teraz przycinamy wektor ruchu mnożąc go przez stosunek (D - T)/dlugosc_wektora_ruchu

Link do obrazka: http://zapodaj.net/d7ffa46dbda5.png.html