Hlavní navigace

Mlha a rozptyl světelných paprsků v POV-Rayi

7. 10. 2008
Doba čtení: 17 minut

Sdílet

V jednatřicáté části seriálu o raytraceru POV-Ray 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.

Obsah

1. Mlha a rozptyl světelných paprsků v POV-Rayi
2. První demonstrační příklad – testovací scéna s dokonale průhledným prostředím
3. Metody pro modelování mlhy, vztah pro výpočet barvy předmětů v mlžném prostředí
4. Druhý demonstrační příklad – mlha vyplňující celou scénu
5. Třetí demonstrační příklad – „přízemní“ mlha
6. Čtvrtý demonstrační příklad – prostředí obsahující částice, které rozptylují světelné paprsky
7. Rozptyl světelných paprsků při jejich průchodu volným prostorem
8. Pátý demonstrační příklad – rozptyl světelných paprsků tří reflektorových zdrojů světla
9. Obsah dalšího pokračování seriálu

1. Mlha a rozptyl světelných paprsků v POV-Rayi

V předchozí části seriálu o raytraceru POV-Ray jsme si mj. řekli, že vnitřní části uzavřených těles je možné vyplnit částicemi s proměnlivou hustotou a různými optickými vlastnostmi. Tyto částice mohou podle volby uživatele absorbovat (pohlcovat) světelné záření, mohou ho naopak emitovat (vyzařovat, výsledkem je světélkující hmota, i když se ve skutečnosti nejedná o skutečný zdroj světla) nebo – což je výpočetně nejsložitější, ale vizuálně nejzajímavě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. POV-Ray však také umožňuje změnit některé optické vlastnosti okolního prostředí. Doposud jsme vytvářeli scény, ve kterých se světelné paprsky mezi tělesy, pozorovatelem (kamerou) i světelnými zdroji šířily tak, jako by v okolním prostoru bylo dokonalé vakuum, které světelné paprsky žádným způsobem, jenž by se vizuálně projevil ve výsledné scéně, neovlivňuje.

povray3101

Obrázek 1: Tato scéna obsahuje pouze dvě tělesa – rovinu představující vodní hladinu a kouli představující oblohu. Prostor uvnitř koule, ve které se nachází i pozorovatel, obsahuje vakuum, což mimo jiné vede i k příliš dokonalému renderingu vzdálenějších vln. To nemusí působit přirozeně.

Absence plynu (atmosféry) v modelovaných scénách vede po renderingu mj. k tvorbě dokonale ostrých obrázků, které však právě kvůli oné dokonalosti (která u prvních raytracerů a jimi vykreslených scén vyvolávala údiv) nepůsobí příliš realisticky. Proto si v dnešní části seriálu povíme, jakým způsobem je možné prostor mezi tělesy vyplnit mlhou (POV-Ray podporuje dva typy mlhy, mlhu vyplňující celý prostor a „přízemní mlhu“), částicemi se stejnými vlastnostmi, jaké mohou mít částice umístěné uvnitř uzavřených těles, či jak lze simulovat rozptyl světelných paprsků procházejících plynem, který – na rozdíl od vakua – může světlo částečně rozptylovat.

povray3102

Obrázek 2: Ve snaze o dosažení co největší míry reality je v této scéně použito další vlastnosti POV-Raye, který dokáže simulovat rozostření příliš blízkých či naopak příliš vzdálených těles. Viz zelený popelník a váza umístěná v pozadí scény.

2. První demonstrační příklad – testovací scéna s dokonale průhledným prostředím

První demonstrační příklad, který tvoří základ všech ukázkových příkladů, jež budou následovat v navazujících kapitolách, je poměrně jednoduchý – ve scéně se nachází jeden plošný světelný zdroj, prostorový text „root.cz“, čtyři otexturované koule a kvádr, do kterého je celá scéna, včetně pozorovatele i světelného zdroje, uzavřena. Povšimněte si, že je v uzlu box, kterým je do scény vložen kvádr, zapsán i modifikátor hollow. Jeho význam již známe; pokud je tento modifikátor použit, stane se z původně vyplněného tělesa dutý objekt, jehož povrch je nekonečně tenký, podobně jako je tomu u konceptuálně otevřených těles. V prvním demonstračním příkladu je zcela jedno, zda je modifikátor hollow zapsán či ne, ovšem u příkladů, které následují, je již nutné tento modifikátor použít, protože v opačném případě by kvádr nemohl být vyplněn mlhou a nedocházelo by v něm ani k rozptylu světla.

