Geometrie/Raytracing
Ray-tracing
editovatJedná se o vysoce výpočetně náročnou metodu počítačové vizualizace, pomocí které lze dosáhnout velmi realistického zobrazení modelu. Spočívá v postupném stopování paprsků odrážených modelem směrem k uživateli. Umožňuje zobrazení jevů, pomocí jiných technik vůbec, či jen stěží dosažitelných, jako jsou např. odrazy a odlesky objektů, lom světla v objektech, atd.
Na začátku máme:
- Popis 3D scény skládající se z
- objektů (pozice, tvar, barva a další vlastnosti materiálu)
- světelných zdrojů (pozice, barva)
- (případně: barva pozadí scény, vlastnosti prostředí)
- Pozici pozorovatele
Sledujeme paprsky, které se šíří od světelných zdrojů do scény. Některé paprsky zasáhnou objekty, kde se podle jejich vlastností lomí, odrážejí a rozptylují. Obraz scény tvoří paprsky dopadlé na projekční plochu.
Tato metoda zahrnuje efekty vznikající vzájemnou interakcí objektů ve scéně (tj. například odrazy ostatních těles na povrchu lesklého objektu a lom světla při průchodu průhledným tělesem). Dokáže určit stíny vržené různými tělesy (tyto stíny jsou však ostře ohraničeny). Protože je nereálné sledovat všechny paprsky ze zdrojů světla, postupujeme v praxi naopak. Paprsek je sledován zpětně, tzn. ve směru od pozorovatele. Projekční paprsky vysíláme přes pixely obrazu scény. Hledáme, co je vidět v daném pixelu, jakou světelnou energii paprsek přináší.
Typy paprsků:
- Primární paprsek – vyslaný od pozorovatele scény.
- Sekundární paprsek – vzniká odrazem nebo lomem paprsku.
- Stínový paprsek – vyslaný z místa dopadu paprsku na objekt ke zdrojům světla pro zjištění, leží-li ve stínu. Není-li objekt ve stínu, je pro něj vyhodnocen osvětlovací model. Zanedbává se jejich lom.
Popis
editovatPři sledování paprsků musíme vlastně hledat jejich průsečíky s objekty scény. Naivní algoritmus testuje navzájem každý paprsek s každým objektem scény (a se všemi polygony v každém objektu), což vede ke značně časově náročnému výpočtu. Každý průsečík paprsku s objektem generuje další dva paprsky + stínový paprsek. V každém takovém průsečíku je zapotřebí provést ty samé výpočty, je tedy vhodné využít pro implementaci ray-tracingu rekurzi.
Pro ukončení rekurze je možné použít následující kritéria:
- paprsek narazí na difúzní povrch
- je dosažena předem stanovená maximální hloubka rekurze
- energie paprsku klesne pod určitý práh
V každém průsečíku P paprsku a objektu platí:
- – průsečík
- – další průsečík odraženého paprsku
- – další průsečík propuštěného paprsku
- – globální koeficient odrazivosti (reflexe)
- – globální koeficient propouštění (lomu, transmise, refrakce)
Rekurzivní charakter této rovnice potvrzuje vhodnost tohoto přístupu pro implementaci ray-tracingu. Pro reprezentaci hierarchie paprsků a průsečíků bývá použita stromová struktura.
Nevýhody ray-tracingu
- ostré stíny
- bodové zdroje světla
- zrcadla (lesklé plochy) sice odrážejí okolí, ale neodrážejí světlo do okolí, nejsou sekundárními zdroji světla
- při změně ve scéně (místo pozorovatele, nové světlo, nový objekt, odebrání něčeho, …) se musí vyhodnotit celá scéna
- není adaptivní, zobrazení probíhá se stejným vzorkováním, nezávisle na situaci ve scéně (velké monotónní plochy)
Urychlování ray-tracingu
Prostý ray-tracing je velmi náročný na čas, urychlovací metody ho mohou urychlit o jeden až dva řády.
Nejčastější urychlovací metody:
- Urychlení výpočtu průsečíků
- speciální funkce na výpočet průsečíků s každým typem objektu (pre testy potenciálních průsečíků před vlastními výpočty s tělesem)
- snížení počtu výpočtů průsečíků – obálky, hierarchie obálek – dělení scény (BSP, Octal-tree) – paměť překážek – koherence paprsků (válcové nebo kuželové obálky paprsků)
- Snížení počtu paprsků
- adaptivní antialiasing (zředěné vysílání paprsků, interpolace při malé změně)
- řízení hloubky rekurze (útlum intenzity paprsků při odrazech a lomech -> stupeň rekurze při útlumu pod daný limit)
- Svazky paprsků (svazek paprsků se vysílá jako jeden – kvalita)
- Distribuce výpočtů na dvě části (procesů, procesorů)
Reprezentace objektů
Objekty jsou v počítačové grafice zpravidla reprezentovány pomocí "množiny trojúhelníčků", které se snaží vystihnout jejich tvar. Pro metodu raytracing je proto mimo jiné potřeba vyřešit problém, jak získat průsečík paprsku s určitým trojúhelníkem.
Paprsek je zřejmě přímkou a trojúhelník chápeme jako množinu bodů v rovině, které leží uvnitř nebo na trojúhelníku v běžném smyslu.
Paprsek je možno popsat (například) parametrickou rovnicí
,
kde a jsou body ležící na této přímce a je parametr. Trojúhelník určený body , a můžeme také popsat parametrickou rovnicí. Stačí si uvědomit, že nedegerovaný trojúhelník (pro nedegerovaný trojúhelník musí platit, že body , , jsou v obecné poloze; trojúhelník tedy nezdegeneruje do bodu nebo úsečky) je dvourozměrným simplexem, tzn., že body trojúhelníku leží v konvexním obalu bodů , a
.
S tímto tvarem by se nám ale špatně počítalo, proto si z podmínky vyjádříme např. . Pro bod trojúhelníku pak musí platit
Označíme-li navíc a , můžeme psát
,
kde , .
Průnik paprsku a plochy
Nejprve si rozebereme obecnější úlohu, tzn. průnik paprsku s plochou. Nechť trojúhelník leží v rovině , která je určená bodem a normálovým vektorem . Pro libovolný bod ( ) platí, že vektory a jsou kolmé. Platí tedy
.
Dosazením parametrické rovnice paprsku (\ref{param_rce_primky}) do rovnice (\ref{norm_rce_roviny}) získáme
,
odtud
.
Průsečík paprsku s rovinou je proto roven
.
Je-li trojúhelník určen body , a , můžeme normálový vektor roviny zapsat ve tvaru
.
Průnik paprsku a trojúhelníku
Pro výpočet průsečíku paprsku s trojúhelníkem nejprve pomocí (\ref{I}) zjistíme průsečík tohoto paprsku s rovinou, ve které daný trojúhelník leží. Protne-li paprsek rovinu, pak zbývá určit, jestli průsečík leží v daném trojúhelníku či nikoliv. Pokud vyjádříme souřadnice tohoto průsečíku vzhledem k bodu (těmito souřadnicemi jsou parametry a v rovnici (\ref{param_rce_troj})), pak jsou-li splněny podmínky
průsečík leží v trojúhelníku.
Dále pro libovolný vektor roviny s normálovým vektorem definujeme operátor jako vektorový součin vektorů a . Platí tedy . Tento operátor je zřejmě lineární, tzn., že platí
pro všechny skaláry , a vektory , . Z vlastností vektorového součinu navíc plyne, že , neboli
.
Identity a využijeme k výpočtu rovnice , kde , která vznikla z rovnice (\ref{param_rce_troj}) dosazením za . Vynásobíme-li ji skalárně vektorem dostaneme , tzn. . Odtud můžeme vyjádřit . Analogicky získáme skalárním vynásobením rovnice vektorem parametr . Dostaneme tedy
Algoritmizace
editovatRekurzivní funkce Sleduj_paprsek (R, H – hloubka rekurze):
- Najdi průsečík P mezi R a objektem.
- Jestliže P neexistuje – R jde mimo scénu – pixel má barvu pozadí.
- Z P pošli ke zdrojům světla stínové paprsky.
- Vyhodnoť součet osvětlovacích modelů v P pro nezakryté zdroje světla.
- Pokud není překročena hloubka rekurse H, vyšli z P:
- Odražený sekundární paprsek voláním Sleduj_paprsek ( , ).
- Lomený paprsek Sleduj_paprsek ( , ).
- Paprsek má barvu danou součtem barvy od osvětlení, odraženého paprsku a lomeného paprsku .
Počet rekurzivních volání procedury Sleduj_paprsek je řízen parametrem H. Je-li roven 1, jedná se o tzv. ray-casting – vyhodnocují se pouze primární paprsky a jejich dopady na nejbližší objekt, při použití stínových paprsků jsou vyhodnoceny stíny. Pro zobrazení odrazů musí mít hodnotu minimálně 2 a pro řešení průhledných těles je minimum 3.
Autoři
editovatTento text vypracovali studenti Univerzity Palackého v Olomouci katedry Matematické informatiky jako součást zápočtového úkolu do předmětu Počítačová geometrie.