Virtuális világ tárolása - kérdések Számítógépes Grafika Klár Gergely tremere@elte.hu Eötvös Loránd Tudományegyetem Informatikai Kar Hol táruljuk az adatokat? Mem. vagy HDD? Mire optimalizálunk? Rajzolás vagy szerkesztés? Milyen koordináta-rendszerben tároljuk őket? Világ vagy modell kr? 2010/2011. őszi félév Geometria brute force tárolása Geometria brute force tárolása Legyenek a primitíveink poligonok. Legyünk lusták, és minden poligont tartsuk nyílván az összes csúcsával. Poligonokkal kapcsolatos feladatok: tárolás transzformálás szomszédsági lekérdezések s t r u c t t r i a n g l e { f l o a t x1, y1, z1 ; f l o a t x2, y2, z2 ; f l o a t x3, y3, z3 ; } ;
A brute force tárolás elemzése Index buffer-ek Tárolás: ha vannak poligonoknak közös csúcsai, akkor ezeket többször tároljuk feleslegesen Ñ nem túl jó. Transzformálás: a közös csúcsokra annyiszor fogjuk el végezni a transzformációkat, ahányszor szerepelnek Ñ nem hatékony. Lekérdezések: fogalmunk sincs, ki kinek a szomszédja, csak az összes csúcs bejárásával tudunk eredményre jutni Ñ katasztrófa. Egyetlen előnye, hogy ennél egyszerűbben már nem is lehetne tárolni. Alapötlet: tároljunk minden csúcsot egyszer, egy nagy közös tömbben! A poligonok csak hivatkozzanak a csúcsok tömbjének elemeire. Ez az index buffer. Minden GPU támogatja. Index buffer-ek Példa s t r u c t t r i a n g l e { unsigned i n t a, b, c ; } ; s t r u c t vec3 { f l o a t x, y, z ; } ; std : : vector <vec3> i n d e x B u f f e r ; Vegyünk egy N N db négyzetből álló rácsot! Mérete index buffer nélkül: 4 csúcs/négyzet, N N négyzet: 4N 2. Mérete index buffer-rel: összesen pn 1q pn 1q csúcs: pn 1q 2 N 2 2N 1. 4N 2 vs. N 2 2N 1 4N 2 N 2 2N 1 0 3N 2 2N 1 N 1, ha N P Z
Példa folyt. Index buffer-ek GPU-n Ha több mint egyetlen négyzetünk van, már megéri. Pl. ha N 10 Mérete index buffer nélkül: 400 csúcsot tárolunk és transzformálunk Mérete index buffer-rel: 121 csúcsot tárolunk és transzformálunk Minden videókártya, amit még nem gyűjtenek a múzeumok támogatja az index buffer-eket. A csúcspontok tömbje (vertex buffer) nem csak pozicókat tartalmaz, hanem normálvektorokat, textúra-koordinátákat, és még sok mást. Egy hivatkozás a vertex buffer-ra mindezekre együtt hivatkozik. Kocka probléma Kocka probléma Ha egy kockát rakunk össze háromszögekből, akkor egy sarokban lévő csúcs min. három, max. hat háromszögnek a csúcsa. Index buffer-rel elég lenne 8 csúcsot nyílvántartani. Mi lesz a normálisokkal? Hogy éles sarkai legyenek a kockának a normálisoknak merőlegesnek kell lennie a lapokra! Oldalanként külön meg kell adni a csúcsokat: összesen 3 8 csúcs kerül az vertex buffer-ba.
Az Index buffer-es tárolás elemzése Szomszédsági viszonyok Tárolás: ált. hatékony. Transzformálás: hatékony. Lekérdezések: közös csúcsokat már tudunk, de igazából még mindig fogalmunk sincs. Néha kellenek a szomszédok, pl. felület-feolsztásoknál. Ismertek a csúcsok ñ számítható mi, minek a szomszédja. Egy csúcsban tetszőleges számú poligon találkozhat ñ dinamikus adatszerkezet kéne. Jobb megoldás: Szárnyas-él (winged-edge) adatszerkezet! Szárnyas-él adatszerkezet Egyetlen él adatai Határfelület leíró (B-rep) szerkezet. Az élek szempontjából tároljuk a felületet. Minden élhez fix számú adat tartozik. Segítségével gyorsan körbe lehet járni egy poligon éleit, közben megkapva minden szomszédot. csúcs lap balra jobbra él start vég bal jobb előző köv. előző köv. a B A 0 1 c b d e
Egyéb táblázatok Példa: tetraéder Csúcsok táblája Lapok táblája csúcs ID csúcsból induló él lap ID lap egy éle Shirley, Fundamentals of Computer Graphics Pl.: Összes szomszéd egy lapra Pl.: Összes lap egy csúcsból def allneighbours ( face, edges, v e r t i c e s, faces ) : startedge = faces [ face ] edge = startedge i f edges [ startedge ]. f a c e L e f t == face : while edges [ edge ]. succleft!= startedge : p r i n t edges [ edge ]. faceright edge = edges [ edge ]. succleft else : while edges [ edge ]. succright!= startedge : p r i n t edges [ edge ]. f a c e L e f t edge = edges [ edge ]. succright def allfaces ( vertex, edges, v e r t i c e s, faces ) : startedge = v e r t i c e s [ v ertex ] edge = startedge done = False while not done : i f edges [ edge ]. v e r t S t a r t == vertex : p r i n t edges [ edge ]. f a c e L e f t edge = edges [ edge ]. predleft else : p r i n t edges [ edge ]. faceright edge = edges [ edge ]. predright
Hierarchikus adatszerkezetek Világ, benne Objektumok, ami Primitívekből állnak, amiket Pontok határoznak meg.! Színtérgráf motiváció 1. Minden szint a hozzátartozó tulajdonságokat tartja nyílván. Objektum név, modellezési transzformáció, befoglaló doboz, stb. Primitív primitívre jellemző tulajdonságok Pont koordináták Ahol én vagyok ott van a karom is. (Jobb esetben...) Ha mozgatom a karom, elmozdulnak (világtérben) az ujjaim is. Tudom úgy mozgatni az ujjaimat, hogy közben se a karom, se én nem mozdulok el.
Színtérgráf motiváció 2. Ha mozog egy bicikli, mozognak vele a kerekei meg a kormánya is. A kormányt lehet külön forgatni, és forgatja az első kereket. A két kerék tud forogni a tengelye körül, anélkül hogy a biciklit forgatni kéne. Színtérgráf Irányított, körmentes gráf (DAG). A színtér ( világ) összes elemét tartalmazza. Az egyes elemek alá-/fölérendeltségi viszonyaik szerint kapcsolódnak egymáshoz. Szülő vagy ős: ahonnan kiindul az él Gyerek: ahova mutat az él A szülő tulajdonságai öröklődnek a gyerekre, amiket a gyerek pontosíthat (pl. transzformációk), vagy felülírhat (pl. színek)
Csomópontok A gráf egy csomópontja (csúcsa, node-ja) lehet geometria, transzformáció, anyagjellemzők, fényforrás, kamera. Csomópontok tulajdonságai Csomópontok tulajdonságai Geometria A rendszer által támogatott tetszőleges modell leírás. Pl. Mesh. A gráfban levélként szerepel. Transzformáció Gyak. 4 4-es transzformációs mátrix. Az új transzformációs csomópont nem felülírja a megelőzőket, hanem azokkal együtt hat. Anyagjellemzők Színek, optikai tulajdonságok, textúrák, stb. Nyitott kérdés: hogyan ábrázoljuk, ha egy modellünk több textúrát is használ? Fényforrás Kamera Poziciója, iránya, típusa, színe, stb. Levele a gráfnak. Pozíciója, nézeti iránya, látószöge, stb. Levele a gráfnak.
Színtérgráf a gyakorlatban Színtérgráf OGRE-ben Minden komolyabb 3D alakalmazás használ valamilyen szintérgráfot. Példák: Maya, Java3D OpenSceneGraph OGRE Ogre::SceneNode: általános osztály, amihez az aktuális elemeket hozzá lehet csatolni az Ogre::MovableObject osztályon keresztül. Tulajdonságai: Bounding box pozíció és összesített pozíció orientációra hasonlóan méretezés tetszőleges felhasználói adat Ogre::MovableObject Ogre::MovableObject Tulajdonságok: Saját bounding box Rejtett vagy sem? Vethet árnyékot? Milyen fények tartoznak hozzá? Transformációkat nem tartalmaz!
Ogre::Entity Színtérgráf OGRE-ben Egy kirajzolható objektum! Se nem maga az objektum geometriája, se nem az anyagjellemzői. Ezeket külön objektumok tárolják, ez az osztály csak hivatkozik rájuk. Geometria: Ogre::Mesh Anyagjellemzők: Ogre::Material...és még sok más objektum. Tanulság: Rengeteg specializált osztály, mindegyik csak a maga feladatával foglalkozik. Amit több helyen is fel lehet használni (Mesh, Material), azt nem kell feleslegesen többször létrehozni. Ahol közös tulajdonságok vannak, azok magasabb szinten vannak összefogva. Színtérgráf összefoglaló CSG modell Valamilyen színtérgráfot érdemes implementálni. Szétválasztja az elhelyezést, a formát és a megjelenést. Lehetővé teszi az egymáshoz képesti relatív elhelyezést. DE, szem előtt kell tartani, hogy milyen szintig érdemes elbonyolítani. Constructive solid geometry: konstruktív tömör test geometria A modellünket = primitívek + műveletek Primitívek: téglatestek, hasábok, hengerek, gúlák, kúpok, gömbök. Műveletek: boolean műveletek, unió, különbség, metszet.
CSG fa Különbség Metszet Unió A műveletek eredményein újabb művelet hajtható vége. object = primitive object = object operation object Bináris fával jól leírható! Belső csúcsok: műveletek Captain Sprite, en.wikipedia Captain Sprite, en.wikipedia Captain Sprite, en.wikipedia Levelek: primitívek Gyökér: végleges objektum CSG fa CSG modellek megjelenítése Inkrementális képszintézis: tesszelálni kell. Sugárkövetés: speciális sugár/model metszéspont számítás Ñ CSG-fa bejárása. Zottie, wikipedia
CSG modellek metszése CSG modellek metszése Levél: triv., metszéspontok: p t 1 v és p t 2 v A sugár pp t 1 v, p t 2 vq szakaszon a primitív belsejében halad. Összes levélből: t 1... t n, elég ezeket vizsgálnunk. Szakasz-listákat fogunk nyílvántartani. Belső csúcsok: a gyerekektől származó szakasz-listákra is végrehajtjuk a műveletet Y Összeérő szakaszokat egyesítjük, különben hozzávesszük a listához. X Kiszámítjuk a szakaszok metszeteit. z Kivonjunk a szakaszokat egymásból. Gyökérben: a legkisebb pozitív t értékű pont lesz a szemhez legközelebbi metszés. Ha a metszések száma páros: kívül vagyunk az objektumon, ha páratlan, akkor a belsejében.