790 likes | 918 Views
ELTE IK Számítógépes Grafika II. Térbeli adatszerkezetek. Jeni László Attila jedi@inf.elte.hu. Áttekintés. Miért kellenek nekünk térbeli adatszerkezetek? Láthatósági probléma Mi az amit látok a színtérből? Metszéspontok számítása Mit talált el a játékos?
E N D
ELTE IK Számítógépes Grafika II. Térbeli adatszerkezetek Jeni László Attila jedi@inf.elte.hu
Áttekintés • Miért kellenek nekünk térbeli adatszerkezetek? • Láthatósági probléma Mi az amit látok a színtérből? • Metszéspontok számításaMit talált el a játékos? • ÜtközésfigyelésNekiütközött-e a játékos egy falnak? • Térbeli lekérdezésekHol van a legközelebbi Medikit?
Láthatósági probléma (már megint?!) • „Klasszikus” módszerek • Hátlap eldobás, Látógúlával metszés • Festő algoritmus, Z-puffer, Warnock • BVH (Bounding Volume Hierarchy) • BSP-fa, KD-fa, Octree, Grid-ek • „Modern” módszerek • Cellák és portálok (portal culling) • PVS (Potentially visible set) • Virtuális takaró objektumok, • Hierarchikus Z-puffer • Hierarchical occlusion maps • …
Motiváció (1) • Cél: • Mint ahogy a legtöbb gyorsítási módszernél, itt is az a cél, hogy ne végezzünk redundáns tevékenységeket a rajzolás során • Alapötlet • A nem látszódó geometriát ne rajzoljuk ki • Megoldások • Objektum-térben: • ami nem vetülhet a képernyőre, azt eldobjuk • Képernyő-térben: • takarásvizsgálat a képernyőre vetülő objektumok között
Motiváció (2) • Miért foglalkozunk még mindig ezzel? • Objektum-térben: • látógúlával metszés, hátlap eldobás • Képernyő-térben: • Z-puffer • Mert ezek a módszerek nem hatékonyak! • Futási idejük lineáris a geometriai primitívek függvényében.
Módszerek osztályozása • Osztályozhatjuk a módszereket a pontosságuk és a hatékonyságuk szerint • Konzervatív módszerek • Felülbecslik a láthatóságot és néhány nem látszó poligont is láthatónak tekintenek (újabban max. kb 30%). • Jó eredményt adnak, de nem optimálisak. • Agresszív módszerek • Alulbecslik a láthatóságot és látható poligonokat is eldobnak. • Ha kicsi a hibájuk, akkor esetleg használhatóak olyankor, amikor a konzervatív módszerek már túl lassúak. • Közelítő módszerek • Rosszul becslik, mind a látható, mind a nem látható poligonokat. • Akkor használhatóak, amikor nincs lehetőségünk egy költséges előfeldolgozási lépésre. • Pontos módszerek • Csak azokat a poligonokat tekinti láthatónak, amik ténylegesen megjelennek a képernyőn.
Klasszikus módszerek • Backface culling, View frustum culling • Painter, Z-Buffer, Warnock • BVH (Bounding Volume Hierarchy) • BSP-tree, KD-tree, Octree, Grids
Befoglaló testek (1) (BV - Bounding Volumes) • Egy egyszerű geometriájú objektum, amely egy bonyolultabb objektumot teljes egészében tartalmaz • Néhány fajtája • gömb (BS – bounding sphere), • téglatest (AABB - axis aligned bounding box), • illesztett (OBB – oriented bounding box), • poliéder (k-DOPs - discrete oriented polytopes)
Befoglaló testek (2) (BV - Bounding Volumes) • K-oldalú, illesztett poliéder
Befoglaló testek (3) (BV - Bounding Volumes) • Melyik az ideális befoglaló test?
Befoglaló testek hierarchiája(BVH - Bounding Volume Hierarchy) • A befoglaló testeket hierarchikus rendszerbe szervezzük • Ha egy befoglaló testet metsz a sugár / látógúla, akkor csak a gyerekeit kell megvizsgálni a metszés szempontjából • Jelentősen csökkenti a sugár - befoglaló test, illetve a sugár – objektum teszteket
Térfelosztás (1) • Térbeli adatszerkezeteket használunk, amik a teret valamilyen fajta részekre, cellákra osztják • Általában síkokat használunk, amelyek elválasztják az egyes féltereket • Szinte mindig valamilyen fa-struktúrába szervezzük ezeket • Minden egyes cellához meghatározzuk hogy mely objektumok esnek ezekbe a kisebb térrészekbe • Minden egyes cellára el tudjuk dönteni, hogy bele esik-e a látógúlába vagy sem, így csak a látható cellákban levő objektumokat kell kirajzolni • A leggyakoribb térfelosztó módszerek • Szabályos rács • Nyolcas (négyes) fa • Kd-fa • BSP-fa
Térfelosztás (2) • Felosztási módszerek
Térfelosztás (3) • Általában a legtöbb geometriai lekérdezésre, problémára nagyon időigényes pontos megoldást adni • Viszont általában tudunk adni egy gyors, közelítő konzervatív megoldást • Erre megfelelő egy olyan fa, amely rendelkezik az alábbi térbeli felosztó tulajdonságokkal • Egy szülő csúcs térrésze teljes egészében tartalmazza a gyermek csúcsok térrészeit • Ha egy lekérdezés sikertelen egy szülő csúcsra, akkor tudjuk, hogy sikertelen lesz a gyermek csúcsokra is • Ha egy lekérdezés sikeres egy szülő csúcsra, akkor megvizsgáljuk a gyermek csúcsokat is • Ha elértünk egy levélhez, akkor itt végrehajtjuk az időigényes lekérdezést • Általában a térfelosztásokat ilyen módon használjuk • Például ha nem látunk egy teljes térrészt, akkor ennek a gyermekeit sem láthatjuk
Szabályos felosztás(uniform grid) • Azonos méretű cellákraosztjuk fel a teret. • Minden cella tartalmazza abenne levő objektumoklistáját • Könnyű lekérdezni a szomszédoscellákat • Hátrány: • A felosztás teljesen függetlena színtér struktúrájától • Előny: • Egyszerű! • Könnyű meghatározni egy sugár által metszett cellákat(Bresenham alg. 3D-ben)
Kitérő: ray-casting • Sok megszorítással építjük fel a színteret: • Uniformizált háló: egy cella egyobjektum • Minden fal ugyanolyan magas • A falak 90 fokos szöget zárhatnak be egymással • Padló, plafon nincs textúrázva
Quadtree / Octree (1)definició • A gyökércsúcs a teljes színtér befoglaló doboza. • Ha az aktuális cellában a belógó befoglaló dobozok száma nagyobb, mint egy előre definiált érték, akkor a cellát a felezősíkjai mentén 8 egybevágó részcellára bontjuk (négyesfánál 4 részre). • A keletkező részcellákra ugyanazt a lépést rekurzívan megismételjük. • A gráf-építő folyamat egy adott szinten megáll, ha elértünk egy előre definiált maximális mélységet, illetve ha az adott cellában az objektumok száma egy előre definiált érték alá esik.
Quadtree / Octree (2)definició 1 2 1 3 1 3 1 2 2 1
Quadtree / Octree (3)a csúcsokban tárolt adatok • Miket célszerű tárolni egy-egy csúcsban? • Gyerek-mutatók (8 vagy 4) • Szülő-mutató • Hasznos, ha visszafelé kell mozogni a fában • A cella kiterjedése • Ez számítható is a fából, de könnyebb itt tárolni • A cellába tartozó adatok • Ezek lehetnek teljes objektumok, befoglaló testek, poligonok, … • Néhány algoritmusnál szükség lehet a szomszédos cellákra is • gyorsabb, mintha visszalépnénk a fában
Quadtree / Octree (4)az oktális fa felépítése • Kell egy buildNode eljárás • Veszi a csúcspontot a hozzá tartozó kockával és a kockába tartozó objektumok listájával • Létrehozza a gyerekcsúcsokat, szétosztja az objektumokat a gyerekcsúcsok között és folytatja a rekurziót a gyerekcsúcsokon, vagy • Beállítja a csúcsot egy levélnek ha már nem kell tovább osztani • Kezdetben meghatározzuk a gyökércsúcshoz tartozó kockát, létrehozzuk a gyökércsúcsot és meghívjuk rá a buildNode eljárást, átadva neki a színtér összes objektumát a listában
Quadtree / Octree (6)objektumok hozzárendelése egy cellához • Alapművelet: • Egy objektum metszése egy cellával (kockával) • Hogyan tudjuk ezt gyorsan elvégezni? • Olvasnivaló: • Graphics Gemshttp://www.acm.org/tog/GraphicsGems/ • [GG3] Voorhies, Douglas, Triangle-Cube Intersection • [GG4] Greene, Ned, Detecting Intersection of a Rectangular Solid and a Convex Polyhedron, • [GG5] Green, Daniel, and Hatch, Don, Fast Polygon-Cube Intersection Testing
Quadtree / Octree (7)egy objektum több cellában • TFH: egy objektum egynél több cellát is metsz • Tárhely miatt nem probléma, hiszen az objektumra mutató pointereket minden cellában tárolhatjuk • De néhány tesztnél ekkor kétszer (többször) vesszük ezt az objektumot figyelembe (pl. kirajzolás). • Megoldás: • Megjelöljük egy flag-el az adott objektumot a teszt során és a következő teszt előtt töröljük a flag-et • Egy jobb megoldás ha az aktuális képkocka számával jelöljük meg a feldolgozott objektumokat
Quadtree / Octree (8)szomszédos cellák • Néhány esetben hasznos lehet, ha ismerjük egy cella szomszédos celláit • Milyen messze lehetnek ezek egymástól a fában? (hány hivatkozáson keresztül lehet elérni őket?) • Hogyan használhatjuk fel a szomszédsági információt pl. egy sugár metszéspontjának számításához? • Egy „A” cella szomszédja: • Van egy közös oldalsíkjuk • Az „A” cella összes csúcspontja a közös oldal szomszédos területére esik • Nincs olyan gyermeke, amely rendelkezne ezekkel a tulajdonságokkal
Quadtree / Octree (9)szomszédos cellák megkeresése • Egy bináris fában egy csúcs jobboldali szomszédja a legközelebbi jobboldali részfa legbaloldalibb eleme • Visszafelé haladunk a fában, hogy megtaláljuk a jobboldali részfát • Ebben lefelé és balra haladunk, hogy megtaláljuk a legbaloldalibb csúcsot (de nem megyünk mélyebbre, mint ahonnan indultunk!) • Hasonló az eljárás a baloldali szomszédra • Az összes csúcs összes szomszédját egy inorder bejárással találhatjuk meg • Ez a módszer kiterjeszthető quad/octree-re
Quadtree / Octree (9)látógúlával metszés • El szeretnénk dobni azokat a térrészeket, amik nincsenek benne a látógúlában • Mikor látható egy cella? • A cella csúcspontjait vizsgáljuk a látógúlával: ha teljesen kívül esnek a gúla egyik síkján, akkor nem látható a cella • Különben a cella biztosan látható? • A gyökérből haladva végezzük el ezt a tesztet: • Ha sikertelen, akkor a cella nem látszik • Ha sikeres, akkor néhány objektum látható lehet • Ismételjük meg a tesztet a gyerek cellákra is
Quadtree / Octree (12)problémák • A fa nagyon kiegyensúlyozatlan lesz, ha a színtéren objektumok nem egyenletes eloszlással szerepelnek • Sok csúcspont nem fog objektumot tartalmazni • Ez a probléma abból származik, hogy mindig azonos részekre osztjuk fel a teret
Kd-fa (1)definíció • A kd-faa következő tulajdonságokkal rendelkezik • Minden csúcs egy egyenes oldalú térrészt reprezentál (az oldalak tengelyekre illesztettek) • Minden csúcshoz tartozik egy sík (tengelyre illesztett), ami két részre bontja a térrészt, és minden egyes részhez tartozik egy gyerek csúcs • A vágósíkok iránya váltakozik ahogy daraboljuk a területet • Gyakorlatilag az octree/quadtree általánosítása, ahol a vágósíkok nem csak egyforma méretűre bonthatják a teret
Kd-fa (3)mit tároljuk egy csúcsban? • Mutatókat a gyerek csúcsokra (mindig kettőt) • Egy mutatót a szülő csúcsra • hasznos ha visszafelé akarunk lépkedni a fában • A csúcs által meghatározott cella kiterjedését • xmax, xmin, ymax, ymin, zmax, zmin • A tartalmazott objektumokra mutató pointerek listáját • A szomszédsági viszony definiálása nehézkes a kd-fák esetében, általában nem szokták a szomszédos cellákat tárolni
Kd-fa (4)a fa felépítése • Kell egy buildNode eljárás • Veszi az adott csúcsot a hozzá tartozó cellával és a tartalmával • Meghatározza a vágósíkot, létrehozza a gyerek csúcsokat, szétosztja a tartalmazott objektumokat a gyerekek közt és folytatja a rekurziót, vagy • Beállítja a csúcsot egy levélnek • Meghatározzuk a gyökércsúcshoz tartozó cellát, létrehozzuk a gyökércsúcsot és meghívjuk a buildNode eljárást az összes objektum listájával • Hogyan válasszuk ki a vágósíkot és mikor álljunk meg az építési folyamatban?
Kd-fa (5)a vágósíkok kiválasztása • Két cél lebeg a szemünk előtt, amikor kettévágunk egy cellát • Minimalizálni szeretnénk a kettévágott objektumok számát • Kiegyensúlyozott fát szeretnénk építeni • Minden sík egyenlően ossza két részre az objektumokat • Test középvonal módszer • Egy lehetséges módszer ( a sík merőleges az x-tengelyre) • Rendezzük az összes objektum összes csúcspontját az x koordinátájuk szerint • A középső csúcspont x koordinátájára illesztjük a vágósíkot
Kd-fa (6)vágás egy költségmodell szerint • A fa felépítése során becsljük azt az átlagos időt, amelyet egy sugár a kd-fa bejárása során felhasznál és ennek a minimalizálására törekszünk. • Egy megfelelő költségmodell szerint úgy felezzük a cellát, hogy a két gyermek cellában lévő testek összes felülete közelítőleg megegyezzen, így a metszés ugyanakkora valószínűséggel következik be a gyermek cellákban.
Kd-fa (7)alkalmazás • A látógúlával történő vágás egyszerűen kiterjeszthető kd-fákra is • Kd-fa bejárása (metszés egy sugárral) • Szekvenciális bejárás • Rekurzív bejárás • Lásd: sünis könyv
BSP-fa (1)definíció • Binary Space Partition • Vágások sorozata, amely egy térrészt két részre oszt • A vágósíkok iránya tetszőleges lehet • A kd-fák általánosítása • kd-fa = tengely-illesztett BSP-fa • A teret konvex cellákra bontja • Elég elterjedt • Általában megfelelő a legtöbb színtérhez
1 2 1 2 4 3 out 5 7 A A out B 6 8 out 3 6 5 C out D out B C D 4 8 7 BSP-fa (2)példa • A vágósíkok félsíkok: a szülő csúcs síkjával történő metszésig tartanak • A belső csúcsok a vágósíkokat, a levelek pedig a térrészeket jelölik
BSP-fa (3)egy másik példa (Quake-stílusú) • Konvex sokszöghalmazokra vágjuk szét a teret 1 1 A 2 A 3 B C D 3 D C B 2
BSP-fa (4)mit tárolunk a csúcsokban • Pointerek a gyerek csúcsokra • Szülő csúcsra mutató pointer • Levelekben: a cella kiterjedését • Ezt hogyan kellene? • Belső csúcsokban: a vágósík • Pointerek a cellában tartalmazott objektumokra • Szomszédok? • Általában csak a levelekben szokták tárolni • Egy cellának sok szomszédja lehet • Portálokat (később)
BSP-fa (5)vágósík kiválasztása • Célok: • Minél kevesebb cella legyen • A vágósíkok essenek egybe a színtér poligonjaival • Minél kevesebb objektumot vágjunk szét • Heurisztikák: • A színtér poligonjainak síkjait választjuk • Kezdjük a legnagyobb poligonnal • Olyan síkot választunk, ami nem vág szét sok poligont • Olyan síkot választunk, ami egyenlően osztja szét az objektumokat • Véletlenszerűen választjuk a síkokat (meglepő, de ez sem olyan rossz választás néha)
BSP-fa (6)az objektumok rendezése • A BSP-fa felhasználható a benne levő objektumok rendezésére (előröl hátra, vagy fordítva) • Bejárjuk a fát egy adott nézőpontból • Az egyes vágósíkok nézőpont felöli oldalán levő objektumok, mindig a sík másik oldalán levő objektumok előtt helyezkednek el • Rendezés hátulról előre • Ekkor nincs szükségünk Z-pufferre • Helyes sorrendet ad az átlátszó poligonok kirajzolására is Z-pufferrel (nem kell két lépésben) • Rendezés előröl hátra • Csökkenti a felülírást a Z-pufferben • software rendering (pl. Doom, Quake)
HA a csúcs levél AKKOR láthatóKÜLÖNBENHA a vágósík nem metszi a gúlát AKKORHA a kamera a bal féltérben van AKKOR a teljes jobb részfa nem látható folytatjuk a rekurziót a bal gyerekreKÜLÖNBEN a teljes bal részfa nem látható folytatjuk a rekurziót a jobb gyerekreVÉGEKÜLÖNBEN folytatjuk a rekurziót a bal gyerekre folytatjuk a rekurziót a jobb gyerekreVÉGEVÉGE BSP-fa (7)látógúlával metszés • Ha egy vágósík nem metszi a látógúlát, akkor csak a kamerát tartalmazó féltér lesz látható • Példák: • #1: A, B, D, 2 • #2: A, C, G, 7, 8 • #3: A, B, E, 4, C, F, 5
Modern módszerek • Cellák és portálok (portal culling) • PVS (Potentially visible set) • Virtuális takaró objektumok, • Hierarchikus Z-puffer • Hierarchical occlusion maps • …
Cellák és portálok (1)bevezetés • Cél egy belső színtér bejárása • Épületek, labirintusok, … • Egy ilyen belső színtér általában természetes módon felbontható cellákra • Szobák, fülkék, folyosók, … • Az egyes cellákat átjárók (angolul portal ) kötik össze, amelyek átlátszóak • Kapualjak, bejáratok, ablakok, … • Az egyik szobából a másikba csak egy ilyen átjárón nézhetünk át
Cellák és portálok (2)működési elv • Kezdetben tekintsük az eredeti látógúlát • Az aktív cella az a szoba lesz, amelyikben éppen tartózkodunk (ahol a kamera van) • Kirajzoljuk a jelenlegi cellában található objektumokat (ami a látógúlába beleesik) • Minden egyes látható átjáróra az aktuális cellában: • A látótér vágósíkjait elvágjuk úgy, hogy csak akkora teret foglaljon magának, amekkorát a portál megenged • Átlépünk a átjáró másik oldalán található szobába és kirajzoljuk azt a módosított látógúlával • Ha a módosított látógúlába ebben a szobában is belelóg egy portál, akkor rekurzívan folytatjuk az eljárást
Cellák és portálok (3)példa Kamera
Cellák és portálok (4)példa Kamera
Cellák és portálok (5)példa Kamera
Cellák és portálok (6)példa Kamera