Ray-casting a Ray-tracing má v JaGrLib dobrou podporu. Protože je však systém relevantních protokolů a modulů složitější, věnujeme tomuto tématu celou tuto stránku..
Scéna je reprezentována pomocí CSG stromu. CSG strom je specializací obecnějšího konceptu
hierarchické scény - základem je interface SceneNode.
Tam je implementován koncept tzv. atributů, které jsou v hierarchii dědičné, a
samozřejmě jsou definováni potomci vnitřního uzlu scény, kteří jsou do scény
svého rodiče umisťováni pomocí transformačních matic (přímá matice transformuje souřadnice
z podtělesa do nadtělesa, inverzní naopak).
Konkrétní implementace tříd pro uzly CSG stromu jsou:
Elementární tělesa implementují interface Solid. Hlavní požadovaná funkčnost:
Scéna v širším slova smyslu je uložena v objektu implementujícím interface RTScene. Kromě vlastní geometrie a barvy pozadí je zde uložena množina světelných zdrojů (interface LightSource) a dále odkaz na kameru = generátor paprsků (interface RayGenerator).
Při výpočtu průsečíku paprsku se scénou se používá jiný interface Intersectable, aby mohl být do zapojení vložen prostředník, umožňující například efektivnější výpočet (viz urychlení Ray-tracingu). Všechny ostatní dotazy - na geometrii scény, pozadí, světelné zdroje nebo na kameru poskytuje RTScene.
Paprsek je zadán parametricky za pomoci dvou údajů - počátečního bodu P0 a směrového
vektoru P1. Každý bod na polopřímce paprsku je jednoznačně zadán parametrem t >= 0 takto:
P(t) = P0 + t * P1.
Necháme-li spočítat průsečík paprsku se scénou
(intersection(P0,P1)),
vrátí se výsledek ve formě instance objektu
MicroFacet.
Každá instance MicroFacet obsahuje údaje o jednom konkrétnímm průsečíku, jako je např. jeho poloha na paprsku t, světové souřadnice coord nebo normálový vektor normal (podrobnější reference viz níže).
Výpočet mnohých údajů průsečíku může být časově náročný (např. spočítat texturové souřadnice = "zeměpisnou délku a šířku" na kouli je mnohem náročnější, než spočítat vlastní průsečík). Proto je u datového objektu MicroFacet využit koncept tzv."laisy evaluation", to znamená, že objekt obsahuje jen údaje, které byly explicitně vyžádány. Pokud aplikace potřebuje ke svému výpočtu některou datovou položku, musí si nejprve zajistit její platnost metodou assertAttributes(mask). Bitová maska označuje, které položky se mají případně dopočítat (viz konstanty začínající na VALID_, např. MicroFacet.VALID_COORD).
Přehled vybraných datových položek uložených v objektu MicroFacet (* označuje položky, které jsou implicitně platné):
Výpočet lokálního světelného modelu definuje interface LightModel. Implementace tohoto protokolu umí spočítat odraz světla na povrchu tělesa (geometrie bodu odrazu je obyčejně v Ray-tracingu definována objektem MicroFacet).
Standardní implementací světelného modelu je PhongModel - Phongův model osvětlení s volitelnou úpravou reflexe podle Ch. Schlicka.
Materiál povrchu tělesa je popsán daty uloženými ve zvláštním privátně definovaném objektu. Interface takového objektu je pouze Property. Každý světelný model definuje svoji vlastní třídu pro ukládání materiálových dat. Instance této třídy je vytvořena voláním LightModel.createMaterial() a potom už se k parametrům přistupuje pomocí get() a set().
Pozor - důsledkem této vazby je, že není možné vyměnit použitý světelný model bez změny materiálových objektů (a naopak).
Konkrétní vlastnosti materiálového objektu pro Phongův model osvětlení:
Světelný zdroj je objekt, který má schopnost osvětlit 3D scénu. Implementuje interface LightSource. Zdroj poskytuje informace typu jak osvětlí daný bod ve scéně" nebo "jakým směrem na daný bod svítí". Jednotně je jako světelný zdroj implementována též okolní složka osvětlení (ambient light): svítí na všechny body scény, nemá směr..
Standardní součástí JaGrLib jsou StaticPointLightSource a AmbientLightSource.
Kamera v prostředí Ray-tracingu hraje roli generátoru primárních paprsků. Pro každý bod ve virtuální průmětně umí vytvořit paprsek ve 3D scéně (paprsek je definovaný pomocí P0 a P1 - viz výše). Virtuální průmětna má tvar obdélníka, chápe se jako spojitá podmnožina R2. Rozměry tohoto obdélníka definuje samotná kamera, uživatel si musí své souřadnice přepočítávat.
Kamera implementuje interface RayGenerator, standardní součástí JaGrLib je StaticCamera.
JaGrLib obsahuje prostředky pro XML scriptování, pomocí JGL scriptů se obyčejně definují všechna data pro Ray-tracing (scéna, světelné zdroje, kamera). Vestavěný modul StaticCSGScene načítá data scény pomocí zadaného scriptu (kamera může být též definována alternativně pomocí připojeného modulu).
JGL script definující scénu pro Ray-tracing by měl vracet čtyři objekty:
Příklady: data/scene1.jgl, data/scene2.jgl, data/scene4.jgl, data/scenerot.jgl, data/sceneAreaDof.jgl, data/sceneBrep.jgl, data/sceneTeapot.jgl..
Vlastní algoritmus syntézy obrazu je implementován ve dvou modulech:
Copyright (C) 2007-2009 J.Pelikán,
last change: $Date: 2013-11-22 23:47:16 +0100 (Fri, 22 Nov 2013) $
Send comments/requests to
pepca.at.cgg.mff.cuni.cz