povray3103

Obrázek 3: První demonstrační příklad po vykreslení v POV-Rayi.

Zdrojový soubor dnešního prvního demonstračního příkladu má tento obsah:

// ------------------------------------------------------------
// První demonstrační příklad na použití světelných efektů
// v prostorových scénách vykreslovaných POV-Rayem.
//
// V této scéně je použitý jeden plošný zdroj světla, vnitřek
// kvádru, ve kterém se kromě dalších objektů nachází i světelný
// zdroj a kamera, je prázdný.
//
// rendering lze spustit příkazem:
//     povray +W800 +H600 +B100 +FN +D +Iscena1.pov +Oscena1.png
// (pro náhled postačí zadat povray scena1.pov)
// ------------------------------------------------------------

#include "colors.inc"
#include "textures.inc"

// nastavení kamery
camera
{
    location  <-4, 3, -9>                // pozice kamery
    look_at   <0, 0, 0>                  // bod, na který se kamera dívá
    angle 48                             // zorný úhel
}

// plošný zdroj světla
light_source
{
    <2, 6, -3>                           // střed plošky
    color White                          // barva světla
    area_light <1, 0, 0>, <0, 0, 1>, 5, 5// velikost a počet bodových světel
    adaptive 1
    jitter                               // roztřesení bodových světel
}

// objekt vytvořený z písmen, jejichž tvary jsou přečteny z externího souboru s fontem
text
{
    ttf                                  // formát s uloženým fontem
    "crystal.ttf",                       // soubor s fontem dodávaný současně s POV-Rayem
    "root.cz",                           // text, který se má vytvořit
    0.5,                                 // hloubka textového objektu
    0                                    // mezera mezi znaky
    texture
    {                                    // textura, kterou je objekt pokrytý
        DMFLightOak
        scale 0.5
    }
    scale 2.5                            // změna měřítka textového objektu
    translate <-4, 0, -1>                // posun textového objektu
}

// první otexturovaná koule
sphere
{
    <0,-1,0>, 1                          // pozice středu a poloměr
    texture
    {                                    // textura, kterou je objekt pokrytý
        Sapphire_Agate
    }
    translate <2.5, 0, -2>               // posun koule ve scéně
}

// druhá otexturovaná koule
sphere
{
    <0,-1,0>, 1                          // pozice středu a poloměr
    texture
    {                                    // textura, kterou je objekt pokrytý
        Sapphire_Agate
    }
    translate <5.5, 0, 6>                // posun koule ve scéně
}

// třetí otexturovaná koule
sphere
{
    <0,-1,0>, 1                          // pozice středu a poloměr
    texture
    {                                    // textura, kterou je objekt pokrytý
        Sapphire_Agate
    }
    translate <-2, 0, -2>                // posun koule ve scéně
}

// čtvrtá otexturovaná koule
sphere
{
    <0,-1,0>, 1                          // pozice středu a poloměr
    texture
    {                                    // textura, kterou je objekt pokrytý
        Sapphire_Agate
    }
    translate <-2.5, 0, 6>               // posun koule ve scéně
}

// kvádr, do kterého je celá scéna uzavřena
box
{
    <-16, -2,-16>,
    < 24, 20, 20>
    texture
    {
        pigment
        {                                // šachovnicová textura
            checker                      // vyvedená ve stupních šedi a růžové barvy
            color rgb<0.1, 0.1, 0.1>
            color rgb<1.0, 0.6, 0.6>
        }
        finish
        {                                // odlesky a odrazy na povrchu
            diffuse 0.7
            reflection 0.2
        }
    }
    hollow                               // aby výpočet mlhy probíhal korektně, je důležité
}                                        // kameru neumisťovat do uzavřených vyplněných těles

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 

