• Nem Talált Eredményt

BSP fák

In document Fejlett grafikai algoritmusok (Pldal 113-116)

7. Ütközés-detektálás 112

7.2. BSP fák

egy-egy sugarat a négy keréknél. Ez a közelítés jól működik a gyakorlatban mindaddig, amíg feltehetjük, hogy csak a négy kerék van kapcsolatban a környezettel (út). Tegyük fel, hogy a gépkocsi egy síkon áll a kezdetekben és a sugarakat úgy helyezzük el, hogy a kezdőpontjaikat a kerekek és a környezet érintkezési pontjában helyezzük el. A kerekeknél elhelyezett sugarak metszését teszteljük a környezettel. Ha a sugár origója és a környezet közötti távolság nulla, akkor a kerék pontosan a talajon van. Amennyiben a távolság nagyobb, mint nulla, akkor a kerék nem érintkezik a környezettel, negatív érték esetén pedig a kerék behatol a környezetbe.

Az alkalmazás használhatja ezt a távolságot az ütközés-válasz kiszámítására - a negatív távolság a gépkocsit felfele mozgatná, míg a pozitív távolság a kocsit lefele mozgatná (hacsak a kocsi nem a levegőben repül egy rövid ideig).

A metszéstesztek felgyorsításához ahierarchikus ábrázolástalkalmazhatjuk, melyeket a számítógépes grafikában gyakran használunk. A környezetet BSP fával ábrázolhatjuk. Attól függően, hogy milyen primitíveket használunk a környezetben, különböző sugár-objektum metszési módszerek szükségesek.

Amire szükségünk van az a sugár útjában lévő legközelebbi objektum, emiatt a negatív sugárparaméterhez tartozó metszéseket is vizsgálnunk kell. Annak az elkerülésére, hogy két irányba kelljen keresni, a tesztelő sugár origóját mozgatjuk vissza addig, amíg kívül nem esik az út geometriájának határoló térfogatán és akkor teszteljük a környezettel. A gyakorlatban ez csak azt jelenti, hogy a 0 távolságban kezdődő sugár helyett, negatív távolságnál kezdődik a sugárnyaláb.

7.2. BSP fák

A bináris térparticionáló fáknak vagy BSP1 fáknak két lényegében különböző változata létezik, melyeket tengely-igazított (axis-aligned) és poligon-igazított (poligon-aligned) ne-vezzük. A fákat a felosztás művelet rekurzív végrehajtásával hozzuk létre. A felosztáskor egy sík2segítségével a teret két részre osztjuk, majd a geometriákat ebbe a két részbe rendezzük.

Egy érdekes tulajdonsága ezeknek a fáknak az, hogy ha a fákat egy bizonyos módon járjuk be, akkor a geometriai tartalma a fának lerendezhető tetszőleges nézőpontból.

7.2.1. Tengely-igazított BSP fák

A tengely-igazított BSP fát a következő módon hozzuk létre. Először a teljes színteret kerítjük be egy tengely-igazított befoglaló dobozba (Axis-Aligned Bounding Box, röviden AABB).

Az alapötlet az, hogy ezt követően rekurzívan felosztjuk ezt a dobozt kisebb dobozokra. A doboz egyik tengelyét kiválasztjuk és egy merőleges síkot állítunk elő, amely kettévágja a teret két dobozra. Néhány esetben rögzítik ezt a felosztó síkot, így pontosan két egyenlő részre osztja fel a dobozt. Máskor engedélyezve van a sík pozíciójának a megváltoztatása.

Egy olyan objektum, amelyet a sík elmetsz vagy ezen a szinten van eltárolva vagy mind a két részhalmaz eleme lesz vagy pedig ténylegesen szét van vágva a síkkal két különálló objektumra. Mindegyik részhalmaz ezután egy kisebb dobozban lesz és ez a felosztó-sík

1Angolul: Binary Space Partitioning trees

2Ez rendszerint a tér egy poligonja.

