Hlavní navigace

Absorpce, emise a řízené rozptýlení světla

30. 9. 2008
Doba čtení: 11 minut

Sdílet

V dnešní části seriálu o raytraceru POV-Ray se budeme zabývat problematikou absorpce, emise či rozptýlení světelných paprsků při jejich průchodu vnitřními částmi těles. POV-Ray totiž ve své poslední verzi umožňuje pomocí propracovaných algoritmů simulovat například kouř, oheň či další světelné jevy.

Obsah

1. Absorpce, emise a řízené rozptýlení světla v POV-Rayi
2. Částice absorbující světlo
3. První demonstrační příklad – sloup vytvořený z kouře
4. Částice emitující světlo
5. Druhý demonstrační příklad – vnitřní část tělesa, která emituje světlo
6. Rozptyl světla při průchodu tělesem
7. Třetí demonstrační příklad – řízený rozptyl světla
8. Obsah další části tohoto seriálu

1. Absorpce, emise a řízené rozptýlení světla v POV-Rayi

V předchozí části tohoto seriálu jsme si řekli, že všechna otevřená i uzavřená tělesa v POV-Rayi mají povrch (na nějž může být, jak již víme, nanesena textura) nekonečně tenký, přičemž výpočty většiny optických jevů se provádí při dopadu světelných paprsků právě na tento povrch. Avšak v případě, že se paprsek lomí do vnitřního prostoru tělesa a současně je povrch tohoto tělesa průhledný nebo poloprůhledný, je možné, aby na světelný paprsek nějakým způsobem působil i materiál, z něhož je těleso vytvořeno. V POV-Rayi lze vnitřní část uzavřených těles vyplnit částicemi (particles) s proměnlivou hustotou a různými optickými vlastnostmi. Částice mohou absorbovat (pohlcovat) světelné záření, mohou ho naopak emitovat (vyzařovat, výsledkem je světélkující hmota) nebo – což je výpočetně nejsložitější případ – dokonce mohou rozptylovat procházející světlo. Hustotu částic lze řídit stejným způsobem, jaký byl použit u procedurálních textur, včetně aplikace turbulence. Použití všech tří typů částic si popíšeme a následně ukážeme na několika demonstračních příkladech.

povray3001

Obrázek 1: Při renderingu scény zobrazené na tomto obrázku dochází k nepatrnému rozptylu světelných paprsků, které po dopadu na podlahu vytvoří nepravidelnou světelnou skvrnu a nikoli přesný obraz mříže umístěné v okně na stropu.

2. Částice absorbující světlo

Prvním typem částic, který může vyplňovat vnitřní prostor uzavřených těles, jsou částice absorbující (pohlcující) světlo. Světelný paprsek je v případě, že jsou tyto částice uvnitř tělesa přítomny, při svém průchodu objemem tělesa postupně zeslabován podle toho, kolika částicemi prochází (větší počet částic samozřejmě znamená, že je pohlceno více světelné energie). Výpočet absorpce je založen na stochastickém algoritmu Monte Carlo, pomocí něhož se počítá integrál hustoty částic podél úsečky představující část paprsku, která tělesem prochází. Částice mohou absorbovat pouze světlo určité vlnové délky (tedy jen některou barvu) nebo celé spektrum. Hustotu částic a tím i míru absorbovaného světla je samozřejmě možné měnit, a to stejným způsobem, jaký jsme používali pro specifikaci procedurálních textur – pomocí vhodné funkce akceptující trojici souřadnic (x,y,z) se určují „hustoty“ bodů v prostoru. Čím větší je vypočtená hustota, tím více částic se v daném místě prostoru nachází a zvětšuje se tak míra pohlcování světla.

povray3002

Obrázek 2: Scéna vzniklá po renderingu prvního demonstračního příkladu s relativně pravidelně rozprostřenými částicemi, které absorbují světlo. Vzhledem k tomu, že jsou částice v tělese rozprostřeny s malou mírou náhodnosti, je jasně patrný obrys tělesa.