3. Metody pro modelování mlhy, vztah pro výpočet barvy předmětů v mlžném prostředí

POV-Rayi je možné celou modelovanou scénu, přesněji řečeno prostor mezi tělesy, vyplnit mlhou. Výpočet skutečných barev předmětů, které se ve scéně nachází, je mlhou ovlivněn, a to tak, že vzdálenější předměty ztrácí svou původní barvu (resp. barvu vypočtenou na základě Phongova osvětlovacího modelu), jejich barva je postupně nahrazována barvou mlhy. Čím vzdálenější je objekt od pozorovatele, tím méně původní barvy je pro jeho vykreslení použito.

povray3104

Obrázek 4: Poměrně fádní scéna se stane po doplnění mlhy zajímavější.

Vztah pro výpočet barvy každého pixelu ve scéně ponořené do mlhy je sice na první pohled poněkud složitější, vystihuje však poměrně přesně reálné optické vlastnosti mlhy:

PIXEL_COLOR = exp(-d/D) × OBJECT_COLOR + (1-exp(-d/D)) × FOG_COLOR 

kde d je vzdálenost bodu, jehož barva se počítá, od pozorovatele a D je hodnota parametru distance umístěného v uzlu fog. Tento parametr je při specifikaci mlhy nejdůležitější, protože zásadním způsobem ovlivňuje celý výsledný charakter vykreslené scény. Dalším důležitým parametrem je barva mlhy, která sice může být libovolná (není problém vykreslit například světle oranžovou či tmavě modrou mlhu), většinou se však používá pouze barva šedá. Výše uvedený vztah je použit u mlhy typu 1, což je mlha vyplňující celý prostor mezi tělesy. Kromě toho existuje i mlha typu 2, neboli „přízemní mlha“. Pro tento typ mlhy je typické, že se její hustota mění společně s výškou, tj. s rostoucí hodnotou na ose y. Přízemní mlha bude popsána u třetího demonstračního příkladu.

povray3105

Obrázek 5: Jednoduchou úpravou třetího demonstračního příkladu byl vytvořen tento obrázek, ve kterém jsou všechny předměty ponořeny do modré přízemní mlhy.

4. Druhý demonstrační příklad – mlha vyplňující celou scénu

V dnešním druhém demonstračním příkladu je ukázáno použití mlhy typu 1. Celá scéna je ponořena do mlhy, která má tmavě šedou barvu. V uzlu typu fog jsou zapsány parametry distance, color a navíc turbulence, pomocí níž lze zavést určitou míru náhodnosti do výpočtu hustoty mlhy, což vede k vyšší realističnosti vykreslené scény. Povšimněte si (například při pohledu na podlahu nebo vzdálenou stěnu), jak se barva předmětů se zvyšující se vzdáleností od pozorovatele mění na šedou.

povray3106

Obrázek 6: Druhý demonstrační příklad po vykreslení v POV-Rayi.

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

// ------------------------------------------------------------
// Druhý demonstrační příklad na použití světelných efektů
// v prostorových scénách vykreslovaných POV-Rayem.
//
// V této scéně je použitý jeden plošný zdroj světla, vnitřek
// kvádru, ve kterém se kromě dalších objektů nachází i světelný
// zdroj a kamera, je vyplněný šedou mlhou s konstantní hustotou.
//
// rendering lze spustit příkazem:
//     povray +W800 +H600 +B100 +FN +D +Iscena2.pov +Oscena2.png
// (pro náhled postačí zadat povray scena2.pov)
// ------------------------------------------------------------

#include "colors.inc"
#include "textures.inc"

// nastavení kamery
camera
{
    location  <-4, 3, -9>                // pozice kamery
    look_at   <0, 0, 0>                  // bod, na který se kamera dívá
    angle 48                             // zorný úhel
}

// plošný zdroj světla
light_source
{
    <2, 6, -3>                           // střed plošky
    color White                          // barva světla
    area_light <1, 0, 0>, <0, 0, 1>, 5, 5// velikost a počet bodových světel
    adaptive 1
    jitter                               // roztřesení bodových světel
}

