Raytracing – prieniky lúča s objektami

Raytracing – prieniky lúča s objektami

Raytracing – prieniky lúča s objektami

Žiadne komentáre na Raytracing – prieniky lúča s objektami

V raytracingu potrebujeme riešiť problém prieniku lúča s objektami. Objekty v scéne máme popísané parametrickými rovnicami, prípadne súradnicami bodov jednotlivých trojuholníkov daného komplexného objektu. Lúč bude mať parametrickú rovnicu v nasledovnom tvare, kde o je počiatok lúča, d je jeho smer a t je parameter pre daný smer. To znamená že zmenou parametra t sa vieme pohybovať po danom lúči:
raytracing5

Prienik lúča s guľou (ray-sphere intersection)

(obrázok hore) Pri hľadaní prieniku lúča z guľou je výhodné si situáciu zjednodušiť a to posunutím stredu gule do počiatku (0,0,0) a zoškálovaním na polomer dĺžky 1. Po vyrátaní nesmiete zabudnúť na spätné preškálovanie a posunutie. Zoberme si teda guľu so stredom v počiatku (0,0,0) a s polomerom R=1. Explicitná rovnica pre guľu v priestore je daná nasledovne (číslo 1 označuje, že R=1):
raytracing4Bod prieniku vyrátame dosadením rovnice lúča do rovnice gule, tj. namiesto x^2 dosadíme x-ovú zložku rovnice lúča, obdobne pre y aj z, po úpravách dostaneme nasledovnú rovnicu:
raytracing6Štandardnými technikami riešenia kvadratickej rovnice teraz vieme vyrátať potrebný parameter t. Ako vidieť logicky aj z obrázku, priesečníky môžu byť maximálne dva, presne tak ako počet riešení kvadratickej rovnice. Pri rátaní prienikov, resp. všeobecne pri numerických výpočtoch v počítači je potrebné dať pozor na zaokrúhľovacie chyby vo výsledkoch, hlavne pri práci s malými číslami.

Prienik lúča s rovinou (ray-plane intersection)

raytracing7
Lúč máme opäť v tvare r=o+t.d; rovinu máme reprezentovanú bodom p, ktorý do nej patrí a normálou roviny n. Prienik opäť potrebujeme zistiť, pre aký parameter t má lúč spoločný bod s rovinou. Rovnicu roviny máme reprezentovanú nasledovne, kde D je vzdialenosť roviny od počiatku (0,0,0), tj. vzdialenosť bodu (0,0,0) od jeho kolmého priemetu na rovinu.
raytracing8Bod p v rovnici roviny je vo všeobecnosti akýkoľvek bod, ktorý danej rovine patrí, preto opäť stačí za tento bod p dosadiť rovnicu lúča a takto vypočítať, pre aký parameter p platí daná rovnosť.
raytracing9

Prienik lúča s trojuholníkom (ray-triangle intersection)

raytracing10Prienik lúča s trojuholníkom rátame v prvej polovici výpočtu rovnako ako prienik s rovinou, keďže trojuholník je vlastne časť roviny. Po výpočte prieniku lúča s rovinou danou tromi bodmi trojuholníka musíme ešte vyrátať, či daný bod leží vnútri trojuholníku. Na to využijeme barycentrické súradnice. Tie nám určujú bod v rovine pomocou lineárnej kombinácie iných troch bodov v jednej rovine, čo je presne to čo potrebujeme. Lineárna kombinácia troch bodov je niečo akoby ich váhovanie, tj. ak určíme P=1.A+0.B+0.C, budeme presne v bode A, ak budeme parametre pre body meniť, budeme sa pohybovať bodom P v trojuholníku ABC. Parameter pred bodom môže nadobúdať rôzne hodnoty, avšak vždy medzi 0 a 1 a ich súčet musí byť 1.
raytracing11Takže pre daný bod prieniku lúča s rovinou musíme vyrátať parametre lambda a zistiť, či spĺňajú tieto podmienky. Ak áno, bod P leží vnútri trojuholníku ABC, čiže bod P je bodom prieniku lúča s daným trojuholníkom. Viac o barycentrických súradniciach si môžete pozrieť tu.

Prienik lúča s kvádrom (ray-box intersection)
raytracing12

V tomto prípade hľadáme prienik boxu s lúčom. Prienik lúča s boxom je veľmi dôležitý a často rátaný, pretože často používame boxy ako obálky zložitejších objektov pre uľahčenie rátania. Box je vo všeobecnosti vlastne iba 6 rovín, ktoré sú po dvojiciach rovnobežné a navzájom rôzne kolmé. Algoritmus je teda jednoduchý, stačí rátať prienik lúča s každou rovinou a porovnať výsledné parametre t. Postupujeme tak, že rátame prienik t-near a t-far, pre každé dve rovnobežné roviny. t-near je prienik bližší k počiatku lúča a t-far je ten vzdialenejší. Pre všetky tri trojice rovín dostaneme tri a tri parametre t-near a t-far. Ak je niektorý z parametrov t-near väčší ako niektorý z parametrov t-far, znamená to, že lúč box nepretína. V opačnom prípade je najväčší z parametrov t-near ten, ktorý pretína box a vchádza do jeho vnútra, a najmenší z parametrov t-far je ten, ktorý pretína box a vychádza z neho von. Na obrázku je naznačený prípad s parametrami v 2D rovine.

Situácia sa nám mnohonásobne uľahčí, ak použijeme box rovnobežný s osami x,y,z. takzvaný AABB box (axis-aligned bounding box). Tu prieniky rátame iba “porovnávaním” jednotlivých súradníc daných rovín, keďže pre každú rovinu sú dve zo súradníc normály vždy nulové. Do rovnice lúča teda vždy dosadíme aj dve nuly, ktoré nám výpočet zjednodušia.

Facebooktwittergoogle_pluspinterestlinkedintumblr

Komentáre

Musíte byť prihlásenýpre komentovanie.

Späť hore