Autor Wątek: Reprezentacja frustuma i kolizje z frustumem  (Przeczytany 1810 razy)

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Czerwiec 27, 2007, 19:05:06
Mam pytanie do tych którzy dorobili się już jakiejś swojej biblioteczki matematycznej: Jak reprezentujecie frustum? (Jest to jak wiadomo bryła w kształcie ściętego stożka o podstawie prostokąta, przeznaczona głównie do reprezentowania pola widzenia kamery w rzucie perspektywicznym.) Ja znam trzy reprezentacje:

1. Za pomocą równań 6 płaszczyzn
2. Za pomocą pozycij 8 wierzchołków

Umiem wyznaczać je na podstawie macierzy (Widoku*Rzutowania), a moje funkcje do kolizji wymagają raz jednej, raz drugiej reprezentacji, a czasami nawet obydwu (jak trójkąt-frustum albo frustum-frustum). Znacie jakieś lepsze rozwiązanie albo jakieś dobre źródło na takie tematy?

Trzecią reprezentacją jest tzw. reprezentacja radarowa, opisana np. w Game Programming Gems tom 5 rozdz. 1.6 i chyba również tutaj http://www.lighthouse3d.com/opengl/viewfrustum/index.php. Wygląda niestety na to, że w książce jest błąd - pokazałem sprawę na rysunku. Czy ktoś wie o czym mówię i poradził sobie z tym?

Offline Mr. Spam

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

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Czerwiec 27, 2007, 19:23:57
Cytuj
1. Za pomocą równań 6 płaszczyzn
2. Za pomocą pozycij 8 wierzchołków
3. Za pomocą bryły trzymanej z wykorzystaniem half edge'y (czyli de facto wierzchołki, płaszczyzny i informacja jak co się ze sobą łączy). Co prawda nie miałem jeszcze potrzeby wychodzenia poza trzymanie 5 lub 6 równań płaszczyzn, ale z taka reprezentacją mozna zrobić dowolne operacje CSG, w tym wyznaczanie przecięć róznych brył i powierzchni. :)

Offline Riddlemaster

  • Użytkownik
    • Moja strona domowa

# Czerwiec 27, 2007, 19:28:59
Można też trzymać odpowiednie wektory (forward, up, right) + górny wierzchołek stożka + kąty pomiędzy przeciwległymi ścianami bocznymi. Można sobie trochę zoptymalizować frustum culling dzięki temu (ta metoda jest opisana w GPG 5).

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Czerwiec 27, 2007, 19:50:53
Doczytałem dokładniej i w tym tutorialu do którego podałem wyżej linka poprawili ten błąd zrobiony przez twórcę metody w GPG5.

Riddlemaster: Właśnie o tym mówię - to jest reprezentacja radarowa :)

Offline Riddlemaster

  • Użytkownik
    • Moja strona domowa

# Czerwiec 27, 2007, 19:58:34
O faktycznie, nie przeczytałem ostatniego akapitu ;)

.

  • Gość
# Czerwiec 27, 2007, 22:11:15
Mam pytanie do tych którzy dorobili się już jakiejś swojej biblioteczki matematycznej: Jak reprezentujecie frustum?
Ja:
1.) Za pomocą 12 float'ów, albo standardowej macierzy (projekcji) 4x4 (było o tym już na warsztacie)
2.) Co klatkę konwersja macierz -> 6 płaszczyzn
3.) Dla debugera i edytora, żeby rysowal (w oknach) 6 płaszczyzn->(konwersja 8 wierzchołków + pozycja) i (rep. radarowa)

Cytuj
Umiem wyznaczać je na podstawie macierzy (Widoku*Rzutowania), a moje funkcje do kolizji wymagają raz jednej, raz drugiej reprezentacji, a czasami nawet obydwu (jak trójkąt-frustum albo frustum-frustum). Znacie jakieś lepsze rozwiązanie albo jakieś dobre źródło na takie tematy?
Na tym etapie usuwania niewidocznych powierzchni wystarczy frust/sfera. Ale to już pewnie na płaszczyznach zrobiłeś.

Offline orzech

  • Użytkownik
    • homepage

# Czerwiec 27, 2007, 22:22:59
Wydaje mi się, że reprezentowanie obszaru widzenia przy pomocy 6 płaszczyzn jest sensownym rozwiązaniem (u mnie tak jest). Sprawdzanie, czy coś znajduje się w polu widzenia, jak wszyscy wiemy, jest trywialne. Poza tym jest to podejście, które pozwala Ci na największą dowolność (czego - nie jestem pewny - nie ma przy podejściu radarowym).

Pozdrawiam!

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Czerwiec 28, 2007, 13:30:57
Cytuj
Cytuj
Umiem wyznaczać je na podstawie macierzy (Widoku*Rzutowania), a moje funkcje do kolizji wymagają raz jednej, raz drugiej reprezentacji, a czasami nawet obydwu (jak trójkąt-frustum albo frustum-frustum). Znacie jakieś lepsze rozwiązanie albo jakieś dobre źródło na takie tematy?
Na tym etapie usuwania niewidocznych powierzchni wystarczy frust/sfera. Ale to już pewnie na płaszczyznach zrobiłeś.
Tak, ale za punkt honoru postawiłem sobie napisać funkcję do kolizji między wszystkim a wszystkim co tylko uwzględniam w swojej bibliotece :) więc także trójkąt-trójkąt, trójkąt-frustum, promień-frustum, AABB-frustum czy frustum-frustum. Kiedy już to zrobiłem, kombinuję dalej, bo wiem że reprezentacja radarowa może znacznie sprawę przyspieszyć - przynajmniej test sfera-frustum.