fog
{
    color rgb <0.4, 0.4, 0.4>            // barva mlhy - tmavě šedá
    distance 10                          // hodnota určující vzdálenost, ve kterém
                                         // předměty z 36 % nabývají barvy mlhy
    turbulence 1                         // změna hustoty mlhy na základě šumové funkce
}

// objekt vytvořený z písmen, jejichž tvary jsou přečteny z externího souboru s fontem
text
{
    ttf                                  // formát s uloženým fontem
    "crystal.ttf",                       // soubor s fontem dodávaný současně s POV-Rayem
    "root.cz",                           // text, který se má vytvořit
    0.5,                                 // hloubka textového objektu
    0                                    // mezera mezi znaky
    texture
    {                                    // textura, kterou je objekt pokrytý
        DMFLightOak
        scale 0.5
    }
    scale 2.5                            // změna měřítka textového objektu
    translate <-4, 0, -1>                // posun textového objektu
}

// první otexturovaná koule
sphere
{
    <0,-1,0>, 1                          // pozice středu a poloměr
    texture
    {                                    // textura, kterou je objekt pokrytý
        Sapphire_Agate
    }
    translate <2.5, 0, -2>               // posun koule ve scéně
}

// druhá otexturovaná koule
sphere
{
    <0,-1,0>, 1                          // pozice středu a poloměr
    texture
    {                                    // textura, kterou je objekt pokrytý
        Sapphire_Agate
    }
    translate <5.5, 0, 6>                // posun koule ve scéně
}

// třetí otexturovaná koule
sphere
{
    <0,-1,0>, 1                          // pozice středu a poloměr
    texture
    {                                    // textura, kterou je objekt pokrytý
        Sapphire_Agate
    }
    translate <-2, 0, -2>                // posun koule ve scéně
}

// čtvrtá otexturovaná koule
sphere
{
    <0,-1,0>, 1                          // pozice středu a poloměr
    texture
    {                                    // textura, kterou je objekt pokrytý
        Sapphire_Agate
    }
    translate <-2.5, 0, 6>               // posun koule ve scéně
}

// kvádr, do kterého je celá scéna uzavřena
box
{
    <-16, -2,-16>,
    < 24, 20, 20>
    texture
    {
        pigment
        {                                // šachovnicová textura
            checker                      // vyvedená ve stupních šedi a růžové barvy
            color rgb<0.1, 0.1, 0.1>
            color rgb<1.0, 0.6, 0.6>
        }
        finish
        {                                // odlesky a odrazy na povrchu
            diffuse 0.7
            reflection 0.2
        }
    }
    hollow                               // aby výpočet mlhy probíhal korektně, je důležité
}                                        // kameru neumisťovat do uzavřených vyplněných těles

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 

5. Třetí demonstrační příklad – „přízemní“ mlha

Třetí demonstrační příklad vychází z příkladu druhého, ovšem s tím rozdílem, že je v něm použita takzvaná „přízemní“ mlha. Jedná se o mlhu, jejíž hustota slábne spolu s rostoucí výškou, která (samozřejmě za předpokladu, že není změněn souřadný systém) je reprezentována souřadnicemi na souřadné ose y. U přízemní mlhy je nutné specifikovat další tři parametry. První parametr, jenž nese název fog_type, slouží k volbě mlhy typu 2; implicitní hodnota tohoto parametru je 1, tj. u běžné „konstantní“ mlhy se nemusí uvádět. Dalším parametrem nazvaným fog_offset se specifikuje takzvaná mezní výška. Mlha má pod touto výškou konstantní hustotu, tj. má zde stejné optické vlastnosti jako běžná mlha. Poslední parametr se jmenuje fog_alt a je pomocí něj možné změnit míru změny hustoty mlhy spolu s rostoucí výškou. Malá hodnota tohoto parametru znamená, že přechod mezi hustou mlhou a průhledným vzduchem je rychlý, velká hodnota naopak značí pomalý přechod.

povray3107