Aby bylo možné do modelované scény vložit těleso, jehož vnitřní prostor obsahuje částice pohlcující světlo, je nutné zadat několik parametrů pro již zmíněný algoritmus integrace paprsku s využitím metody Monte Carlo, jenž je použitý při výpočtu světelných podmínek („Monte Carlo“ je obecné označení pro skupinu algoritmů, které v průběhu své činnosti používají generátory náhodných čísel). Následně je většinou vhodné specifikovat také funkci, která je aplikována při výpočtu hustoty částic v libovolném místě prostoru tělesa. Samotná konfigurace funkce použité pro výpočet hustoty se v mnohém podobá specifikaci parametrů procedurálních textur; je dokonce možné použít naprosto stejné funkce provádějící mapování ze souřadnic (x,y,z) na jednu hodnotu představující hustotu. Typicky se používají jednoduché funkce typu planar, cylindrical a spherical, nic však nebrání ani v použití složitějších funkcí, jakými jsou například wood, bozo či agate.

povray3003

Obrázek 3: Opět se jedná o scénu vykreslenou na základě prvního demonstračního příkladu, zde je však rozložení částic vlivem turbulence více náhodné, což se projevuje na nepravidelnějším tvaru kouřového sloupce.

Mezi nejdůležitější parametr uzlu media patří specifikace typu (či typů) částic, které vyplňují vnitřní prostor tělesa. V případě částic absorbujících světlo se zadává atribut absorption, za nímž je uvedena barva představující spektrum, které je částicemi pohlcováno. Například zápis absorption Red znamená, že je částicemi pohlcována pouze červená barva, absorption 1.0 pak pohlcení celého spektra s intenzitou 100% (je možné dokonce nastavit i intenzity přesahující 100%). Dále lze pomocí poduzlu density zadat funkci použitou při výpočtu hustoty částic (viz první demonstrační příklad). Pokud není tento poduzel zapsán, bude celé těleso vyplněno pravidelně rozmístěnými částicemi. Mezi další parametry patří parametr intervals (celkový počet intervalů, na které je paprsek rozdělen; výpočty probíhají nad jednotlivými intervaly samostatně), samples (počet vzorků v každém intervalu) a method (metoda, která je použitá při výběru jednotlivých vzorků).

povray3004

Obrázek 4: Další zvýšení míry turbulence má za následek vykreslení ještě náhodnějšího kou­ře.

3. První demonstrační příklad – sloup vytvořený z kouře

V dnešním prvním demonstračním příkladu je ukázána tvorba jednoduchého sloupu vytvořeného z kouře. Samotný kouřový sloup je představován vertikálně postaveným válcem, jehož povrch je zcela průhledný. Uvnitř válce se nachází částice pohlcující světlo, přičemž hustota částic je určena funkcí cylindrical. Pomocí této funkce se hustota částic mění tak, že je v blízkosti osy válce maximální a postupně lineárně klesá se vzrůstající vzdáleností od osy válce. Pokud by tato funkce nebyla ovlivněna žádnými dalšími parametry, zobrazil by se po vykreslení scény pravidelný černý rotační válec, jehož okraje by byly částečně průhledné. Ovšem vlivem turbulence není hustota částic ve válci zcela pravidelná, díky čemuž vznikl vizuálně poměrně působivý obraz kouře, zvláště při použití vyšších hodnot turbulence. Všimněte si také, že kouř dokonce vrhá stíny, což je ovšem předvídatelná vlastnost, když si uvědomíme, že jsou ovlivněny všechny paprsky procházející válcem, tedy i paprsky odražené od podlahy.

povray3005

Obrázek 5: Scéna vykreslená s využitím zdrojového kódu prvního demonstračního příkladu.

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

// ------------------------------------------------------------
// První demonstrační příklad ukazující práci s částicemi
// absorbujícími světlo.
//
// Uprostřed scény se nachází kouřový sloup, turbulenci
// kouře lze ovlivňovat změnou hodnoty interní proměnné clock.
//
// rendering lze spustit příkazem:
//     povray +W800 +H600 +B100 +FN +D +Imedia1.pov +Omedia1.png
// (pro náhled postačí zadat příkaz povray media1.pov)
// ------------------------------------------------------------

global_settings                          // globální nastavení parametrů scény
{
    max_trace_level 5
}

background
{                                        // barva pozadí
    color rgb <0.2, 0.4, 0.8>
}

#include "colors.inc"

// nastavení kamery
camera
{
    location <-1.5, 30, -150>            // pozice kamery v prostoru
    look_at <0, 25, 35>                  // bod, na který se kamera dívá
    angle 35                             // zorný úhel
}