eljárást ismételjük felosztva mindegyik AABB-t rekurzívan addig, amíg valamilyen feltétel nem tejesül, ami megállítja a folyamatot. Ez a feltétel gyakran egy felhasználó által megadott maximális fa mélység vagy amikor egy dobozban lévő primitívek száma egy felhasználó által definiált küszöbérték alá nem esik. A7.1. ábra egy példát mutat egy tengelyigazított BSP fára.

A B

C

D E

1a sík

1b sík

0-ssík 2-essík

(a) Tér felosztás

0

A B

1a 1b

C 2

D E

(b) BSP fa struktúra. Mindegyik levél csomópont egy területet je-löl.

7.1. ábra. Tengely igazított BSP fa. A térfelosztás a tengely mentén bárhol megengedett, nem csak azok középpontjaiban. A térbeli térfogatokA-tólE-ig vannak felcímkézve.

Egy stratégia a doboz felosztására a tengelyek ciklikus váltogatása, vagyis a gyökérnél az x-tengely, a gyerekeknél az y-tengely és az unokák esetén a z tengely mentén vágunk, ezután ezt ismételjük. Egy másik stratégia az, hogy a doboz legnagyobb oldalát keressük meg és e mentén daraboljuk a dobozt. Például, a doboz az y-irányban nagyobb, ezután a vágás valamilyeny=dsík mentén fog megtörténni, aholdegy skalár konstans. Kiegyensúlyozott fához adértékét kell úgy beállítani, hogy a két tér részbe egyenlő számú primitív kerüljön. Ez egy számítás igényes és nehéz feladat, így gyakran ehelyett a primitívek átlag vagy medián középpontját választjuk.

Az elölről-hátra rendezés egy durva példa arra, hogy hogyan lehet a tengely-igazított BSP fákat használni. Tegyük fel, hogy egy N-nel jelölt csomóponton éppen áthaladunk. N a bejárás gyökere. AzN síkját megvizsgáljuk és a fa bejárását rekurzívan folytatjuk a sík azon oldalán, ahol a nézőpont elhelyezkedik. Így csak akkor kezdhetjük el a másik oldal bejárását, amikor a fa fél részét teljesen bejártuk. A közelebbi rész bejárása a fának befejeződhet, amikor egy csomópont doboza teljesen a nézőpont (pontosabban a közelebbi sík) mögött van.

Ez nem ad pontos rendezést, mivel az objektumok a fa több csomópontjában is lehetnek. Bár ez ad egy durva rendezést, amely gyakran hasznos. A bejárást a nézőponthoz viszonyított csomópont síkjának a másik oldalán elkezdve az objektumok egy hozzávetőleges rendezését kapjuk hátulról elölre haladva. Ez hasznos az átlátszóság rendezéskor (lásd5.4. fejezetet). Ez a bejárás hasznos egy sugárnak a színtér geometriához való ellenőrzése esetén. A nézőpont helyzetét egyszerűen a sugár kezdőpontjával kell felcserélni. Egy másik felhasználása a nézeti csonka gúla eltávolítása lehet.

7.2. BSP FÁK 115

7.2.2. Poligon-igazított BSP fák

A másik típusú BSP fa a poligon-igazított forma. Ebben a sémában egy poligont választjuk ki, mint felosztót felező síkként, amely ketté osztja a teret. Ez lesz a fa gyökere. Azt a síkot választjuk ki, amelyiken a poligon fekszik. Arra használjuk ezt a síkot, hogy a színtér maradék poligonjait felosszuk két halmazra. Azokat a poligonokat, amelyeket a felosztó sík elmetsz szétválasztjuk két elkülönülő darabra a metsző vonal mentén. Ezután a felosztó sík mindegyik félsíkjában egy másik poligont választunk felosztóként, amely csak az adott féltérben lévő poligonokat választja szét. Ezt addig folytatjuk rekurzívan, amíg az összes poligon be nem kerül a BSP fába. Egy hatékony poligon-igazított BSP fa előállítása időigényes eljárás és ilyen fákat általában egyszer számítunk ki és aztán az eltárolt változatot újra hasznosítjuk. Egy ilyen típusú BSP fát a7.2. ábrán láthatunk.

