Hlavní navigace

POV-Ray a radiozita

4. 11. 2008
Doba čtení: 11 minut

Sdílet

V dnešní části seriálu o POV-Rayi dokončíme část věnovanou vizualizaci objemových dat. Současně začneme s popisem alternativního způsobu výpočtu ambientní složky světla pomocí takzvané radiozitní metody. Jde o výpočetně náročnou metodu, která však může výrazně zlepšit celkový dojem z vykreslené scény.

Obsah

1. Alternativní způsob vizualizace objemových dat – převod objemových dat na povrch
2. Použití izoploch pro vizualizaci objemových dat
3. První demonstrační příklad – izoplocha vykreslená na základě objemových dat
4. Phongův osvětlovací model a jeho nedostatky
5. POV-Ray a radiozita
6. Přednosti a zápory vyzařovací metody
7. Literatura a odkazy na Internetu
8. Obsah další části seriálu

1. Alternativní způsob vizualizace objemových dat – převod objemových dat na povrch

V předchozí části tohoto seriálu jsme si popsali nejčastěji používaný způsob vizualizace objemových dat v POV-Rayi, který byl založený na jejich přímém vykreslení (direct volume rendering algorithms), tj. jednalo se o rendering bez nutnosti vytváření pomocných povrchů. Dnes si ukážeme alternativní způsob vykreslení objemových dat založený na nalezení izoplochy v objemové mřížce a následném vykreslení této izoplochy pomocí běžného raytracingu hledajícího průsečíky paprsků s povrchem těles.

povray3401

Obrázek 1: V průběhu přímého vykreslení objemových dat prochází světelný paprsek jednotlivými objemovými elementy (voxely), které ovlivňují jeho barvu i intenzitu. Zde je ukázán nejjednodušší případ, kdy paprsek prochází objemem ve směru jedné souřadné osy.

Jak jsem se již zmínil minule, nejedná se sice o typickou oblast použití tohoto raytraceru (podle mě je v praxi výhodnější aplikovat předzpracování objemových dat například známým algoritmem Marching Cubes či Marching Tetrahedra pomocí externího programu s následným vyhlazením výsledné trojúhelníkové sítě), ale jde o zajímavou a přitom poměrně neznámou vlastnost POV-Raye, takže by bylo škoda ji v seriálu, který se snaží zmapovat všechny způsoby použití POV-Raye, alespoň v základní podobě nezveřejnit.

povray3402

Obrázek 2: Objemová data vykreslená přímou metodou bez nutnosti výpočtu pomocných povrchů

2. Použití izoploch pro vizualizaci objemových dat

POV-Ray mj. podporuje i vykreslování takzvaných izoploch, což je technika, kterou jsme si popsali a na několika demonstračních příkladech i ukázali v jedenácté části tohoto seriálu (/clanky/izoplochy-v-pov-rayi-aneb-vizualni-matematika/). Izoplocha je definována nějakou implicitní funkcí, například abs(x)+abs(y)+ab­s(z)-2, která pro každý bod v prostoru určuje jeho „potenciál“, což může být libovolné reálné číslo. Dále je zapotřebí specifikovat takzvanou prahovou hodnotu (threshold), pomocí níž se ze všech bodů v prostoru vyberou pouze ty, které na izoploše leží – v podstatě se prahovou hodnotou vybírá některá ekvipotenciální plocha. Změnou prahové hodnoty se do značné míry dá ovlivňovat tvar výsledné izoplochy. V POV-Rayi jsou izoplochy zapsané pomocí uzlu typu isosurface. V tomto uzlu se specifikuje jak vlastní implicitní funkce, tak i všechny důležité parametry výpočtu izoplochy, textura izoplochy, její materiál, optické vlastnosti, obalové těleso atd.

povray3403

Obrázek 3: Tělesa vymodelovaná pomocí izoploch

Následuje jednoduchý příklad definice izoplochy založené na implicitní funkci abs(x)+abs(y)+ab­s(z)-2:

