Raycasting
- Raycasting
- Az algoritmus
- Sugarak indítása
- Metszések
- Parametrikus sugár és implicit felület metszéspontja
- Parametrikus sugár és parametrikus felület metszéspontja
- Sugár és implicit sík metszéspontja
- Sugár és normálvektoros sík metszéspontja
- Sugár és parametrikus sík metszéspontja
- Sugár és háromszög metszéspontja I.
- Sugár és háromszög metszéspontja II.
- Sugár metszése poligonnal
- Sugár és gömb metszéspontja
- Sugár és transzformált objektumok metszése
- Sugér metszése AAB-vel
- Források
Tekintsünk minden pixelre úgy, mint egy kis ablakra a világra.
Milyen színértéket vegyen fel ez a pixel? Nézzük meg, mi látszik onnan a világból és az alapján rendeljünk hozzá a pixelhez egy színt!
Az algoritmus
for each pixel:
cast a ray into the scene
for each object in scene:
check if the ray intersects the object
set pixel to the color of the closest object
Sugár
A sugárnak van
- egy kiindulási pontja
- egy iránya
A parametrikus sugár: ahol (félegyenes).
?, ? sugár kezdőpontja, sugár mögötti részek.
Sugarak indítása
A szempozcióból indítunk sugarakat minden pixel középpontján keresztül
Most: középpontosan szeretnénk vetíteni egy kamerába, a vetítési sík egy négyszögletes részét megfeleltetve a képernyőnek.
Kamera tulajdonságok
- Szempozíció (eye),
- Egy pont amire néz (center),
- Felfele irányt megadó vektor a világban (up),
- Nyílásszög, amekkora szögtartományt lát (fov),
- Vetítővászon mérete. Most legyen adott:
Ezek segítségével fogjuk megadni pixel világbeli koordinátáit.
Keressük a kamera saját (jobbkezes) koordináta-rendszerét.
- Nézzen a kamera irányba!
- Az tengely legyen merőleges mind -re, mind az irányra!
- Az tengely merőleges -ra és -re is:
Pixel koordináták
Legyen az pixel középpontja, a vetítősík egységnyi távolságra a nézőponttól!
Ekkor:
Ahol
A sugár egyenlete
A sugár egy félegyenes, amit kezdőpontjával és irányvektorával adhatunk meg.
Legyen a sugár kezdőpontja, pedig az irányvektora, ekkor megadja a sugár összes pontját.
Most a sugarak kezdőpontját az előbbieknek megfelelően számolhatjuk, azaz
A sugár irányvektora pedig
Metszések
A sugárkövető programok futásidejük döntő részében metszéseket fognak végezni.
Nézzük meg néhány egyszerű geometriai elemmel vett metszetét a sugárnak.
A sugarak mindig a korábban is látott alakú, ahol feltesszük a továbbiakban, hogy .
Ekkor a sugárparaméter éppen a pont távolsága -tól.
Parametrikus sugár és implicit felület metszéspontja
Legyen adva egy implicit egyenlet, ami meghatározza a metszeni kívánt felületet. ()
A sugarunk egyenlete -re meghatározott egy pontot a térben helyettesítsük be ezt a képletet az implicit egyenletbe!
Tehát a következő egyenletet kell megadnunk -re:
A kapott -től függően a következő esetek állhatnank fenn:
- Ha , akkor a sugarunk előtt van a felület és metszi
- Ha , akkor a sugár kezdőpontja a felületen van
- Ha , akkor a sugár "mögött" van a felület és metszi a sugár egyenese a felületet (de nekünk kell!)
Parametrikus sugár és parametrikus felület metszéspontja
Legyen adva egy parametrikus felület.
Kell találni egy olyan sugárparamétert, amihez létezik , hogy
Ez három ismeretlenes (), három egyenletes ( koordinátáként egy) egyenletrendszer.
A ugyanúgy ellenőrizhető, mint előbb, de most az -re is figyeljünk, hogy a felületünk paramétertartományának megengedett részén van-e (általában kell)!
Sugár és implicit sík metszéspontja
Síkot megadhatunk implicit alakban:
A fenti sugár egyenese metszi a síkot, ha
Ezt -re átrendezve adódik
Látható a sík a nézőpontunkból, ha
Sugár és normálvektoros sík metszéspontja
Legyen a sík egy pontja, a normálvektora.
Legyen ez egyenes egy pontja, az irányvektora.
Az egyenes egyenlete:
A sík egyenlete: minden pontja a síknak kielégíti ezt az egyenletet.
Behelyettesítve -t a helyére:
ha
A sugár metszi a síkot, ha .
Ha , akkor az egyenes párhizamos a síkkal, és így vagy nincs metszéspontjuk, vagy az egyenes a síkon fut.
Sugár és parametrikus sík metszéspontja
Síkot megadhatunk egy pontjával és kifeszítő vektorokkal is:
Metszéspont a sugár egyenesével: keressük és -t úgy, hogy
Beírva a képletet adódik
Átrendezve kapjuk, hogy
Ez három ismeretlenes, három lineáris egyenletből álló egyenletrendszer, ami megoldható, ha lineárisan nem összefüggő.
Mátrix alakban:
Látjuk a síkot, ha (most a felület paramétertartománya, ez teljesülni fog)
Sugár és háromszög metszéspontja I.
A háromszög egyértelműen megadható három csúcsával.
Ha a háromszög csúcsai, akkor a hozzátartozó sík egy parametrikus megadésa
A korábbi jelölésekkel: és
Ez egyben egy baricentrikus megadása is, hiszen átrendezve kapjuk, hogy
ahol az együtthatók -re összegződnek.
Elvégezve tehát a parametrikus síkkal a metszést, megkapjuk a baricentriukus koordinátáit a sugár síkkal való metszéspontjának. A sugárparamétert ne felejtsük el ellenőrizni!
Utolsó lépésként ellenőriznünk kell, hogy a metszéspont a háromszögön belül van-e. Ez pontosan akkor teljesül, ha
Sugár és háromszög metszéspontja II.
A háromszög egyértelműen megadható három csúcsával.
Ha a háromszög csúcsai, akkor a hozzátartozó sík pont-normálvektoros implicit megadásához a sík
- egy pontja bármelyike
- normálvektora
ahol a vektorális szorzatot jelöli, és ekkor egységnyi hosszúságú.
Először számítsuk ki az egyenes és a háromszög síkjának metszéspontját, ez legyen (már ha létezik).
Legyenek a pont -re vonatkoztatott baricentrikus koordinátái, úgy hogy
akkor, és csak akkor van a háromszögön belül, ha
Pont a háromszögön vizsgálat
Tudjuk, hogy . Ekkor ill
A gyorsabb számolásértvegyük a fentiek egy síkra vett vetületét.
A koordinátasíkok közül (, vagy ) arra vegyük a háromszög 2D vetületét, amelyre a háromszög vetületének területe a legnagyobb! a héromszög és sík normálisa leginkább "egyálású".
A vetülethez egyszerűen elhagyjuk vagy egyenletét, megfelelően.
Azt a tengelyt kell választani, amelyik mentén a legnagyobb a háromszög normálvektorának abszolút értéke, így biztos nem fordulhat elő, hogy a háromszög merőleges a síkra, és csak egy szakasz marad belőle.
Pl. legyen a a választott tengely. Ekkor
Behelyettesítve -t, és rendezve:
Rendezve -re kapjuk:
A nevező csak degenerált háromszög esetén lehet nulla.
akkor, és csak akkor van a háromszögön belül, ha
Sugár metszése poligonnal
Tegyük fel, hogy a poligonunk csúcsai egy síkban vannak, ekkor a metszés két lépésben történik
- A sugarat metsszük el a poligon síkjával
- Döntsük el, hogy a metszőpont a poligonon belül van-e
A másodikat egy síkban érdemes csinálni (vagy a poligon síkjában, vagy a poligon valamely koordinátatengelyre vett vetületének síkjában)
Pont-poligon tartalmazás teszt síkban
A pont a poligonon belül van, ha tetszőleges irányú, belőle indított sugárnak páratlan számú metszéspontja van a poligon oldalaival. (azaz a sugarat a poligon összes oldalszakaszával el kell metszeni)
Konkáv és csillag alakú poligonra is működik.
Sugár metszése szakasszal
A poligon csúcspontjai közötti szakasz parametrikus alakja:
Ezt kell metszeni a alakú sugárral
Most: a pont az a pont, amiről el akarjuk dönteni, hogy a poligonon belül van-e, tetszőleges.
Legyen !
Így a egyenletet csak koordinátára kell megoldani.
Keressük meg, hogy hol metszi a oldal egyenese a sugarat ( melyik -re lesz ?)
Azaz
-t kifejezve:
Innen megkapjuk azt az koordinátát -be behelyettesítve, ahol a sugér metszi a szakaszt.
Ha : a sugár nem metszi a szakaszt (csak az egyenesét).
Ha : a sugár egybeesik a szakasszal, vagy mögötte van a metszéspont.
Sugár és gömb metszéspontja
Az sugarú, középpontú gömb implicit egyenlete:
Ugyanez skalárszorzattal felírva: ahol
Legyen az egyenes egy pontja, az irányvektora.
Ekkor az egyenes egyenlete:
Behelyettesítve a gömb egyenletébe ezt kapjuk:
Kifejtve:
Ez másodfokú egyenlet -re (minden más ismert).
Legyen
- Ha , két megoldás van, az egyenes metszi a gömböt.
- Ha , egy megoldás van, az egyenes érinti a gömböt.
- Ha , nincs valós megoldás, az egyenes nem metszi a gömböt.
Sugárparamétert ezután ellenőrizni kell ().
Másodfokú egyenlet megoldása
Elméletileg a megoldás megkapható esetben:
Gyakorlatilag baj van, ha
- Átalakítással megkapjuk, hogy formában felírható a két gyök (Citardauq Formula)
Gyakorlatilag akkor is baj van, ha
- Ekkor , vagyis előjelétől függően vagy vagy pedig elveszít az értékes tizedesjegyeket.
- Számítsuk ki az egyik gyököt azon az ágon, amelyiken nem vonunk ki egymásból két közrl azonos pozitív számot, a másik gyököt pedig a Viète-formulákból
- Azaz például ha , akkor és
Sugár és transzformált objektumok metszése
Legyen egy adott objektum transzformációs mátrixa.
Feladat: Keressük sugár és az -mel transzformált objektum metszéspontját!
Probléma: Hogyan transzformálunk egy gömböt? Pontonként? Képletet írjuk át?
Megoldás: transzformáljuk inkább a sugarat!
Tétel: Az sugér és az -mel transzformált objektum metszéspontja az -el transzformált sugár és az objektum metszéspontja.
- , homogén transzformáció
- Sugár kezdőpontja:
- Sugár iránya: . Így nem hat ré az eltolás.
- Transzformált sugár:
Metszetvizsgálat: használjuk -t!
Metszéspont: , akkor az eredeti térben
Távolságokaz újra kell számolni az eredeti térben!
Normálvektorok: helyett (inverz-transzponált)
Sugér metszése AAB-vel
AAB axis aligned box, olyan téglatest, aminek az oldallapjai a koordinátasíkjainkkal párhuzamosak.
Legyen a sugarunk alakú, ahol
a téglatestet pedig adjuk
meg átlójának két pontjával, és segítségével ()!
Tegyük fel, hogy a sugár kiindulópontja a doboztól balra helyezkedik el.
Legyen
Ha : merőleges az -tengelyre (pl. 2D-ben függőleges). Ekkor nincs metszéspont, ha , különben az -koordinátás számításokat kihagyhatjuk.
Ha , akkor legyen
Ha : cseréljük meg -t!
Ha :
Ha :
A fentit végezzük el az és koordinátákra is.
Ha : nem találtuk el a dobozt.
Ha : a doboz mögöttünk van.
Minden más esetben a sugarunk metszéspontjai a dobozzal és -ban lesznek (sorban a közelebbi és távolabbi metszéspontok)