Autor Wątek: Kolizje 3D na bounding spheres  (Przeczytany 1057 razy)

Offline jontek

  • Użytkownik

# Listopad 28, 2016, 11:46:32
Kolizje 3D na bounding spheres to bardzo prosta sprawa i nie wymaga wyjaśnień. Jednak jeżeli środek obrotu obiektu nie pokrywa się ze środkiem otaczającej sfery to jest problem gdy obiekt jest obrócony o jakieś niezerowe kąty. Jak sobie z czymś takim radzicie?
  • Obracacie jakoś środek sfery o takie kąty o jakie obrócony jest obiekt?
  • Robicie sferę, której środek zawsze pokrywa się ze środkiem obrotu, przez co sfera nie przylega dokładnie do obiektu ale dzięki temu jest “odporna na obroty” i otacza obiekt niezależnie od tego jak jest obrócony?
Jest sens robić rozwiązanie 1? Jest jakieś fajne (optymalne) rozwiązanie tego problemu? Wszystkie przykłady jakie znajduję w sieci opisują tylko to proste rozwiązanie 2.

Offline Mr. Spam

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

Offline mihu

  • Użytkownik
    • mihu

  • +1
# Listopad 28, 2016, 12:38:29
Rozwiązanie pierwsze nie jest jakoś szczególnie trudne. Jeżeli s to środek sfery we współrzędnych lokalnych obiektu, M to macierz 3x3 obrotu do współrzędnych świata, a t to wektor translacji do współrzędnych świata, to wektor s' = Ms + t będzie środkiem sfery we współrzędnych świata (czyli tych, w których w najprostszym przypadku sfera będzie 'przecinana' ze sferami otaczającymi innych obiektów).

Offline jontek

  • Użytkownik

# Listopad 29, 2016, 02:35:46
Dzięki za odpowiedź.

Cytuj
wektor s' = Ms + t będzie środkiem sfery we współrzędnych świata
No niby racja. Ale jak dla mnie to będzie trochę za dużo tych sinusów/cosinusów jak na samo sprawdzanie czy obiekt jest we frustum kamery. :( To będzie robione w każdej klatce jeżeli obiekt będzie się obracałł/przesuwał.

Offline moonshield

  • Użytkownik
    • ::devBlog

# Listopad 30, 2016, 18:19:50
A będziesz to liczył na jakimś ARMie M0?

Offline jontek

  • Użytkownik

# Grudzień 01, 2016, 01:30:54
A będziesz to liczył na jakimś ARMie M0?
Faktycznie celuję w dosyć słabe maszyny. Poza tym nie lubię tracić mocy na coś na co tracić nie muszę. Dokładnymi sferami będę sobie wykrywał kolizje między obiektami. Ale to czy obiekt siedzi we frustum kamery wolę wykryć przy użyciu nieco większej (mniej dokładnej) sfery, która nie wymaga obracania.

Offline mihu

  • Użytkownik
    • mihu

# Grudzień 01, 2016, 12:25:01
Dzięki za odpowiedź.
No niby racja. Ale jak dla mnie to będzie trochę za dużo tych sinusów/cosinusów jak na samo sprawdzanie czy obiekt jest we frustum kamery. :( To będzie robione w każdej klatce jeżeli obiekt będzie się obracałł/przesuwał.
A gdzie masz te sinusy? Macierz obrotu obiektu i tak musisz pewnie przeliczyć w każdej klatce, wystarczy to zrobić raz.

Offline jontek

  • Użytkownik

# Grudzień 01, 2016, 15:49:22
A gdzie masz te sinusy? Macierz obrotu obiektu i tak musisz pewnie przeliczyć w każdej klatce, wystarczy to zrobić raz.
Ale glRotate będzie użyte tylko przy rysowaniu obiektu. No a obiekt będzie rysowany tylko wtedy gdy przynajmniej częściowo zawiera się we frustum kamery. No a żeby to stwierdzić to już muszę mieć tę sferę. Więc muszę to policzyć nawet dla obiektów, które są za kamerą. A tego chcę uniknąć. Raczej użyję do tego bounding sphere odpornej na obroty. :)