Strona 1 z 1

Bilard - ogólny algorytm wykrywania kolizji

: 07 cze 2010, 23:28
autor: PL_kolek
Witam!
W celach rozrywkowych (kto to słyszał, programować dla rozrywki?) postanowiłem spróbować się w napisaniu bilarda. Nie ukrywam, że najwięcej problemów sprawia mi fizyka, ale i detekcja i odpowiednie zachowanie się bil po kolizji. Tutaj akurat poruszę problem głównej i detekcji kolizji.

Zwykła detekcja, czy dwie kulki na siebie nachodzą sprawia problemy - mogą się zderzyć więcej niż dwie bile, w "stykowych" sytuacjach bardzo ważna jest kolejność kolizji, więc potrzebne jest jakiś bardziej skomplikowany system.

Wymyśliłem sobie, że powinno to wyglądać mniej więcej tak:
while(true)
{
  1. Mierzymy czas t od ostatniego przebiegu
  2. Wykrywamy wszystkie kolizje, mierzymy dla każdej czas (dt), po jakim zaszła, sortujemy kolizje od najwcześniejszej
  3. Po kolei analizujemy kolizje:
    1. Sprawdzamy ile z nich wystąpiło w tym samym czasie (dt takie samo w pewnym przybliżeniu)
    2. Obliczamy nowe prędkości dla bil w kolizji, uaktualniamy ich pozycje
    3. Usuwamy z listy kolizje, w których uczestniczyły te bile
    4. wykrywamy i dodajemy do listy wszystkie kolizje, które zaszły dla tych bil po odbiciu
  4. Gdy wszystkie kolizje zostały przerobione, wyświetlamy co trzeba i wracamy na początek
}

Czy takie coś ma szanse przejść (i fizycznie, i wydajnościowo)? Może coś w takim pomyśle zmienić?

Odp: Bilard - ogólny algorytm wykrywania kolizji

: 09 cze 2010, 18:54
autor: Pirix
Po punkcie d trzeba by ponownie przesortować liste kolizji, gdyż te dodane w punkcie d mogły zajść wcześniej niż inne kolizje będące już na liście.

Odp: Bilard - ogólny algorytm wykrywania kolizji

: 09 cze 2010, 20:32
autor: PL_kolek
Zapomniałem dodać, że kolizje dodajemy w odpowiednie czasowo miejsce ;)

Odp: Bilard - ogólny algorytm wykrywania kolizji

: 13 cze 2010, 10:34
autor: clansman5
Wedlug mnie nigdy nie nastapi kolizja w tym samym czasie dwoch bil. Zawsze bedzie to delikatna roznica czasowa, takze mozna przestac iterowac po wykryciu pierwszej.

Odp: Bilard - ogólny algorytm wykrywania kolizji

: 13 cze 2010, 23:07
autor: PL_kolek
A np. rozbicie trójkąta idealnie w sam środek pierwszej bili równolegle do krawędzie stołu? Wówczas ta "czołowa" bila w trójkącie zachodzi idelanie tak samo na dwie kolejne bile.

Odp: Bilard - ogólny algorytm wykrywania kolizji

: 13 cze 2010, 23:13
autor: xc1256
clansman5 pisze:Wedlug mnie nigdy nie nastapi kolizja w tym samym czasie dwoch bil. Zawsze bedzie to delikatna roznica czasowa, takze mozna przestac iterowac po wykryciu pierwszej.
przy takim założeniu jestem ciekaw efektu gry, bo w rzeczywitości bywa tak jak kolega pisze
PL_kolek pisze:A np. rozbicie trójkąta idealnie w sam środek pierwszej bili równolegle do krawędzie stołu? Wówczas ta "czołowa" bila w trójkącie zachodzi idelanie tak samo na dwie kolejne bile.

Odp: Bilard - ogólny algorytm wykrywania kolizji

: 16 cze 2010, 14:59
autor: clansman5
rozwaz to w bardzo krotkich odstepach czasu, nigdy nie nastapi zderzeni dwoch bil w idealnie tym samym czasie.

Odp: Bilard - ogólny algorytm wykrywania kolizji

: 17 cze 2010, 19:36
autor: PL_kolek
Postanowiłem zapytać się na stricte fizycznym amerykańskim forum, i przyniosło to odpowiedzi. Otóż to co opisał clansman5 jest tylko i aż przybliżeniem - tylko, bo komputerowo w symulacji takie zdarzenie nie jest ciężko uzyskać (pomijając oczywiście niedokładności liczb zmiennoprzecinkowych), ale aż, bo takie podejście w pełni wystarcza do symulacji gry w bilard.

Załóżmy, że trójkąt jest ułożony idealnie, jego wysokość jest równoległa do dłuższego boku stołu. Wtedy, jeżeli 1 bila trójkąta i biała mają taką samą współrzędną x, nadając białej bili tylko szybkość wzdłuż osi x, pierwsza bila trójkąta musi uderzyć w tym samym czasie dwie pozostałe bile. Z tym, że jak mi wyjaśniono, można każdą kolizję rozpatrywać oddzielnie i wyniki będą zadowalające