Page 3

2011.09.03. 16:39

Ennyi segítség elég ahhoz, hogy akár nulláról el lehessen kezdeni sugárkövetéssel foglalkozni.

 

Talán még a textúrázásról néhány gondolat, mert nem sok leírás tér ki a részletekre.

A normál polygon alapú grafikánál a háromszög három csúcsához tartozik 3 textúra koordináta. Ezek a texúra mappolását adják meg az adott háromszögre. Hogyan lehet ezeket raytrace-nél használni?

Minden felülethez rendelhető egy tangens-tér. Ha a tangens vektor a mappolás irányába áll, akkor ez felhasználható a textúrázáshoz. Erre is találunk leírást, ilyen mátrixok egyszerűen létrehozhatóak.

De mi miért van? Erről sehol nem lehet olvasni. Az egyenleteket kész tényként vágják hozzánk.

 

A mappoláshoz két vektor kell majd, ezek az u és v textúra koordináták tengelyeinek irányát mutatják majd a 3 dimenziós térben. A textúrák értelemszerűen 2 dimenziósak, u és v koordináták jelölik az x és az y tengelyeket, megegyezés és hagyomány alapján. UV mappolásnak is nevezik az adott technikát.

Az U és V vektorok 3 dimenzióban, azaz modeltérben a mappolási irányban állnak. De nem feltétlenül kell arra állniuk. Az itt részletezett megoldásban kissé egyszerűbb minden, így könyebb majd a lényeget megérteni.

Legyen egy háromszög v1,v2,v3 vertex koordinátákkal és uv1,uv2,uv3 textúra koordinátákkal. Más bemenő érték nem is kell.

Ezekből néhány alapvektor veszek fel.

nx=v2-v1

ny=v3-v1

nnx=normalize(nx)

 

uvx=uv2-uv1

uvy=uv3-uv1

nuvx=normalize(uvx)

 

Ezek a külső /model/ és belső /textúra/ koordináta-rendszerbeli vektorok, két élre felvéve. v1 csúcsból indul mind, az egyik v2-be megy, a másik v3-ba mutat. A normalizált vektorok irányvektorok és merőlegesség biztosítása lesz a feladatuk.

 

Az ny-nak merőlegesnek kell majd lennie az nx-re, és az uvy-nak az uvx-re.

Ez egyszerűen elérhető. Az ny vektort az nnx-el beszorozva megkapjuk azt a komponensét, amennyi 'belelóg' az nnx irányba. Ez egyszerűen csak ki kell vonni az ny-ból, aminek eredményeként az merőleges lesz az nx-re. A kivonás 'iránya' nnx.

ny'=ny - nnx*dot(nnx,ny)

Ugyan ezt eljátszuk az uv vektorokkal is.

uvy'=uvy - nuvx*dot(nuvx,uvy)

Ezzel meg is kaptuk a belső koordináták számolásához megkívánt vektor-halmazt. ny merőleges nx-re, így lehet velük koordináta-transzformációt végezni.

De ehhez előbb el kell osztani őket a hosszuk négyzetével.

nx=nx/dot(nx,nx)

ny'=ny'/dot(ny',ny')

Ez ugyan az, mintha azt írnám hogy  nx=normalize(nx)/length(nx) , hiszen a normalizás is a hosszával osztja a vektort.

Ezzel elértem azt, hogy beszorozva egy vektorral, a kapott vektor hossza akkor lesz pontosan 1, ha megegyezik az eredeti él hosszával, például a v2-v1 vektorral. Nyilván ha v2-v1 10 egység hosszú volt, akkor 0.1-el kell szorozni, hogy egyet kapjak. Ezért osztottam a vektort 10*10-el.

Miért jó nekem ez az 1? Mert most rászorozva az első él textúra vektorát /uvx/, pontosan megkapom az uv2 mappolási értéket, ha hozzáadom még az uv1-et. Hiszen vektor*1=vektor.

w=metszéspont-v1

UVmetszéspont=uv1 + uvx*dot(nx,w) + uvy'*dot(ny',w)

 

Ez már így mappol, de túl sok vektort kellene letárolni /5-öt./ De átrendezhető az egyenlet, így elég 3 vektor, ami egy 3x3-as mátrixot ad.

kx=nx*uvx.x + ny'*uvy'.x

ky=nx*uvx.y + ny'*uvy'.y

 

így már sokkal egyszerűbb számolni

UV.x=uv1.x + dot(kx,w)

UV.y=uv1.y + dot(ky,w)

 Ez valójában egy vektor szorzása mátrixxal, ami megadja a metszéspont textúra koordinátáit.

 

Látszik, hogy a mappolás iránya se nem nx, se nem ny'.  nx az első él iránya, ny' erre merőleges.

De mégis helyes érteket ad az egyenlet. 

 

 

süti beállítások módosítása