// izoplocha založená na implicitní funkci abs(x)+abs(y)+abs(z)-2
isosurface
{                                        // uzel použitý pro zápis izoplochy
    function
    {
        abs(x)+abs(y)+sin(z)-2           // zápis implicitní funkce
    }
    threshold 0.0                        // prahová hodnota
    accuracy 1e-6                        // přesnost výpočtu (čím menší číslo, tím přesnější)
    max_gradient 2                       // maximální gradient
    contained_by
    {                                    // těleso, které tvoří hranici obecně nekonečné izoplochy
        sphere
        {                                // v tomto případě se jedná o kouli s poloměrem 2
            <0,0,0>,2
        }
    }
    texture
    {                                    // textura aplikovaná na izoplochu
        Solid
    }
    scale 0.9                            // lineární transformace aplikovaná na izoplochu
    rotate <-40, 30, 0>
} 
povray3404

Obrázek 4: Toto tvarově složité těleso bylo vytvořeno pomocí šumové funkce nazvané „f_noise3d“

Jakým způsobem se však dají izoplochy využít při vykreslování objemových dat? Celá myšlenka spočívá v tom, že místo matematické funkce specifikované pomocí nějakého výrazu je možné použít objemová data načtená z externího souboru typu DF3. Formát těchto souborů jsme si popsali v předchozí části tohoto seriálu – ve své podstatě se jedná o hodnoty objemových elementů (voxelů) uložené v pravidelné rastrové mřížce; hodnota každého voxelu je v souboru představována jedním, dvěma či čtyřmi byty, které jsou po načtení převedeny na reálné číslo ležící v rozsahu 0,0 až 1,0. Tyto hodnoty jsou následně použity při vyčíslení potenciálu v libovolném místě prostoru. Pokud bod, pro který se zjišťuje potenciál, leží mezi průsečíky objemové rastrové mřížky, lze použít interpolaci hodnoty podle nejbližších osmi průsečíků – na základě nastavení atributu interpolate může být interpolace zakázána, může být použita trilineární interpolace či interpolace trikubická (v tomto případě se berou v úvahu i hodnoty vzdálenějších 24 průsečíků objemové mřížky). Tímto způsobem je možné zadat matematickou funkci nikoli pomocí matematického výrazu, ale „tabelárně“:

// použití objemových dat při definici funkce
function
{
    pattern                                 // funkce není zadaná výrazem, ale tabelárně
    {
        density_file df3 "volume_data.df3"  // specifikace souboru s objemovými daty
        interpolate 2                       // způsob interpolace - zde se jedná
    }                                       // o interpolaci trikubickou
} 

Právě výše uvedený způsob specifikace funkce je použit v dnešním prvním demonstračním příkladu, který je popsaný v následující kapitole.

povray3405

Obrázek 5: Kaktusy v této prostorové scéně jsou vytvořeny pomocí izoploch

3. První demonstrační příklad – izoplocha vykreslená na základě objemových dat

V tomto demonstračním příkladu je ukázán alternativní způsob vykreslení objemových dat uložených v souborech typu DF3. Objemová data (voxely) tvoří základ pro tvorbu tabulární funkce použité při vykreslení izoplochy. V předchozí kapitole jsme si řekli, že objemová data jsou (po jejich načtení a základní konverzi) představována hodnotami ležícími v rozsahu 0,0 až 1,0. V místech, kde hodnota takto vytvořené funkce prochází přes takzvaný práh (threshold), se nachází bod ležící na ekvipotenciální ploše; právě tento bod je při raytracingu vypočten a zobrazen. Předpokladem pro úspěšnou vizualizaci je, aby objemová data byla spojitá ve všech třech směrech, každý šum vzniklý například při snímání objemových dat pomocí MR či CT, se může negativně projevit na tvaru výsledné plochy, dokonce mohou vzniknou i „díry“ či další defekty (viz sedmý obrázek). Na výslednou izoplochu je možné aplikovat libovolnou texturu, lze specifikovat optické vlastnosti materiálu plochy atd. (POV-Ray dokáže automaticky vypočítat normálové vektory v každém bodu ležícím na ploše). Změnou hodnoty threshold je možné vybrat konkrétní izoplochu z objemových dat.