B A

7.2. ábra. Poligon-igazított BSP fa. A teret először az A poligonnal osztjuk fel. Ezután mindegyik féltér fel lesz osztvaB ésCpoligonokkal. ABpoligonnal meghatározott vágó sík a bal alsó sarokban lévő poligont metszi el és feldarabolja aztDésE poligonokra.

Általában az a legjobb, ha kiegyensúlyozott fát alakítunk ki, azaz egy olyat melynek minden levelének a mélysége ugyanaz vagy legfeljebb csak eggyel tér el a többitől. Egy teljesen kiegyensúlyozatlan fa nem hatékony. Egy példa erre egy olyan fa, ahol mindegyik felosztó poligont úgy választunk ki, hogy a sík egy üres altérre és az összes többi poligonra osztja fel a teret. Sok fajta stratégia létezik a felosztó síkot meghatározó poligon megkere-sésére, amely egy jó fát ad vissza. Egy egyszerű stratégia alegkevésbé-keresztezett feltétel.

Először több lehetséges poligont véletlenszerűen választunk ki. Azt a poligont használjuk, melyet legkevesebb alkalommal metszi el a többi poligon. Egy 1000 poligonból álló teszt színtér esetén empirikus úton bebizonyították, hogy elegendő csak 5 poligont vizsgálni vágási műveletenként ahhoz, hogy jó fát kapjunk eredményül. 5-nél több poligon tesztelésével nem kaptak jobb eredményt, habár ezt a számot valószínűleg növelni kell abban az esetben, ha a színtéren található poligonok száma nagyobb.

Ez a típusú BSP fa rendelkezik néhány hasznos tulajdonsággal. Az egyik az, hogy egy adott nézet esetén a struktúra pontosan bejárható hátulról-előre (vagy elölről-hátulra) haladva.

Egy egyszerű pont/sík összehasonlítással lehet meghatározni azt, hogy a kamera a gyökér sík melyik oldalán található. Ettől a síktól távolabb lévő poligonok azután kívül esnek a kamerához közelebbi oldal poligonjaitól. Most a távolabbi oldal halmaza esetén vesszük a

következő szint felosztó síkot és meghatározzuk, hogy a kamera melyik oldalán van. Az a részhalmaz, ahol a kamera megtalálható újból kívül van a közelebbi részhalmazon és a távolabbi oldali részhalmaz távolabb van a kamerától. Ezt rekurzívan folytatva az eljárás létrehoz egy pontos hátulról-előre haladó sorrendet és egyfestő algoritmussalmegjeleníthető a színtér. A festő algoritmus nem használZ-puffert; amennyiben mindegyik objektum ki van rajzolva hátulról előre haladva, mindegyik közelebbi objektumot rárajzoljuk a hátrébb lévő objektumra és így nincs szükségz-mélység összehasonlításra.

Például tekintsük avnézőpontot a7.2. ábrán. Figyelmen kívül hagyva a nézeti irányt és a nézeti csonka gúlát, avazAvágó sík bal oldalán helyezkedik el. Így aC, F ésG B, D ésE mögött vannak. C vágó síkkal összehasonlítvav-t azt kapjuk, hogyGa sík ellentétes oldalán van, így ezt jelenítjük meg elsőként. Bsík egy tesztje megadja, hogyE-tDelőtt kell megjeleníteni. A hátulról előre haladó sorrend ekkor,G,C,F,A,E,B,D. Megjegyezzük, hogy ez a sorrend nem garantálja, hogy az egyik objektum közelebb van, mint a másik. Másik felhasználása a poligon-igazított BSP fának az ütközés-detektálása.

In document Fejlett grafikai algoritmusok (Pldal 113-116)