// bodový světelný zdroj
light_source
{
    <100, 100, -200>                     // pozice světelného zdroje
    color White                          // barva světla
}

// rovina tvořící "podlahu"
plane
{
    y, 0                                 // orientace roviny a její vzdálenost od počátku
    pigment {                            // šachovnicová textura
        checker                          // vyvedená ve stupních šedi
        color rgb <0.1, 0.3, 0.4>
        color rgb <0.2, 0.5, 0.7>
        scale 12
    }
    finish
    {
        reflection 0.15                  // odrazivost povrchu roviny
    }
    hollow                               // Důležité! i rovina musí být "prázdná"
}

// kouřový válec
cylinder
{
    <0, -0.8, 0>,                        // střed první podstavy
    <0,  1.5, 0>,                        // střed druhé podstavy
    1                                    // poloměr válce
    pigment
    {
        color rgbt<1,1,1,1>              // povrch válce je zcela průhledný
    }
    interior                             // vlastnosti vnitřku válce
    {
        media
        {
            absorption 1.0               // světlo absorbující částice
            intervals 1                  // parametry pro algoritmus Monte Carlo
            samples 5
            method 3
            density
            {                            // změna hustoty částic
                cylindrical              // použitá mapovací funkce
                ramp_wave                // pilovitý průběh (v rámci válce lineární)
                turbulence 2+clock*5     // přidaná náhodnost - změna polohy bodů
            }
        }
    }
    scale 25
    translate 25*y
    hollow                               // Důležité! válec musí být "prázdný"
}



// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray3006

Obrázek 6: První demonstrační příklad vykreslený při nastavení velmi vysoké hodnoty turbulence, která ovlivnila rozložení hustoty částic v prostoru.

4. Částice emitující světlo

Druhým typem částic, které mohou vyplňovat prostor uzavřeného tělesa, jsou částice emitující (vyzařující) světlo. Pokud je povrch tělesa obsahujícího tyto částice průhledný či poloprůhledný, vnitřek tělesa skutečně září, přičemž frekvence vyzařovaného světla (tj. barva) se může lišit v závislosti na místní hustotě částic – tímto způsobem je možné modelovat například různé výbuchy či firebally, z jejichž středu je většinou vyzařováno velmi intenzivní bílé či žluté světlo a z okraje světlo spíše červené.

povray3007

Obrázek 7: Koule obsahující částice vyzařující světlo (druhý demonstrační příklad)

Při používání částic, které emitují světlo, je nutné mít na paměti, že tyto částice sice skutečně září, nejedná se však o plnohodnotné světelné zdroje, které by například tvořily stíny a polostíny. POV-Ray totiž, stejně jako naprostá většina ostatních raytracerů, nedokáže pracovat se skutečnými objemovými zdroji světla, pouze se zdroji bodovými a částečně také plošnými (zde ovšem za cenu zpomalení výpočtu). Tuto nevýhodu lze částečně odstranit tím, že se do vnitřní části modelovaného tělesa vloží skutečný bodový světelný zdroj.

povray3008

Obrázek 8: Koule obsahující částice vyzařující světlo, v jejímž středu se navíc nachází skutečný světelný zdroj. Povšimněte si, že vnitřní strana povrchu tělesa je tímto zdrojem ozářena.

5. Druhý demonstrační příklad – vnitřní část tělesa, která emituje světlo

Ve druhém demonstračním příkladu je ukázáno použití částic, které emitují světlo. Povrch koule, jež tvoří ústřední objekt testovací scény, je pokryt procedurální texturou typu crackle, přičemž barvová mapa je upravena tak, aby textura byla v některých svých místech zcela průhledná (čtvrtá složka barvy totiž představuje, jak jsme si již řekli v předchozích částech tohoto seriálu, míru průhlednosti). Vnitřní část koule obsahuje částice, které emitují světlo. Stejně jako v prvním demonstračním příkladu, i zde je hustota částic řízena jednoduchou funkcí s lineárním průběhem výstupních hodnot. Konkrétně se jedná o funkci spherical. Vstupní hodnoty této funkce jsou podrobeny turbulenci a navíc je proveden posun výsledného efektu pomocí lineární transformace translate. Výsledkem je těleso, které je vyplněno ohnivou plazmou, jejíž tvar je možné měnit například parametry turbulence, lambda, omega atd., tedy zcela stejným způsobem, jako u procedurálních textur.