Obrázek 7: Třetí demonstrační příklad po vykreslení v POV-Rayi.

Následuje výpis zdrojového kódu třetího demonstračního příkladu:

// ------------------------------------------------------------
// Třetí demonstrační příklad na použití světelných efektů
// v prostorových scénách vykreslovaných POV-Rayem.
//
// V této scéně je použitý jeden plošný zdroj světla, vnitřek
// kvádru, ve kterém se kromě dalších objektů nachází i světelný
// zdroj a kamera, je vyplněný šedou "přízemní" mlhou.
//
// rendering lze spustit příkazem:
//     povray +W800 +H600 +B100 +FN +D +Iscena3.pov +Oscena3.png
// (pro náhled postačí zadat povray scena3.pov)
// ------------------------------------------------------------

#include "colors.inc"
#include "textures.inc"

// nastavení kamery
camera
{
    location  <-4, 3, -9>                // pozice kamery
    look_at   <0, 0, 0>                  // bod, na který se kamera dívá
    angle 48                             // zorný úhel
}

// plošný zdroj světla
light_source
{
    <2, 6, -3>                           // střed plošky
    color White                          // barva světla
    area_light <1, 0, 0>, <0, 0, 1>, 5, 5// velikost a počet bodových světel
    adaptive 1
    jitter                               // roztřesení bodových světel
}

fog
{
    color rgb <0.4, 0.4, 0.4>            // barva mlhy
    fog_type 2                           // typ mlhy - přízemní mlha
    distance 5
    fog_offset 1 //-0.5                  // mezní výška, mlha má pod touto výškou konstantní hustotu
    fog_alt 0.7  //0.1                   // výška, ve které (po přičtení k hodnotě fog_offset)
                                         // dochází k postupnému houstnutí mlhy
}

// objekt vytvořený z písmen, jejichž tvary jsou přečteny z externího souboru s fontem
text
{
    ttf                                  // formát s uloženým fontem
    "crystal.ttf",                       // soubor s fontem dodávaný současně s POV-Rayem
    "root.cz",                           // text, který se má vytvořit
    0.5,                                 // hloubka textového objektu
    0                                    // mezera mezi znaky
    texture
    {                                    // textura, kterou je objekt pokrytý
        DMFLightOak
        scale 0.5
    }
    scale 2.5                            // změna měřítka textového objektu
    translate <-4, 0, -1>                // posun textového objektu
}



// první otexturovaná koule
sphere
{
    <0,-1,0>, 1                          // pozice středu a poloměr
    texture
    {                                    // textura, kterou je objekt pokrytý
        Sapphire_Agate
    }
    translate <2.5, 0, -2>               // posun koule ve scéně
}

// druhá otexturovaná koule
sphere
{
    <0,-1,0>, 1                          // pozice středu a poloměr
    texture
    {                                    // textura, kterou je objekt pokrytý
        Sapphire_Agate
    }
    translate <5.5, 0, 6>                // posun koule ve scéně
}

// třetí otexturovaná koule
sphere
{
    <0,-1,0>, 1                          // pozice středu a poloměr
    texture
    {                                    // textura, kterou je objekt pokrytý
        Sapphire_Agate
    }
    translate <-2, 0, -2>                // posun koule ve scéně
}

// čtvrtá otexturovaná koule
sphere
{
    <0,-1,0>, 1                          // pozice středu a poloměr
    texture
    {                                    // textura, kterou je objekt pokrytý
        Sapphire_Agate
    }
    translate <-2.5, 0, 6>               // posun koule ve scéně
}

// kvádr, do kterého je celá scéna uzavřena
box
{
    <-16, -2,-16>,
    < 24, 20, 20>
    texture
    {
        pigment
        {                                // šachovnicová textura
            checker                      // vyvedená ve stupních šedi a růžové barvy
            color rgb<0.1, 0.1, 0.1>
            color rgb<1.0, 0.6, 0.6>
        }
        finish
        {                                // odlesky a odrazy na povrchu
            diffuse 0.7
            reflection 0.2
        }
    }
    hollow                               // aby výpočet mlhy probíhal korektně, je důležité
}                                        // kameru neumisťovat do uzavřených vyplněných těles

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray3108

