1 / 79

Térbeli adatszerkezetek

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?

faraji
Download Presentation

Térbeli adatszerkezetek

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ELTE IK Számítógépes Grafika II. Térbeli adatszerkezetek Jeni László Attila jedi@inf.elte.hu

  2. Á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?

  3. 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 • …

  4. 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

  5. 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.

  6. 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.

  7. Klasszikus módszerek • Backface culling, View frustum culling • Painter, Z-Buffer, Warnock • BVH (Bounding Volume Hierarchy) • BSP-tree, KD-tree, Octree, Grids

  8. 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)

  9. Befoglaló testek (2) (BV - Bounding Volumes) • K-oldalú, illesztett poliéder

  10. Befoglaló testek (3) (BV - Bounding Volumes) • Melyik az ideális befoglaló test?

  11. 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

  12. 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

  13. Térfelosztás (2) • Felosztási módszerek

  14. 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

  15. 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)

  16. 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

  17. 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.

  18. Quadtree / Octree (2)definició 1 2 1 3 1 3 1 2 2 1

  19. 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

  20. 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

  21. Quadtree / Octree (5)egy példa

  22. 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

  23. 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

  24. 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

  25. 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

  26. 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

  27. Quadtree / Octree (10)látógúlával metszés

  28. Quadtree / Octree (11)egy példa

  29. 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

  30. 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

  31. Kd-fa (2)példa

  32. 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

  33. 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?

  34. 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

  35. 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.

  36. 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

  37. 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

  38. 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

  39. 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

  40. 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)

  41. 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)

  42. 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)

  43. 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

  44. Modern módszerek • Cellák és portálok (portal culling) • PVS (Potentially visible set) • Virtuális takaró objektumok, • Hierarchikus Z-puffer • Hierarchical occlusion maps • …

  45. 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

  46. 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

  47. Cellák és portálok (3)példa Kamera

  48. Cellák és portálok (4)példa Kamera

  49. Cellák és portálok (5)példa Kamera

  50. Cellák és portálok (6)példa Kamera

More Related