Praca magisterska BVH
Praca magisterska BVH Praca magisterska BVH
26 Spłaszczone hierarchiczne przedziały ograniczające Listing 2.2. Przykładowy kod źródłowy węzła drzewa SBIH2. s t r u c t { } ; f l o a t plaszczyznaMin [ 4 ] ; f l o a t plaszczyznaMax [ 4 ] ; i n t wskaznik [ 4 ] ; i n t liczbaTrojkatow [ 4 ] ; 2.2.2. Budowa struktury Budowa struktury SBIH jest bardzo podobna do budowy hierarchicznych struktur drzewiastych opisanych w punkcie 1.2.2. W tym punkcie budowa ta zostanie opisana dokładnie. Opis zmiennych pomocniczych: n i bb i C i liczba trójkątów w i-tym kubełku; bryła AABB otaczająca wszystkie trójkąty znajdujące się w i-tym kubełku; środek ciężkości i-tego trójkąta; BB i N L,j N R,j bryła AABB i-tego trójkąta; suma wszystkich n i od 0 do j, N L,j = ∑ i=j i=0 n i ; suma wszystkich n i od j + 1 do n, gdzie n to liczba wszystkich kubełków, N R,j = ∑ i=n i=j+1 n i ; A L,j pole powierzchni bryły otaczającej trójkąty znajdujące się w kubełkach od 0 do j, A L,j = SA( ∪ i=j i=0 bb i ); A R,j pole powierzchni bryły otaczającej trójkąty znajdujące się w kubełkach od j + 1 do n, A R,j = SA( ∪ i=n i=j+1 bb i ); Algorytm budowy: 1. oblicz bryły otaczające dla wszystkich trójkątów (można to zrobić efektywnie z wykorzystaniem instrukcji SIMD), w tym kroku oblicz również środki ciężkości wszystkich trójkątów oraz bryłę V otaczającą całą scenę 2. wrzuć na stos węzeł zawierający wszystkie trójkąty 3. wykonuj poniższą pętlę dopóki stos jest niepusty: (a) ściągnij z wierzchołka stosu węzeł z danymi do stworzenia drzewa; (b) jeśli w danym węźle jest mało trójkątów, to stwórz z niego liść i zakończ;
27 (c) dla kazdej z trzech osi: i. podziel trójkąty na kubełki według wzoru znajdującego się w artykule [Wal07] (dla każdego kubełka obliczaj podczas tej operacji n i oraz bb i ); ii. za pomocą zmiennych n i i bb i wylicz N L,j , N R,j oraz A L,j i A R,j ; iii. korzystając ze zmiennych N L,j , N R,j , A L,j i A R,j oblicz z wykorzystaniem SAH najlepszy podział (niech to będzie miejsce l); iv. uaktualnij zmienne N L,j , N R,j , A L,j i A R,j tak jakby kubełki 0, ..., l oraz l + 1, ..., n tworzyły osobne węzły; v. oblicz z wykorzystaniem nowych zmiennych dwa najlepsze podziały (jeden dla koszyków od 0 do l, drugi dla koszyków od l + 1 do n); vi. zapamiętaj wszystkie 3 podziały, jeśli wynik SAH jest lepszy niż dla pozostałych osi; (d) posortuj trójkąty w tablicy według otrzymanego podziału metodą podaną w punkcie 1.2.4; (e) wrzuć na stos dane potrzebne do stworzenia poddrzew z 4 otrzymanych podzbiorów trójkątów. Struktury SBIH i SBIH2 różnią się jedynie szczegółami implementacyjnymi w tworzeniu węzłów wewnętrznych i liści. Ogólny schemat algorytmu jest identyczny. Jak łatwo zauważyć, techniki budowy hierarchicznych drzew opisane w punkcie 2.2.2 zostały tu umiejętnie wykorzystane. Większa zmiana była potrzebna jedynie w przypadku implementacji heurystyki SAH, która w tym wypadku jest wywoływana trzykrotnie podczas tworzenia jednego węzła. Dzieje się tak, ponieważ każdy z tych trzech podziałów musi odbywać się wzdłuż jednej osi. Dokładna implementacja algorytmu budowy opisanych drzew znajduje się w pliku traversetree.cpp, który znajduje się w źródłach programu. Plik ten jest dołączony do pracy, więcej informacji można znaleźć w dodatku A. 2.2.3. Uaktualnianie struktury Poza budową struktura ta nadaje się idealnie do szybkiego uaktualniania. Uaktualnianie takie jest bardzo przydatne w scenach animacji, gdy mało obiektów w kolejnych klatkach zmienia swoje położenie. Najlepsze efekty można osiągnąć, gdy położenie to zmieniają w podobny sposób trójkąty do siebie przylegające. Takie uaktualnienie drzewa można zrobić w liniowym czasie względem liczby trójkątów w drzewie. Możliwe i bardzo intuicyjne jest tu rozwiązanie rekurencyjne, jednak jak już wcześniej wspominałem, warto się go pozbyć.
- Page 1: Uniwersytet Wrocławski Wydział Ma
- Page 5: v Spis treści Wprowadzenie . . . .
- Page 8 and 9: 2 Wprowadzenie Realizm widoczny na
- Page 10 and 11: 4 Wprowadzenie szym czasie. Duże k
- Page 12 and 13: 6 Technika śledzenia promieni punk
- Page 14 and 15: 8 Technika śledzenia promieni (a)
- Page 16 and 17: 10 Technika śledzenia promieni doc
- Page 18 and 19: 12 Technika śledzenia promieni Rys
- Page 20 and 21: 14 Technika śledzenia promieni Sha
- Page 22 and 23: 16 Technika śledzenia promieni (a)
- Page 24 and 25: 18 Technika śledzenia promieni Tra
- Page 26 and 27: 20 Technika śledzenia promieni tr
- Page 29 and 30: 23 ROZDZIAŁ 2 Spłaszczone hierarc
- Page 31: 25 niego ojcem. Dzięki temu rozwi
- Page 35: 29 (c) jeśli to węzeł wewnętrzn
- Page 38 and 39: 32 Wyniki w scenach ben i wooddoll.
- Page 40 and 41: 34 Wyniki nazwa sceny BVH SBVH BIH
- Page 42 and 43: 36 Wyniki SBIH i SBIH2, są dużo w
- Page 44 and 45: 38 Wyniki nazwa sceny BVH SBVH BIH
- Page 47 and 48: 41 ROZDZIAŁ 4 Wnioski i plany rozw
- Page 49 and 50: 43 DODATEK A Program atracer Do pow
- Page 51 and 52: 45 Bibliografia [App68] Arthur Appe
27<br />
(c) dla kazdej z trzech osi:<br />
i. podziel trójkąty na kubełki według wzoru znajdującego się w artykule<br />
[Wal07] (dla każdego kubełka obliczaj podczas tej operacji n i<br />
oraz bb i );<br />
ii. za pomocą zmiennych n i i bb i wylicz N L,j , N R,j oraz A L,j i A R,j ;<br />
iii. korzystając ze zmiennych N L,j , N R,j , A L,j i A R,j oblicz z wykorzystaniem<br />
SAH najlepszy podział (niech to będzie miejsce l);<br />
iv. uaktualnij zmienne N L,j , N R,j , A L,j i A R,j tak jakby kubełki 0, ..., l<br />
oraz l + 1, ..., n tworzyły osobne węzły;<br />
v. oblicz z wykorzystaniem nowych zmiennych dwa najlepsze podziały<br />
(jeden dla koszyków od 0 do l, drugi dla koszyków od l + 1<br />
do n);<br />
vi. zapamiętaj wszystkie 3 podziały, jeśli wynik SAH jest lepszy niż dla<br />
pozostałych osi;<br />
(d) posortuj trójkąty w tablicy według otrzymanego podziału metodą podaną<br />
w punkcie 1.2.4;<br />
(e) wrzuć na stos dane potrzebne do stworzenia poddrzew z 4 otrzymanych<br />
podzbiorów trójkątów.<br />
Struktury SBIH i SBIH2 różnią się jedynie szczegółami implementacyjnymi<br />
w tworzeniu węzłów wewnętrznych i liści. Ogólny schemat algorytmu jest identyczny.<br />
Jak łatwo zauważyć, techniki budowy hierarchicznych drzew opisane<br />
w punkcie 2.2.2 zostały tu umiejętnie wykorzystane. Większa zmiana była potrzebna<br />
jedynie w przypadku implementacji heurystyki SAH, która w tym wypadku<br />
jest wywoływana trzykrotnie podczas tworzenia jednego węzła. Dzieje się<br />
tak, ponieważ każdy z tych trzech podziałów musi odbywać się wzdłuż jednej osi.<br />
Dokładna implementacja algorytmu budowy opisanych drzew znajduje się w pliku<br />
traversetree.cpp, który znajduje się w źródłach programu. Plik ten jest dołączony<br />
do pracy, więcej informacji można znaleźć w dodatku A.<br />
2.2.3. Uaktualnianie struktury<br />
Poza budową struktura ta nadaje się idealnie do szybkiego uaktualniania. Uaktualnianie<br />
takie jest bardzo przydatne w scenach animacji, gdy mało obiektów<br />
w kolejnych klatkach zmienia swoje położenie. Najlepsze efekty można osiągnąć,<br />
gdy położenie to zmieniają w podobny sposób trójkąty do siebie przylegające. Takie<br />
uaktualnienie drzewa można zrobić w liniowym czasie względem liczby trójkątów<br />
w drzewie. Możliwe i bardzo intuicyjne jest tu rozwiązanie rekurencyjne, jednak<br />
jak już wcześniej wspominałem, warto się go pozbyć.