Obrázek 8: Změna počáteční výšky přízemní mlhy i prostoru, ve kterém dochází k postupnému snižování její hustoty.

6. Čtvrtý demonstrační příklad – prostředí obsahující částice, které rozptylují světelné paprsky

V předchozí části tohoto seriálu jsme si ukázali, jakým způsobem je možné vyplnit prostor uzavřených těles. Jeden z typů výplní byl založen na nepatrných a samostatně neviditelných částicích, které rozptylují světelné paprsky. Právě tento typ výplně je použit i v dnešním čtvrtém demonstračním příkladu, kde je využito faktu, že se jak pozorovatel (kamera), tak i světelné zdroje a všechny menší objekty nacházejí uvnitř kvádru představujícího vykachlíkovanou místnost. V případě, že se tento kvádr vyplní částicemi, které pohlcují či rozptylují světlo, vznikne prostředí plné mlhy, páry či rozptýleného barevného plynu, jehož hustotu je možné modifikovat aplikací již několikrát zmiňované turbulence. Zdrojový kód čtvrtého demonstračního příkladu má tvar:

// ------------------------------------------------------------
// Čtvrtý demonstrační příklad na použití světelných zdrojů
// v prostorových scénách vykreslovaných POV-Rayem.
//
// V této scéně je použitý jeden plošný zdroj světla, vnitřek
// kvádru, ve kterém se kromě dalších objektů nachází i světelný
// zdroj a kamera, je vyplněný částicemi rozptylujícími světlo.
//
// rendering lze spustit příkazem:
//     povray +W800 +H600 +B100 +FN +D +Iscena4.pov +Oscena4.png
// (pro náhled postačí zadat povray scena4.pov)
// ------------------------------------------------------------

#include "colors.inc"
#include "textures.inc"

// nastavení kamery
camera
{
    location  <-4, 3, -9>                // pozice kamery
    look_at   <0, 0, 0>                  // bod, na který se kamera dívá
    angle 48                             // zorný úhel
}

// plošný zdroj světla
light_source
{
    <2, 6, -3>                           // střed plošky
    color White                          // barva světla
    area_light <1, 0, 0>, <0, 0, 1>, 5, 5// velikost a počet bodových světel
    adaptive 1
    jitter                               // roztřesení bodových světel
}

// objekt vytvořený z písmen, jejichž tvary jsou přečteny z externího souboru s fontem
text
{
    ttf                                  // formát s uloženým fontem
    "crystal.ttf",                       // soubor s fontem dodávaný současně s POV-Rayem
    "root.cz",                           // text, který se má vytvořit
    0.5,                                 // hloubka textového objektu
    0                                    // mezera mezi znaky
    texture
    {                                    // textura, kterou je objekt pokrytý
        DMFLightOak
        scale 0.5
    }
    scale 2.5                            // změna měřítka textového objektu
    translate <-4, 0, -1>                // posun textového objektu
}



// první otexturovaná koule
sphere
{
    <0,-1,0>, 1                          // pozice středu a poloměr
    texture
    {                                    // textura, kterou je objekt pokrytý
        Sapphire_Agate
    }
    translate <2.5, 0, -2>               // posun koule ve scéně
}

// druhá otexturovaná koule
sphere
{
    <0,-1,0>, 1                          // pozice středu a poloměr
    texture
    {                                    // textura, kterou je objekt pokrytý
        Sapphire_Agate
    }
    translate <5.5, 0, 6>                // posun koule ve scéně
}

// třetí otexturovaná koule
sphere
{
    <0,-1,0>, 1                          // pozice středu a poloměr
    texture
    {                                    // textura, kterou je objekt pokrytý
        Sapphire_Agate
    }
    translate <-2, 0, -2>                // posun koule ve scéně
}

// čtvrtá otexturovaná koule
sphere
{
    <0,-1,0>, 1                          // pozice středu a poloměr
    texture
    {                                    // textura, kterou je objekt pokrytý
        Sapphire_Agate
    }
    translate <-2.5, 0, 6>               // posun koule ve scéně
}

