Növekményes képszintézis Jeni László Attila Magdics Milán
Miről lesz szó? Geometriai modellezés: geometriai transzformációk homogén koordináták Inkrementális képszintézis: nézeti csővezeték takarási feladat raszterizáció árnyalási mód
Modellezés A kurzus során (elsősorban) háromszögmodellekkel foglalkozunk Egyéb alternatívák: Görbék, parametrikus felületek Implicit felületek CSG Részecskerendszerek Térfogati modellek Fraktálgeometria, procedurális modellek
Tesszelláció Definiáljuk a modellt a saját koordinátarendszerében. Következő lépésben a modellt sokszögekre, általában háromszögekre bontjuk. Felületi pontokat jelölünk ki, és ezeket összekötve megkapjuk a modell huzalvázát.
Geometriai transzformációk A pontokat, vektorokat, egy alkalmas koordinátarendszerrel, számhármasokkal vagy számnégyesekkel írjuk le. A transzformáció a vektorok koordinátáin értelmezett műveletek. A lineáris transzformációk leírhatóak 3x3-as mátrixszorzással (nagyítás, forgatás, nyírás,…). Affin- (eltolás) és projektív- (középpontos vetítés) transzformációkhoz már nem elég ez a mátrix.
Skálázás A távolságokat és a méreteket a koordináta- tengelyek mentén függetlenül módosítja.
Forgatás A koordinátatengelyek körüli adott szöggel történő forgatás kifejezhető mátrix műveletekkel:
Rodrigues-képlet Adott vektor körüli tetszőleges szöggel való forgatás következő mátrixszal adható meg:
Homogén koordináták Pontjainkat mechanikai rendszerek súlypontjaként írjuk le. XhXh YhYh ZhZh w P1P1 P2P2 P3P3 P4P4 (X h,Y h,Z h,h) Az összsúly: h=X h +Y h +Z h +w A pont homogén koordinátái: (X h, Y h, Z h,h) Homogén, mert invariáns a skalárral történő szorzásra. Kapcsolat a Descartes- koordinátákkal: x=X h / h, y=Y h / h, z=Z h / h (homogén osztás) Fordítva: X h =x, Y h =y, Z h =z, h=1
Pontok a végtelenben? (X h, Y h, Z h,0) alakú homogén térbeli pontokhoz nem tartozik Descartes-koordinátarendszerbeli pont Ezek az ún. ideális, v. végtelen távoli pontok X h, Y h, Z h határozza meg azt az irányt (egy irányvektort), amellyel párhuzamos egyenesek a végtelenben, az (X h, Y h, Z h,0) ideális pontban metszik egymást Megjegyzés: mindkét irányban ugyanaz az ideális pont van ( -1-gyel való szorzás nem változtatja meg a pontot), így az egyenesek „körbeérnek” (ld. kifordulási probléma) A (0,0,0,0) pont nem része a térnek
Transzformációk homogén koordinátás alakja Homogén koordinátákat használva 4x4-es mátrixokkal írhatjuk le a transzformációkat. Eltolás Középpontos vetítés Lineáris transzformáció [x*d, y*d, 0, z+d] → Homogén lineáris transzformáció
Transzformáció-láncok Az alakzatokat általában egymást követő transzformációk sorozata módosítja. Ezeket T 1,T 2,…,T n 4x4-es mátrixokkal írjuk le: T n (…T 3 (T 2 (T 1 v))…) Mivel a mátrixszorzás asszociatív, így a zárójelek áthelyezhetőek: (T n …T 3 T 2 T 1 )v = Tv, ahol T a mátrixok szorzata. Tetszőlegesen hosszú transzformáció-sorozat leírható egyetlen transzformációval. Minden pontot a mátrixok szorzatával transzformálunk!
Kitérő: normálvektorok A normálvektorok (felületi normális) egy adott pontban a felület érintősíkjára merőlegesek, azaz háromszögek esetén merőlegesek a háromszögre. Az érintősík egyenlete: = 0, ahol P egy tetszőleges pont a síkon, n pedig a felületi normális. A fenti skaláris szorzatba egy pontot (x) helyettesítve megkapjuk a síktól mért előjeles távolságot Sok helyen szerepet játszik: Triviális hátsólap eldobás ÁrnyalásÜtközésstb. n P x x-P
Kitérő: normálvektorok A normálvektorok a T transzormáció (T -1 ) T inverz transzponáltjával szorzódnak! Az eredeti sík egyenlete: = 0 = 0 = 0 azaz az eredeti sík egy transzformált T*P pontja, és az inverz transzponálttal transzformált normális alkotja az új koordinátarendszerbeli síkegyenletet
Mi az inkrementális képszintézis? Képszintézis = a virtuális világról képet készítünk Ehhez több feladatot is meg kell oldani, többek közt takarási, árnyalási problémákat. Ezeket a feladatokat pixelenként függetlenül végrehajtva (nem használjuk fel a már megszerzett takarási, árnyalási információkat) a végrehajtási idő igen hosszú lesz. Néhány egyszerű elv alkalmazásával azonban jelentősen gyorsul a végrehajtás.
Alapelvek Pixelek helyett nagyobb egységekkel dolgozunk. Egy pixel takarási, árnyalási információinak meghatározásához felhasználjuk a megelőző pixel már kiszámított adatait (inkrementális elv). A szabadformájú elemeket sokszögekkel közelítjük (tesszelláció), mivel ezeket a legkönnyebb kezelni. Nem számolunk feleslegesen, a vágás során eltávolítjuk a nem látszó elemeket.
A másik alternatíva: sugárkövetés LlLlLlLl Árnyék sugár Tükör sugár p (Legalább) annyi sugár, ahány pixel Minden sugár mentén meg kell keresni a legközelebbi objektumot
Sugárkövető program typedef struct{double x,y,z}vec;vec U,black,amb={.02,.02,.02}; struct sphere{ vec cen,color;double rad,kd,ks,kt,kl,ir}*s, *best,sph[]={0.,6.,.5,1.,1.,1.,.9,.05,.2,.85,0.,1.7,-1.,8.,-.5,1.,.5,.2,1.,.7,.3,0.,.05,1.2,1.,8.,-.5,.1,.8,.8, 1.,.3,.7,0.,0.,1.2,3.,-6.,15.,1.,.8,1.,7.,0.,0.,0.,.6,1.5,-3.,-3.,12.,.8,1., 1.,5.,0.,0.,0.,.5,1.5,};yx; double u,b,tmin,sqrt(),tan();double vdot(A,B)vec A,B; {return A.x*B.x+A.y*B.y+A.z*B.z;}vec vcomb(a,A,B)double a;vec A,B; {B.x+=a* A.x;B.y+=a*A.y;B.z+=a*A.z;return B;} vec vunit(A)vec A;{return vcomb(1./sqrt( vdot(A,A)),A,black);}struct sphere *intersect(P,D)vec P,D;{best=0;tmin=1e30; s= sph+5;while(s-->sph)b=vdot(D,U=vcomb(-1.,P,s->cen)),u=b*b-vdot(U,U)+s->rad*s ->rad,u=u>0?sqrt(u):1e31,u=b-u> 1e-7?b-u:b+u,tmin=u>=1e-7&&u<tmin?best=s,u: tmin;return best;}vec trace(level,P,D)vec P,D;{double d,eta,e;vec N,color; struct sphere*s,*l;if(!level--)return black;if(s=intersect(P,D));else return amb;color=amb;eta=s->ir;d= -vdot(D,N=vunit(vcomb (-1.,P=vcomb(tmin,D,P),s->cen )));if(d sph)if((e=l ->kl*vdot(N, U=vunit(vcomb(-1.,P,l->cen))))>0&&intersect(P,U)==l)color=vcomb(e,l->color,color);U=s->color;color.x*=U.x;color.y*= U.y;color.z*=U.z;e=1-eta* eta*(1-d*d);return vcomb(s->kt,e>0?trace(level,P,vcomb(eta,D,vcomb(eta*d-sqrt (e),N,black))): black,vcomb(s->ks,trace(level,P,vcomb(2*d,N,D)),vcomb(s->kd, color,vcomb(s->kl,U,black))));} main(){printf("%d %d\n",32,32);while(yx<32*32) U.x=yx%32-32/2,U.z=32/2-yx++/32,U.y=32/2/tan(25/ ), U=vcomb(255., trace(3,black,vunit(U)),black),printf("%.0f %.0f %.0f\n",U);}/*minray!*/
Nézeti csővezeték A modellezési-koordinátarendszertől a képernyőig tartó transzformáció sorozat (viewing pipeline). Modellezési transzformáció Nézeti transzformáció Perspektiv transzformáció Vágás Homogén osztás Képernyő transzformáció Modell koordináták Képernyő koordináták
Modellezési transzformáció Mivel az objektumok a saját koordinátarendszereikben állnak rendelkezésünkre, így egy közös világ-koordinátarendszerbe kell átvinni őket. Ezt a célt szolgálja a modellezési transzformáció
Nézeti transzformáció Egyrészt elhelyezi a kamerát a virtuális világban. Másrészt a színtérre a kamera szemszögéből tekint. A szempozíció határozza meg a kamera helyét (eye), irányát a nézeti referencia pont mutatja (lookat) és a függőleges irányt jelölő up egységvektor a kamera billenő szögét adja. A kamera-koordinátarendszer ezekkel a következőképp definiálható:
Nézeti transzformáció Az inkrementális képszintézis későbbi lépéseit akkor könnyű elvégezni, ha a kamera az origóban helyezkedik el és –Z irányba néz. A T VIEW nézeti transzformáció világ-koordinátarendszerből a kamera- koordinátarendszerbe vált: [x’,y’,z’,1] = [x,y,z,1]T VIEW = [x,y,z,1]T TR T ROT
Perspektív transzformáció A perspektív transzformáció célja, hogy a modellezési és a nézeti transzformációval elhelyezett virtuális világot az ablak síkjára vetítse. A fov a kamera függőleges látószöge, az aspect az ablakszélesség és -magasság aránya, az f p és a b p pedig az első és hátsó vágósík szemtől mért távolsága. A nézeti transzformáció után a képszintézisben részt vevő pontok tartománya egy szimmetrikus csonka gúla. Normalizáljuk ezt a gúlát, hogy a nyílásszöge 90 fok legyen: yy zz fpfp fpfp bpbp bpbp
Perspektív transzformáció a normalizált nézeti gúlából A következő lépésben a csonka gúlát a perspektív vetítésnek megfelelően kell torzítani. Pontot pontba, egyenest egyenesbe kell átvinni, de a szempozíciót a végtelenbe kell elhelyezni. Ez nem lehet az euklideszi tér lineáris transzformációja. y z fpfp bpbp y z 1 1 Ez a transzformáció az eredetileg a szempozícióban találkozó vetítősugarakból párhuzamosakat csinál. Mivel ez nemlineáris transzformáció, így a kapott homogén koordináták negyedik komponense nem lesz 1 értékű. Ezzel végig kell osztani a többi koordinátát.
Vágás A vágás célja az összes olyan objektumrészlet eltávolítása, amely nem vetülhet az ablakra, vagy amely nem az első és hátsó vágósíkok között van. A homogén osztás után a vágási határok a következők: X min = –1, Y min = –1, Z min = –1, X max = 1, Y max = 1, Z max = 1. Belső pontokra így igaz: –1 X h /h 1, –1 Y h /h 1, –1 Z h /h 1 A szem előtt tartományok – a kamera-koordinátarendszerben – negatív Z kamera koordinátákkal rendelkeznek és a perspektív transzformáció után a negyedik koordináta z = –Z kamera lesz (amely mindig pozitív). Ekkor h-val szorozva eljutunk a vágási tartomány homogén koordinátás leírásához: –h X h h, –h Y h h, –h Z h h, h 0
Szakaszok vágása Cohen–Sutherland algoritmus Egy vágási tartományt határoló sík a teret két féltérre osztja, így könnyen eldönthető, hogy egy pont és a vágási tartomány azonos féltérben helyezkednek-e el. Jelöljük 1-el ha a pont nem a vágási tartomány félterében van és 0-val ha igen. Mivel 6 határoló sík van így egy 6- bites kódot kapunk. A kóddal rendelkező pontok a vágási tartományban, a többi pedig azon kívül található. Ha két kód ugyanazon a biten 1, akkor egyik végpont sincs a tartományban
Poligonok vágása Sutherland-Hodgeman algoritmus Itt is 6 egymás után végrehajtott félsíkra történő vágással valósítjuk meg. Ha egy pont belső pont, akkor a vágott poligonnak is csúcspontja. Ha külső pont, akkor eldobhatjuk. Új csúcspont keletkezik, ha két egymást követő pont közül az egyik belső, míg a másik belső pont.
Képernyő transzformáció A homogén osztás után eszköz-koordinátarendszerben kapjuk a pontokat. Utolsó lépésként ezeket a képernyő transzformációval a képernyő-koordinátarendszerbe visszük át. A képernyő bal-alsó sarka (V x,V y ), mérete V sx,V sy. Z min, Z max a lehetséges minimális és maximális mélység érték. Ekkor a [X d, Y d, Z d ] pontra alkalmazott képernyő transzformáció a következő képernyő pontot adja:
Takarási feladat megoldása A feladatot megoldó algoritmusok a képernyő- koordinátarendszerben működnek. Itt két pont akkor takarja egymást, ha az (X,Y) koordinátáik megegyeznek és az takarja a másikat, amelynek a Z koordinátája kisebb. A továbbiakban feltételezzük, hogy a tesszelláció eredményeképp háromszögeket kaptunk. Továbbá azt is feltesszük, hogy kívülről nézve a testre a háromszögek csúcsainak sorrendje az óramutató járásával ellentétes irányú.
Triviális hátsólap eldobás Ha a képernyő-koordinátarendszerben egy lap normálvektorának pozitív Z koordinátája van, akkor ez a lap a test hátsó, nem látható oldalán foglal helyet, így eldobható. Egyetlen konvex test esetén a takarási problémát ezzel meg is oldottuk. Konkáv vagy több test esetén az első lapok is takarhatják egymást, de ekkor is érdemes használni, mert átlagosan a felére csökkenti a kezelendő lapok számát. X,Y Z
Festő algoritmus Minden háromszöghöz egy alkalmas Z értéket rendelünk, rendezzük eszerint a lapokat és hátulról előrefelé kirajzoljuk őket. Nincs olyan módszer a Z érték kiválasztására, amely minden esetben helyes rendezést eredményezne. Fedés-teszt: a rendezés után minden háromszöget össze kell vetni az utána következővel, hogy nem fedi-e valamelyiket. Ha fedi, akkor átmozgatjuk az aktuális elé és onnan folytatni a tesztet.
Fedés teszt X,Y Z QP 1: P minden pontja a Q mögött van X,Y Z Q P 2: P és Q vetületét befoglaló téglalapoknak nincs közös részük
Fedés teszt X,Y Z Q P Z Q P rendbennem eldönthető 3: Q a P síkja előtt van 4: P a Q síkja mögött van X,Y Z Z Q P rendbennem eldönthető Q P
Fedés teszt 5: P és Q vetülete nem fedi egymást Ezen feltételek ellenőrzésének számításideje egyre növekszik, ezért ebben a sorrendben célszerű elvégezni őket.
Ciklikus takarás A fedéstesztek végrehajtása után is előállhat olyan helyzet, amikor a háromszögeknek nincs helyes rendezése.
Z-buffer A z-buffer algoritmus a takarási feladatot az egyes pixelekre oldja meg. Minden pixelre megkeresi azt a sokszöget, amelynek a pixelen keresztül látható pontjának a Z koordinátája minimális. A feldolgozás során minden pixelhez tároljuk az abban látható felületi pontok a legközelebbi Z koordinátáját. Ezeket a Z értékeket tartalmazó tömböt nevezzük z- buffernek.
Z-buffer működése Képernyő Z-buffer
Problémák Perspektivikus rövidülés (foreshortening): ez egy összenyomás a z tengely mentén, a perspektivikus transzformáció során következik be A kamerától távol eső tárgyak egymáshoz közel kerülnek, a mélységinformációk gyorsan veszítenek a pontosságukból. A távoli objektumoknál fedési problémák lépnek fel. Ugyanez a jelenség figyelhető meg a koplanáris háromszögeknél is.
BSP-fa Bináris térfelosztó fa Hatékony adatszerkezet a poligonok egymáshoz viszonyított helyzetének tárolásához. Megvalósítás: rekurzívan felosztjuk a környezetet félterekre a poligonok síkjainak segítségével ezek alapján felépítjük a BSP fát a poligonok lesznek az egyes részfák gyökérelemei
BSP-fa példa
AB A B
B CD B C D
CDEF C DE F
C1EF C E F G H GH
I F G H C J 6 25 C14F GHIJ
I F G H J K L F GHIJLK
Hogyan használható? I F G H J K L Tetszőleges féltérben állva, tetszőleges irányba nézve igaz az az állítás, hogy az ellentétes féltér objektumai nem fedik az aktuális féltér objektumait. Speciális inorder módon bejárva a fát helyes rajzolási sorrendet kapunk. Manapság csak ütközésvizsgálathoz vagy magasabb szintű takarásvizsgálatokhoz használják (occlusion culling).
Portálok A belső terek leggyakrabban szobákból és átjárókból állnak. Miért rajzoljuk ki az ajtó mögötti szobát ha az ajtó zárva van? Ha van egy portál (pl nyitott ajtó) a szobában, akkor csak a rajta keresztül látható térrészt kell kirajzolni. Nagyon jó előfeldolgozási lépés belső tereknél, külső környezetben azonban nem alkalmazható.
Occlusion Culling Ha egy nagy objektum elfoglalja a képernyő jelentős részét, akkor ne rajzoljuk ki az általa eltakart geometriát. Minden objektumhoz elkészítjük az árnyéktestét a kamera szemszögéből (az árnyéktest az a térrész, amelyet az objektum az adott nézőpontból kitakar). Ha valamely objektum teljes egészében egy másik árnyéktestében van, akkor azt eldobhatjuk. Rosszul alkalmazható sok kis objektumot tartalmazó belső tereknél.
Raszterizáció Meghatározzuk, hogy egy adott háromszög (a képernyő transzformációt követően) mely pixelekben látszik
Raszterizáció Pl. Z-buffer esetén hogyan lesz minden pixelre egy Z- értékünk, amikor csak a háromszögek csúcspontjaival számolunk? (Bilineáris) interpolációval! X Y Z Z(X,Y) = aX + bY + c Z(X,Y) Z(X+1,Y) = Z(X,Y) + a (X 1,Y 1,Z 1 ) (X 2,Y 2,Z 2 ) (X 3,Y 3,Z 3 )
Na már csak szín kellene… A pontok színét több összetevő határozza meg: Fényforrások A felület anyagtulajdonsága Az aktuális visszaverődési modell Az illuminációs modell A felületre húzott textúra stb. Bővebben az árnyalás c. előadáson
Árnyalási mód A raszterizációval meghatároztuk, hogy egy háromszög mely pixelekben látszik Azt, hogy ezekben a pixelekben hogyan értékeljük ki az aktuális visszaverődési modellt, az árnyalási mód határozza meg
Saját színnel árnyalás Minden háromszöget a saját színére festünk. Nem igényel semmiféle illuminációs számítást.
Konstans árnyalás A háromszögekre csak egyszer számítjuk ki a fényforrások hatását. Amennyiben valamelyik pixelben a sokszög látszik, akkor mindig ezzel a színnel jelenítjük meg.
Gouraud-árnyalás Háromszögek csúcspontjaiban értékeljük ki a fényforrásokból odajutó fény visszaverődését. Ezután a háromszögek belső pontjainak színét a csúcspontok színéből lineárisan interpoláljuk (vagyis a raszterizáció során a szín is interpolálódik).
Phong-árnyalás Meghatározzuk a normálvektorokat a háromszögek csúcspontjaiban és ezeket interpoláljuk a háromszögön belül. Ezután az árnyalási egyenletet minden belső pontra külön értékeljük ki.
Vége