povray3009

Obrázek 9: Scéna vykreslená s využitím zdrojového kódu druhého demonstračního příkladu

Zdrojový kód druhého demonstračního příkladu má tvar:

// ------------------------------------------------------------
// Druhý demonstrační příklad ukazující práci s částicemi
// emitujícími světlo.
//
// Uprostřed scény se nachází koule pokrytá místy průhlednou
// procedurální texturou. Uvnitř koule je "plazma".
//
// rendering lze spustit příkazem:
//     povray +W800 +H600 +B100 +FN +D +Imedia2.pov +Omedia2.png
// (pro náhled postačí zadat příkaz povray media2.pov)
// ------------------------------------------------------------

global_settings                          // globální nastavení parametrů scény
{
    max_trace_level 5
}

background
{                                        // barva pozadí
    color rgb <0.2, 0.4, 0.8>
}

#include "colors.inc"

// nastavení kamery
camera
{
    location <-1.5, 30, -150>            // pozice kamery
    look_at <0, 25, 35>                  // bod, na který se kamera dívá
    angle 35                             // zorný úhel
}

// bodový světelný zdroj
light_source
{
    <100, 100, -200>                     // pozice světelného zdroje
    color White                          // barva světla
}

// rovina tvořící "podlahu"
plane
{
    y, 0                                 // orientace roviny a její vzdálenost od počátku
    pigment {                            // šachovnicová textura
        checker                          // vyvedená ve stupních šedi
        color rgb <0.1, 0.3, 0.4>
        color rgb <0.2, 0.5, 0.7>
        scale 12
    }
    finish
    {
        reflection 0.15                  // odrazivost povrchu roviny
    }
    hollow                               // Důležité! i rovina musí být "prázdná"
}


sphere
{
    <0, 0, 0>,                           // střed
    1                                    // poloměr koule
    pigment
    {
        crackle                          // typ procedurální textury
        color_map {                      // barvová mapa
            [0.00 White]
            [0.05 Wheat]
            [0.10 Red]
            [0.20 rgbt<1,1,1,1>]         // postupný přechod mezi červenou a průhlednou
            [1.00 rgbt<1,1,1,1>]         // zcela průhledná barva
        }
        offset 0
        scale 1/5                        // zvětšení textury
    }
    finish
    {                                    // odlesky
        phong 1
        phong_size 100
    }
    interior                             // vlastnosti vnitřku koule
    {
        media
        {
            emission 0.1
            intervals 2                  // parametry pro algoritmus Monte Carlo
            samples 5
            method 3
            density
            {                            // změna hustoty částic
                spherical                // použitá mapovací funkce
                ramp_wave                // pilovitý průběh (v rámci koule lineární)
                turbulence 1             // přidaná náhodnost - změna polohy bodů
                translate 0.5*x
                rotate <clock*360*3, clock*360*4, 0>
                color_map                // barvová mapa
                {
                    [0.0 color rgb <0, 0, 0>]
                    [0.1 color rgb <1, 0, 0>]
                    [1.0 color rgb <1, 1, 0>]
                }
            }
        }
    }
    scale 25
    translate 25*y
    hollow                               // Důležité! koule musí být "prázdná"
}



// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray3010

Obrázek 10: Pootočení vnitřní koule vyplněné částicemi

6. Rozptyl světla při průchodu tělesem

Nejsložitějším typem částic, které mohou vyplňovat uzavřená tělesa, jsou částice rozptylující světelné paprsky. Pomocí těchto částic je možné modelovat takové optické jevy, jako je mlha, pára či reálně působící oheň. Výpočet rozptylu světla se provádí na základě jednoho z pěti modelů, například model číslo 2 je používán při zobrazování skutečně trojrozměrných mraků či mlhy, model číslo 4 při výpočtu rozptylu světla ve vzduchu obsahujícího velmi malé částečky atd. Kromě typu modelu, podle kterého se výpočet provádí, je nutné v poduzlu scattering zadat i barvu rozptylovaného světla. Implicitní hodnota rgb 0,0,0 znamená, že k žádnému rozptylu nedochází.

povray3011

Obrázek 11: Obrázek vypočtený na základě třetího demonstračního příkladu

7. Třetí demonstrační příklad – řízený rozptyl světla