// kvádr, do kterého je celá scéna uzavřena
box
{
    <-16, -2,-16>,
    < 24, 20, 20>
    texture
    {
        pigment
        {                                // šachovnicová textura
            checker                      // vyvedená ve stupních šedi
            color rgb<0.1, 0.1, 0.1>
            color rgb<1.0, 0.6, 0.6>
        }
        finish
        {                                // odlesky a odrazy na povrchu
            diffuse 0.7
            reflection 0.2
        }
    }
    interior                             // vlastnosti vnitřku kvádru
    {
        media
        {
            scattering                   // částice rozptylující světlo
            {
                4, rgb <0.4,0.4,0.4>
            }
            intervals 2                  // parametry pro algoritmus Monte Carlo
            samples 5
            method 3
            density
            {                            // změna hustoty částic
                boxed                    // použitá mapovací funkce
                turbulence 1             // přidaná náhodnost - změna polohy bodů
                scale <7,7,7>
            }
        }
    }
    hollow                               // aby výpočet mlhy probíhal korektně, je důležité
}                                        // kameru neumisťovat do uzavřených vyplněných těles

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray3109

Obrázek 9: Čtvrtý demonstrační příklad po vykreslení v POV-Rayi.

7. Rozptyl světelných paprsků při jejich průchodu volným prostorem

Částice, které absorbují, emitují či rozptylují světlo, nemusí být přítomny pouze uvnitř uzavřených těles, ale je možné je použít i jako výplň celého okolního prostoru. Většinou se pro tento účel používají částice, které světelné paprsky nepatrně rozptylují, neboť se tímto způsobem dají zviditelnit například reflektorové zdroje světelného záření. Tento efekt je zobrazen na desátém obrázku, na kterém je zobrazena trojrozměrná scéna s dvojicí objektů – koulí a podlahou tvořenou plochou. Koule je osvětlena třemi reflektorovými světelnými zdroji světla, přičemž světelné kužely všech tří zdrojů jsou díky přítomnosti rozptylujících částic viditelné.

povray3110

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

8. Pátý demonstrační příklad – rozptyl světelných paprsků tří reflektorových zdrojů světla

Rozptyl světelných paprsků ve scéně osvětlené třemi reflektorovými zdroji světla je demonstrován na dnešním posledním příkladu. V něm je uzel media zapsán na nejvyšší úrovni, nikoli jako poduzel nějakého objektu. Výsledkem je, že částice jsou rozloženy po celém volném prostoru. Míra rozptýlení světelných paprsků je řízena nám již známou interní proměnnou clock, lze ji tedy nastavovat při volání raytraceru nebo vytvořit jednoduchou animaci, při které vzduch ve vykreslované scéně postupně „houstne“. Zdrojový kód pátého příkladu má následující obsah:

// ------------------------------------------------------------
// Pátý demonstrační příklad na použití světelných efektů
// v prostorových scénách vykreslovaných POV-Rayem.
//
// Tuto scénu osvětlují tři reflektorová světla. Jejich
// paprsky jsou ve vzduchu částečně rozptylovány.
//
// rendering lze spustit příkazem:
//     povray +W800 +H600 +B100 +FN +D +Iscena5.pov +Oscena5.png
// (pro náhled postačí zadat povray scena5.pov)
// ------------------------------------------------------------

#include "colors.inc"
#include "textures.inc"

// nastavení kamery
camera
{
    location  <-4, 3, -9>                // pozice kamery
    look_at   <0, 0, 0>                  // bod, na který se kamera dívá
    angle 48                             // zorný úhel
}

media
{
    scattering
    {                                    // úroveň rozptylu světelných paprsků
        1, rgb clock/10.0
    }
    intervals 1                          // specifikace parametrů
    samples 5                            // pro metodu Monte Carlo
    method 3
}

// tři reflektorová světla

light_source
{
    <-10, 10, -3>                        // pozice světelného zdroje
    color      Blue
    spotlight
    radius     10
    falloff    15
    tightness  0
    point_at   <0, 0, 3>
}