povray3406

Obrázek 6: Screenshot prvního demonstračního příkladu

Zdrojový kód dnešního prvního demonstračního příkladu má tvar:

// ------------------------------------------------------------
// První demonstrační příklad na použití izoploch definovaných
// pomocí objemových dat.
//
// rendering lze spustit příkazem:
//     povray +W800 +H600 +B100 +FN +D +Iiso01.pov +Oiso01.png
// (pro náhled postačí zadat povray iso01.pov)
// ------------------------------------------------------------

camera                                   // nastavení kamery
{
    location <0,0,-10>                   // pozice kamery v prostoru
    direction z*2                        // směr pohledu kamery
}

light_source                             // nastavení bodového světelného zdroje
{
    <500,500,-500>                       // pozice světelného zdroje v prostoru
    rgb 1                                // barva světelného zdroje - bílá
}

#declare DENSFUNC=function               // tabulární funkce použitá pro definici izoplochy
{
    pattern
    {
        density_file df3 "pokus.df3"     // externí soubor typu DF3 s objemovými daty získaný
                                         // pomocí C-čkového programu prezentovanému v předchozí
                                         // části seriálu o POV-Rayi
        interpolate 2                    // způsob interpolace - zde se jedná o trikubickou interpolaci
    }
}

isosurface
{
    function                             // matematický výraz představující definici izoplochy
    {
        0.05 - DENSFUNC(x,y,z)           // ve výrazu je možné použít výše specifikovanou tabulární funkci DENSFUNC
    }
    threshold 0.0                        // prahová hodnota
    accuracy 1e-7                        // přesnost výpočtu (čím menší číslo, tím přesnější)
    max_gradient 2                       // maximální gradient
    texture                              // specifikace textury
    {
        pigment
        {
            color rgb <1,1,1>            // bílá barva povrchu izoplochy
        }
        finish
        {
            phong 1                      // míra odlesků
        }
    }
    translate -0.5
    scale 4
}

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray3407

Obrázek 7: Pokus o vytvoření izoplochy z prostorových dat, která nejsou spojitá, vede ke vzniku jasně viditelných chyb

4. Phongův osvětlovací model a jeho nedostatky

Ve čtrnácté části tohoto seriálu byl popsán Phongův osvětlovací model, který je použitý při výpočtu osvětlení jednotlivých bodů na povrchu těles. Původní osvětlovací model je v POV-Rayi rozšířen o další koeficienty, princip je však založen na původních Phongových myšlenkách (viz první tři knihy uvedené v kapitole Literatura a odkazy na Internetu). Phongův osvětlovací model je mimo POV-Ray využitý i v mnoha dalších raytracerech i aplikacích zaměřených na vykreslování trojrozměrných scén, protože výpočty světelných poměrů jsou poměrně rychlé a výsledná scéna současně působí do značné míry (mimo výjimky popsané níže) přirozeně. Výsledek snah o co nejrychlejší a přesto kvalitní obrázky trojrozměrných scén samozřejmě vyústil v kompromisní model, který se však s úspěchem používá již několik desetiletí, i když je nutné říci, že se vlastně jedná o ad-hoc řešení, které pouze přibližně simuluje skutečné světelné poměry na povrchu těles a některé optické jevy se s jeho využitím nedají přímo vytvořit (například „prasátka“). Mezi složitější modely patří například světelný model Cook-Torrancův, který je taktéž v některých pokročilejších raytracerech použit.

povray3408

Obrázek 8: Krystal na pravé straně musel být vykreslen s modifikovaným Phongovým osvětlovacím modelem

