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.