light_source
{
    <10, 10, -5>                         // pozice světelného zdroje
    color      Red
    spotlight
    radius     10
    falloff    15
    tightness  0
    point_at   <5, 0, 0>
}
light_source
{
    <0, 10, -5>                          // pozice světelného zdroje
    color      White
    spotlight
    radius     10
    falloff    15
    tightness  0
    point_at   <-1, 0, -2>
}

// objekt vytvořený z písmen, jejichž tvary jsou přečteny z externího souboru s fontem
text
{
    ttf                                  // formát s uloženým fontem
    "crystal.ttf",                       // soubor s fontem dodávaný současně s POV-Rayem
    "root.cz",                           // text, který se má vytvořit
    0.5,                                 // hloubka textového objektu
    0                                    // mezera mezi znaky
    texture
    {                                    // textura, kterou je objekt pokrytý
        pigment
        {
            color White
        }
        finish
        {
            phong 1                      // odlesky na povrchu
            phong_size 100
        }
    }
    scale 2.5                            // změna měřítka textového objektu
    translate <-4, 0, -1>                // posun textového objektu
}

// otexturovaná koule
sphere
{
    <0,-1,0>, 1                          // pozice středu a poloměr
    texture
    {                                    // textura, kterou je objekt pokrytý
        pigment
        {
            color White
        }
        finish
        {
            phong 1                      // odlesky na povrchu
            phong_size 100
        }
    }
    translate <1.5, 0, -2>               // posun koule ve scéně
}

// kvádr, do kterého je celá scéna uzavřena
box
{
    <-16,-2,-16>, <22, 22, 5>
    texture
    {
        pigment
        {                                // šachovnicová textura
            checker                      // vyvedená ve stupních šedi
            color rgb<0.1, 0.1, 0.1>
            color rgb<0.5, 0.5, 0.5>
        }
        finish
        {                                // odlesky a odrazy na povrchu
            diffuse 0.7
            reflection 0.2
        }
    }
    hollow                               // aby výpočet rozptylu probíhal korektně, je důležité
}                                        // kameru neumisťovat do uzavřených vyplněných těles

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray3111

Obrázek 11: Pátý demonstrační příklad, míra rozptylu paprsků je nastavena na hodnotu 0

povray3112

Obrázek 12: Pátý demonstrační příklad, míra rozptylu paprsků je postupně zvyšována

povray3113

Obrázek 13: Pátý demonstrační příklad, míra rozptylu paprsků je postupně zvyšována

povray3114

Obrázek 14: Pátý demonstrační příklad, míra rozptylu paprsků je postupně zvyšována

povray3115

Obrázek 15: Pátý demonstrační příklad, míra rozptylu paprsků je postupně zvyšována

CS24_early

9. Obsah dalšího pokračování seriálu

V následující části seriálu o raytraceru POV-Ray si řekneme, jakým způsobem je možné vykreslovat prostorová objemová data. POV-Ray totiž umožňuje načíst obsah souboru obsahujícího informace o průhlednosti objemových elementů (voxelů) uložených v pravidelné rastrové mřížce a následně tato objemová data přidat do vytvářené scény. Tímto poněkud nekonvenčním způsobem, kterým disponuje relativně malé množství aplikací, je možné v jedné scéně zkombinovat různé typy prostorových dat, které jsou uloženy s využitím hraniční reprezentace (tvar tělesa je popsán svým povrchem), objemové reprezentace (těleso je popsáno svým objemem, tj. výčtem těch částí prostoru, které tvoří hmotu (vnitřek) tělesa) i reprezentace procedurální (těleso není přímo zadáno geometrickými daty, jako v předchozích dvou reprezentacích, ale algoritmem, který umožní vypočítat povrch tělesa či objem tělesa). POV-Ray byl kvůli své schopnosti zobrazovat objemové mřížky využit v několika vědeckých projektech, kde sloužil jako front-end pro vizualizaci naměřených i vypočtených trojrozměrných dat.

povray3116

Obrázek 16: Vizualizace dat uložených v prostorové objemové mřížce

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.