Pomocí Phongova osvětlovacího modelu se dají uspokojivým způsobem vypočítat světelné poměry těch částí povrchu, které jsou přímo osvětleny některým světelným zdrojem – zde se uplatňuje především difúzní složka světla (jeho intenzita je závislá na úhlu měřeném mezi kolmicí na povrch vykreslovaného tělesa a paprskem dopadajícím na povrch) a také odlesky (jedná se o paprsek mířící ze světelného zdroje, který je odražen směrem k pozorovateli/ka­meře). Ovšem barva těch částí objektů, které leží ve stínu, je odvozena pouze od takzvaného ambientního světla, což je světlo, jehož barva a intenzita je ve všech částech scény konstantní. To mj. znamená, že objekty ležící ve stínu mají konstantní barvu vzniklou vynásobením ambientního světla a ambientní složky optické vlastnosti materiálu tělesa. V reálném světě je však situace odlišná, protože i ty plochy, které nejsou přímo osvětleny nějakým světelným zdrojem, mohou být nepřímo ovlivněny například okolní bílou či barevnou stěnou. Právě způsob práce s ambientním světlem je největším problémem, se kterým se musí raytracery vypořádat. Řešením je zavedení vyzařovací metody (radiozity), kterou si popíšeme.

povray3409

Obrázek 9: V Phongově osvětlovacím modelu se barva každého bodu na povrchu těles počítá na základě takzvaných primárních a sekundárních světelných paprsků. Sekundární paprsky jsou vypočteny na základě zákonů o odrazu a lomu světla.

5. POV-Ray a radiozita

Vyzařovací metoda (radiozita) je založena na fyzikálně dobře odůvodněné teorii, v níž se tvrdí, že každá ploška ve scéně může přijímat světelné záření přicházející z okolí, ale může ho také vyzařovat do okolního prostoru. Výpočet probíhá iterativně: na počátku jsou všechny plošky běžných objektů (povrch objektů je adaptivně rozdělen na malé plošky) černé a plošky světelných zdrojů vyzařují světlo o vlnové délce odpovídající jejich barvě. V jednotlivých iteracích se počítá, kolik energie je vyzářeno ze světelných zdrojů do okolí, kolik této energie přijmou plošky představující povrch objektů a – to je velmi důležité – kolik energie je z těchto plošek vyzářeno dále, k dalším ploškám. Právě zde dochází k zajímavému jevu: plošky, které nejsou přímo viditelné ze světelných zdrojů (leží tedy ve stínu) jsou ozářeny světlem, které je vyzařováno z okolních těles. Tento jev nastává s větší či menší intenzitou i v reálném světě, pomocí klasického raytracingu ho však není možné uspokojivě napodobit, proto je propojení raytracingu a radiozity v mnoha případech nezbytné.

povray3410

Obrázek 10: Scéna vypočtená pomocí vyzařovací metody. Povšimněte si, že původně jednobarevné kvádry jsou ozářeny světlem vyzařovaným červenou a zelenou stěnou. Vzhledem k tomu, že je použit plošný zdroj světla a současně i vyzařovací metoda, je rendering této scény velmi pomalý – od několika minut až po hodinu (v závislosti na použitém rozlišení a výkonnosti počítače).

6. Přednosti a zápory vyzařovací metody

Použití vyzařovací metody s sebou nese několik kladů, ale také záporů. Zcela jistě se jedná o velmi užitečné rozšíření klasického raytraceru založeného na Phongově osvětlovacím modelu o alternativní způsob výpočtu ambientní složky světla, která již nemusí být pro celou scénu konstantní. Do mnoha scén tato metoda vnáší další prvek reality a „fotorealistické“ grafiky. Na druhou stranu je však samotný rendering zpomalen, a to mnohdy i o jeden až dva řády. V předchozí kapitole jsme si řekli, že se výpočet energie přijaté a vyzářené každou ploškou musí počítat iterativně, přičemž se předpokládá, že po několika iteracích se energie ve scéně ustálí. Problém je, že v jednotlivých iteracích se musí v nejhorším případě spočítat výměna energie každé plošky se všemi ostatními ploškami, což je výpočetně náročné. V praxi POV-Ray samozřejmě aplikuje různé optimalizace (výpočet viditelnosti, obalová tělesa atd.), ale i s jejich použitím je rendering pomalejší než klasický raytracing.