Ve třetím demonstračním příkladu je ukázáno, jakým způsobem je možné využít částice, které rozptylují světelné paprsky. Ve scéně se nachází kužel pokrytý částečně průhlednou procedurální texturou – je použita textura spiral2, která na povrchu válce vytváří zajímavé obrazce. Uvnitř kužele se nachází částice rozptylující světlo, přičemž hustota částic je řízena funkcí cylindrical, před jejíž aplikací je na vstupní body (opět) aplikována turbulence. Výsledkem renderingu je kužel, v němž je kouř či mlha. Následuje výpis zdrojového kódu třetího demonstračního příkladu:

// ------------------------------------------------------------
// Třetí demonstrační příklad ukazující práci s částicemi
// rozptylujícími světlo.
//
// rendering lze spustit příkazem:
//     povray +W800 +H600 +B100 +FN +D +Imedia3.pov +Omedia3.png
// (pro náhled postačí zadat příkaz povray media3.pov)
// ------------------------------------------------------------

global_settings                          // globální nastavení parametrů scény
{
    max_trace_level 5
}

background
{                                        // barva pozadí
    color rgb <0.2, 0.4, 0.8>
}

#include "colors.inc"

// nastavení kamery
camera
{
    location <-1.5, 30, -150>            // pozice kamery
    look_at <0, 25, 35>                  // bod, na který se kamera dívá
    angle 35                             // zorný úhel
}

// bodový světelný zdroj
light_source
{
    <100, 100, -200>                     // pozice světelného zdroje
    color White                          // barva světla
}

// rovina tvořící "podlahu"
plane
{
    y, 0                                 // orientace roviny a její vzdálenost od počátku
    pigment {                            // šachovnicová textura
        checker                          // vyvedená ve stupních šedi
        color rgb <0.4, 0.3, 0.1>
        color rgb <0.7, 0.5, 0.2>
        scale 12
    }
    finish
    {
        reflection 0.15                  // odrazivost povrchu roviny
    }
    hollow                               // Důležité! i rovina musí být "prázdná"
}

cone
{
    <0, -0.9, 0>,                        // střed podstavy
    1.5,                                 // poloměr podstavy
    <0, 1.5, 0>
    0
    pigment
    {
        spiral2 5                        // typ procedurální textury
        color_map
        {                                // barvová mapa
            [0.00 Gray]
            [0.05 Wheat]
            [0.40 Red]
            [0.50 rgbt<1,1,1,1>]         // postupný přechod mezi červenou a průhlednou
            [1.00 rgbt<1,1,1,1>]         // zcela průhledná barva
        }
        rotate <10,20,30>
        scale 1/4                        // zvětšení textury
    }
    finish
    {                                    // odlesky
        phong 1
        phong_size 100
    }
    interior                             // vlastnosti vnitřku kužele
    {
        media
        {
            scattering                   // částice rozptylující světlo
            {
                4, rgb <0.5,0.5,0.5>
            }
            intervals 2                  // parametry pro algoritmus Monte Carlo
            samples 5
            method 3
            density
            {                            // změna hustoty částic
                cylindrical              // použitá mapovací funkce
                ramp_wave                // pilovitý průběh (v rámci kužele lineární)
                turbulence 1             // přidaná náhodnost - změna polohy bodů
            }
        }
    }
    scale 25
    translate 25*y
    hollow                               // Důležité! kužel musí být "prázdný"
}



// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray3012

Obrázek 12: Třetí demonstrační příklad zobrazený po odstranění textury z povrchu tělesa.

povray3013

Obrázek 13: Změna tvaru tělesa použitého ve třetím demonstračním příkladu – tentokrát se jedná o kouli, i když to pravděpodobně nelze poznat.

root_podpora

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

I v následující části tohoto seriálu budeme pokračovat v popisu pokročilejších metod renderingu. Ukážeme si například, jakým způsobem je možné vymodelovat mlžné či prašné prostředí, jak lze vytvořit rozptyl světelných paprsků při průchodu vzduchem, ve kterém se vznáší zrnka prachu atd. Na posledním obrázku je tento světelný efekt ukázán – bílou kouli umístěnou uprostřed scény osvětluje trojice reflektorových světelných zdrojů, jejichž kužely jsou díky částečnému rozptylu světla v okolním prostředí jasně viditelné.

povray3014

Obrázek 14: Bílá koule osvětlená několika reflektorovými světelnými zdroji

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.