|
Gondolom, már ismerős az eljárás, ami a textúra leképezést végzi
(ami engem illet, én a GameDev.Net oldalon találtam meg, az oldal egyébként
elég jó), és érdekelne, hogy működik az egész, minek ide a vektorszorzás, meg
ilyesmi. Érdekes módon nem találtam meg a neten az algoritmus leírását, így
nekiálltam magamtól a visszafejtésnek. |
|
Nos, feltéve, hogy a vektorok fogalma ismerős, íme a magyarázat.
Egyszerűen addig alakítgatom az egyenleteket, amíg azt nem kapom, amit az
eljárás használ.
|
Nos, kezdjük! A definíciók szerint P a poligon egyik
tetszőleges sarka, M és N pedig két
lineárisan független (de nem feltétlenül merőleges) vektor a poligon síkjában.
Lásd a rajzot a bal oldalon.
Az algoritmus feltételezi, hogy |M| és
|N| a poligon oldalainak méretei. Ebben az esetben a
textúra éppen 1x1-szer fér el a poligonon. Ha a vektorok méretét felére
csökkentjük, 2x2 textúrát kapunk a poligonon stb. |
A poligon egy tetszőleges pontja (vagy ekvivalensen a pont helyvektora) -
legyen ez Q - leírható a P,
M és N vektorok kombinációjaként.
Q=P+u*M+v*N
Vetítsük Q-t a képernyőre! A nézőpont legyen az origóban
van, a vetítési sík z=1. Így a pont vetítőegyenletei meglehetősen egyszerűek
lesznek.
Qy/sy=Qz/1, és így Qy=sy*Qz.
Hasonlóan, Qx=sx*Qz. |
|
Visszaírva ezeket Q egyenletébe, ezt kapjuk:
Qz*{sx,sy,1}=P+u*M+v*N
Ez kifejtve három egyenletet jelent Qz-re, u-ra és v-re, amit a rögös úton
járva elvileg ki lehet számítani. Szerencsére tudjuk, hová szeretnénk eljutni,
így egy kicsit könnyebb a dolog. :-)))
Számítsunk skalárszorzatot, a fentieket megszorozva
(PxN)-nel:
Qz*S.(PxN)=
P.(PxN)+
u*M.(PxN)+
v*N.(PxN)
Itt jön a lényeg: minden a és b
vektorra, a.(axb)
nulla, hiszen a két vektor vektoriális szorzata merőleges a vektorokra, viszont
két merőleges vektor skaláris szorzata nulla. Ettől sokat egyszerűsödik az
egyenlet:
Qz*S.(PxN)=
u*M.(PxN)
Persze meg kell szabadulnunk Qz-től. Ehhez szorozzuk meg az eredeti egyenletet
mégegyszer, ezúttal (NxM)-mel:
Qz*S.(NxM)=
P.(NxM)+
u*M.(NxM)+
v*N.(NxM), és
így
Qz*S.(NxM)=
P.(NxM)
Már látszik a vége! :-) Osszuk el a kettőt:
(S.(PxN))/
(S.(NxM))=
u*(M.(PxN))/
(P.(NxM))
Szerencsére, tud(hat)juk, hogy
(axb).c=
(bxc).a=
(cxa).b, és így
(S.(PxN))/
(S.(NxM))=u, és ez
pontosan az, amit ki akartunk számítani. v hasonlóan kapható meg:
(S.(MxP))/
(S.(NxM))=v
(Vektoriális szorzáskor figyelni kell a vektorok sorrendjére!)
Most már csak végig kell futtatni sx-et és sy-t a poligonon, és a
fenti képlet megadja a textúra koordinátákat. És ennyi az egész.
Még egy dolog érdekes lehet: amennyiben valaki "depth fogging"-ot
akar számolni, szüksége lesz Qz értékére. Ez a fentiek alapján könnyen
számítható, például:
Qz=(P.(NxM))/
(S.(NxM))
A cikk utoljára frissítve: 2006.01.
Vissza a lap tetejére |
Vissza a nyitóoldalra
|