povray3411

Obrázek 11: Při výpočtu tohoto obrázku nebyla radiozita použita. Je patrné, že všechny objekty ležící ve stínu mají konstantní barvu, v tomto případě tmavě šedou.

Druhý problém vyzařovací metody spočívá v tom, že se pomocí ní dají dobře vyjádřit světelné poměry panující pouze na povrchu difúzních těles (neleštěné dřevo, umělá hmota, beton, stromy atd.). U těles s odlesky (kov, leštěné dřevo) či dokonce u těles průhledných (sklo, drahokamy) je situace horší – zde se musí radiozita zkombinovat s klasickým raytracingem. Ovšem raytracery, jak již víme, nedokáží přesně simulovat plošné světelné zdroje. Ty se musí nahrazovat skupinami světelných zdrojů bodových, což však vede k dalšímu prodloužení renderingu celé scény.

povray3412

Obrázek 12: Zde je již radiozita aplikována, což vede například ke korektnímu výpočtu stínů schodů „skrytých“ ve stínu.

7. Literatura a odkazy na Internetu

  1. Foley J., Dam van A., Feiner S., Hughes J.: Computer Graphics – Principles and Practice (Second Edition)
    Addison-Wesley, Reading, Massachusetts, 1990, ISBN 0–201–12110–7
  2. Žára J., Beneš B., Felkel P.: Moderní počítačová grafika
    Computer Press, Praha, 1998, ISBN 80–7226–049–9
  3. Žára J., Limpouch A., Beneš B., Werner T.: Počítačová grafika – principy a algoritmy
    Grada, Praha, 1992, ISBN 80–85623–00–5
  4. The POV-Ray Cyclopedia:
    http://www.spi­ritone.com/~en­glish/cyclope­dia/index.html
  5. POV-Ray New Ring:
    http://webrin­g.povray.org/
  6. Cloud generator (POV-Ray),
    http://www.oy­onale.com/mode­les.php?lang=en&pa­ge=36
  7. ImageJ Plugins DF3,
    http://fly.mpi-cbg.de/~saalfel­d/df3.html
  8. POVRay density (DF3) files or Using POVRay as a volume renderer,
    http://local.was­p.uwa.edu.au/~pbou­rke/miscellane­ous/df3/
  9. Scientific Visualizations with POV-Ray,
    http://www.li­nuxjournal.com/ar­ticle/7486
  10. df3 Python Class,
    http://povray­.tashcorp.net/tu­torials/scrip­t_df3/
povray3413

Obrázek 13: Odlišné světelné podmínky a vložení dalších předmětů do scény vykreslené s využitím radiozity.

root_podpora

8. Obsah další části seriálu

V následující části tohoto seriálu dokončíme popis radiozitní metody a posléze se začneme zabývat samotným jazykem, ve kterém se zapisují prostorové scény. S poměrně velkou částí tohoto jazyka jsme se seznámili v jednotlivých demonstračních příkladech, ovšem ještě jsme se nezabývali tvorbou maker, prací s externími soubory, rozhodovacími příkazy a smyčkami atd. V jazyku POV-Raye je tak možné kromě vlastních deklarativně popsaných scén vytvářet i plnohodnotné programy. Jedním z těchto programů je i Rune's Particle System popsaný v šestadvacáté čás­ti.

povray3414

Obrázek 14: Scéna animovaná pomocí Rune's Particle Sys­tem

Byl pro vás článek přínosný?

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.