Hlavní navigace

Tvorba atmosférických jevů v POV-Rayi

23. 12. 2008
Doba čtení: 12 minut

Sdílet

V dnešní části seriálu o raytraceru POV-Ray si ukážeme dva demonstrační příklady, v nichž bude použita interference světla, kterou jsme si minule popsali teoreticky. Také si řekneme, jakým způsobem je možné ve scénách vytvářet oblaka a některé další zajímavé atmosférické efekty, například červánky.

Obsah

1. Změna parametrů interference světla v POV-Rayi
2. První demonstrační příklad – změna parametrů interference
3. Druhý demonstrační příklad – modifikace základní vlnové délky
4. Tvorba atmosférických jevů v POV-Rayi
5. Objekt typu sky_sphere
6. Třetí demonstrační příklad – jednoduchá obloha s mračny

1. Změna parametrů interference světla v POV-Rayi

V předchozí části tohoto seriálu jsme si řekli, že raytracer POV-Ray dokáže simulovat interferenci světla, která vzniká tehdy, pokud přímé či odražené světlo dopadá na povrch těles pokrytých velmi tenkou vrstvou nějakého poloprůhledného materiálu (tuto vrstvu budeme v dalším textu nazývat film). V případě, že je tloušťka této vrstvy srovnatelná s vlnovou délkou dopadajícího světla (přesněji – jedné konkrétní frekvence), dochází k částečnému odrazu od horní vrstvy filmu i od jeho vrstvy spodní. Film tedy musí být velmi tenký, čím tenčí je, tím složitější duhové obrazce se budou tvořit, protože jeho tloušťka nemůže být zcela konstantní a i malé změny se při interferenci výrazně projeví. Konkrétní poměr odraženého světla závisí na indexech lomu všech tří materiálů – okolního vzduchu, tenké vrstvičky filmu i podkladového materiálu, stejně jako na míře průhlednosti filmu. Vlivem interference mezi oběma skupinami světelných paprsků vznikají duhové obrazce, jejichž barva i tvar se mění v závislosti na úhlu pozorování tohoto jevu.

povray4101

Obrázek 1: Tento obrázek nesouvisí s dnes probíraným tématem, ale spíše s dobou publikace článku. Všimněte si především techniky vymodelování řetězu, z hlediska raytraceru se jedná o velmi složitý objekt.

Interferenci lze specifikovat v uzlu nazvaném irid. Základním parametrem, který ovlivňuje barvu i tvar duhových obrazců, je tloušťka poloprůhledné vrstvy (filmu) představovaná atributem thickness (jedná se bezrozměrnou hodnotu). V reálném světě nemívá film konstantní tloušťku (právě proto se ostatně tvoří duhové obrazce), což je fenomén, který je možné alespoň přibližně simulovat aplikací šumové funkce (atribut turbulence). Třetím parametrem je míra propustnosti (průhlednosti) filmu, protože k viditelné interferenci dochází pouze v případě, že film světlo částečně odrazí a částečně dojde k jeho lomu (nepojmenovaný atribut uvedený povinně na prvním místě v uzlu irid). Pokud by byl samotný film do značné míry neprůhledný, nebyly by jím procházející (a zpět odražené) paprsky dostatečně intenzivní na to, aby byla interference viditelná. Posledním parametrem (v tomto případě globálním) je barva světla, pro kterou se interference počítá (globální atribut irid_wavelength). POV-Ray totiž kvůli použití barvového RGB modelu při interních výpočtech nedokáže simulovat interferenci v celém barvovém spektru, ale pouze pro jedinou barvu. Praktické použití této technologie si ukážeme v následujících dvou demonstračních příkladech.

povray4102

Obrázek 2: První demonstrační příklad upravený tak, že k interferenci světla dochází především v oblasti zelené barvy světelného spektra.

2. První demonstrační příklad – změna parametrů interference

V prvním demonstračním příkladu je ukázáno použití interference světla a nastavení základních parametrů, které POV-Ray využívá při simulaci skutečné interference. Ve vytvořené scéně se nachází devět objektů bílé barvy, které jsou pokryté tenkým poloprůhledným filmem. V horní řadě se mění míra interference od 25% až do 75%. Můžeme vidět, že čím je míra interference numericky větší, tím jasnější jsou duhové obrazce. V prostřední řadě se mění základní tloušťka filmu, což má nemalý vliv na velikost duhových skvrn. V poslední řadě dochází ke změně parametru turbulence, který ovlivňuje tloušťku poloprůhledného filmu a tím i (i když nepřímo) náhodnost tvaru skvrn. Ze třetího obrázku, na kterém je zobrazen první demonstrační příklad vykreslený POV-Rayem, je patrné, že všechny tři parametry interference komplexně mění barvu, tvar i velikost duhových obrazců. I z tohoto důvodu se mnohdy v praxi musí provést mnoho experimentů s různě nastavenými parametry, než se dosáhne požadovaných výsledků.

povray4103

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

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

// ------------------------------------------------------------
// První demonstrační příklad - ukázka použití uzlu "irid"
// a některých atributů ovlivňujících interferenci světla na
// tenkém filmu, kterým jsou pokryté všechny objekty ve scéně.
//
// Založeno na příkladu dodávaného společně s POV-Rayem verze 3.x
//
// rendering lze spustit příkazem:
//     povray +W1024 +H768 +B100 +FN +D +Ipriklad1.pov +Opriklad1.png
//
// ------------------------------------------------------------

#version 3.0                   // nutné, protože syntaxe uzlu irid se
                               // může v budoucnu změnit

global_settings                // globální nastavení parametrů scény
{
    assumed_gamma 2.2
}

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

camera                         // nastavení kamery
{
    location <0, 0, -10>       // pozice kamery
    up y                       // vektor směřující vzhůru (implicitní hodnota)
    right x*1.3333             // vektor směřující doprava
    direction z*3              // směr pohledu kamery (k počátku souřadné soustavy)
    look_at 0
}

light_source                   // světelný zdroj
{
    < 150, 150, -2500>         // pozice světelného zdroje
    color Gray90               // barva světelného zdroje
}

union                          // horní řada objektů
{                              // mění se míra interference od 25% do 75%
    sphere
    {
        <-1, 0, 0>, 0.45
        pigment
        {
            White              // bílá barva povrchu testovacího objektu
        }
        finish
        {
            Shiny
            diffuse 0.2
            irid
            {
                0.25           // míra interference
                thickness 2/4  // tloušťka filmu
                turbulence 0.75// proměnlivost tloušťky filmu
            }
        }
    }
    sphere
    {
        < 0, 0, 0>, 0.45
        pigment
        {
            White              // bílá barva povrchu testovacího objektu
        }
        finish
        {
            Shiny
            diffuse 0.2
            irid
            {
                0.5            // míra interference
                thickness 2/4  // tloušťka filmu
                turbulence 0.75// proměnlivost tloušťky filmu
            }
        }
    }
    sphere
    {
        < 1, 0, 0>, 0.45
        pigment
        {
            White              // bílá barva povrchu testovacího objektu
        }
        finish
        {
            Shiny
            diffuse 0.2
            irid
            {
                0.75           // míra interference
                thickness 2/4  // tloušťka filmu
                turbulence 0.75// proměnlivost tloušťky filmu
            }
        }
    }
    translate y*1
}

union                          // prostřední řada objektů
{                              // mění se tloušťka filmu od 1/2 do 8
    sphere
    {
        <-1, 0, 0>, 0.45
        pigment
        {
            White              // bílá barva povrchu testovacího objektu
        }
        finish
        {
            Shiny
            diffuse 0.2
            irid
            {
                0.5            // míra interference
                thickness 1/2  // tloušťka filmu
                turbulence 0.5 // proměnlivost tloušťky filmu
            }
        }
    }
    sphere
    {
        < 0, 0, 0>, 0.45
        pigment
        {
            White              // bílá barva povrchu testovacího objektu
        }
        finish
        {
            Shiny
            diffuse 0.2
            irid
            {
                0.5            // míra interference
                thickness 2/1  // tloušťka filmu
                turbulence 0.5 // proměnlivost tloušťky filmu
            }
        }
    }
    sphere
    {
        < 1, 0, 0>, 0.45
        pigment
        {
            White              // bílá barva povrchu testovacího objektu
        }
        finish
        {
            Shiny
            diffuse 0.2
            irid
            {
                0.5            // míra interference
                thickness 8/1  // tloušťka filmu
                turbulence 0.5 // proměnlivost tloušťky filmu
            }
        }
    }
}

union                          // spodní řada objektů
{                              // mění se velikost turbulence (proměnlivosti barev)
    sphere
    {
        <-1, 0, 0>, 0.45
        pigment
        {
            White              // bílá barva povrchu testovacího objektu
        }
        finish
        {
            Shiny
            diffuse 0.2
            irid
            {
                0.5            // míra interference
                thickness 2/1  // tloušťka filmu
                turbulence 0.1 // proměnlivost tloušťky filmu
            }
        }
    }
    sphere
    {
        < 0, 0, 0>, 0.45
        pigment
        {
            White              // bílá barva povrchu testovacího objektu
        }
        finish
        {
            Shiny
            diffuse 0.2
            irid
            {
                0.5            // míra interference
                thickness 2/1  // tloušťka filmu
                turbulence 1   // proměnlivost tloušťky filmu
            }
        }
    }
    sphere
    {
        < 1, 0, 0>, 0.45
        pigment
        {
            White              // bílá barva povrchu testovacího objektu
        }
        finish
        {
            Shiny
            diffuse 0.2
            irid
            {
                0.5            // míra interference
                thickness 2/1  // tloušťka filmu
                turbulence 2   // proměnlivost tloušťky filmu
            }
        }
    }
    translate -y*1
}

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray4104

Obrázek 4: Změna frekvence světla, pro níž dochází k interferenci, má velký vliv na tvar i barvu duhových obrazců.

3. Druhý demonstrační příklad – modifikace základní vlnové délky

V dnešním druhém demonstračním příkladu si ukážeme, jakým způsobem lze modifikovat základní vlnovou délku světla (barvu), pro niž POV-Ray interferenci počítá. Zajímavé je, že se jedná o globální atribut celé scény, tj. jeho změna se projeví na všech tělesech, u kterých je interference nastavena (uzlem irid). Vlastní nastavení vlnové délky je uloženo v uzlu global_settings, ostatně jako všechna další globální nastavení vykreslované scény. Za názvem atributu irid_wavelength musí následovat specifikace barvy určující vlnovou délku. Na tomto místě si musíme uvědomit, že veškeré výpočty v POV-Rayi probíhají nad barvovým modelem RGB, který skutečnou podstatu světla modeluje jen přibližně a v některých případech i chybně – to je i případ interference světla. Teoreticky by totiž bylo nutné interferenci počítat pro celé (viditelné) barvové spektrum, které sice není spojité, ale počet vlnových délek přesahuje výpočetní možnosti běžného počítače. Interferenci světla simulovanou POV-Rayem je tedy zapotřebí chápat jako určitý kompromis mezi požadavky na vizuální dojem z výsledné scény a reálnými výpočetními možnostmi.

povray4105

Obrázek 5: Screenshot druhého demonstračního příkladu.

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

// ------------------------------------------------------------
// Druhý demonstrační příklad - ukázka použití uzlu "irid"
// a také nastavení globálního parametru určujícího vlnovou
// délku světla, pro kterou se interference světla počítá.
//
// Založeno na příkladu dodávaného společně s POV-Rayem verze 3.x
//
// rendering lze spustit příkazem:
//     povray +W1024 +H768 +B100 +FN +D +Ipriklad2.pov +Opriklad2.png
//
// ------------------------------------------------------------

#version 3.0                   // nutné, protože syntaxe uzlu irid se
                               // může v budoucnu změnit
global_settings                // globální nastavení parametrů scény
{
    assumed_gamma 2.2
    // pomocí komentářů je zde možné konfigurovat vlnovou délku
    irid_wavelength rgb <.25, .18, .14>
//    irid_wavelength rgb <.70, .52, .48>
//    irid_wavelength rgb <.10, .20, .40>
}

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

camera                         // nastavení kamery
{
    location <0, 1.5, -3>      // pozice kamery
    up y                       // vektor směřující vzhůru (implicitní hodnota)
    direction z*1.5            // směr pohledu kamery
    right x*1.3333             // vektor směřující doprava
    look_at <0, 0, 0>
}

light_source                   // světelný zdroj
{
    < 15, 15, -25>             // pozice světelného zdroje
    color Gray90               // barva světelného zdroje
}

plane                          // podkladová rovina
{
    y, 0
    pigment                    // barva povrchu
    {
        Gray45
    }
    finish
    {
        ambient 0.2
        diffuse 0.2
        irid                   // nastavení interference světla
        {
            0.5                // míra interference
            thickness 1.2      // tloušťka filmu
            turbulence 1       // změna tloušťky filmu
        }
    }
}

sphere                         // první těleso
{
    <0,0, 0>, 0.45
    pigment                    // barva povrchu
    {
        Gray45
    }
    finish
    {
        Shiny
        diffuse 0.2
        irid                   // nastavení interference světla
        {
            0.25               // míra interference
            thickness 1        // tloušťka filmu
            turbulence 0.75    // proměnlivost tloušťky filmu
        }
    }
    translate <-1, 0.45, 0>
}

sphere                         // druhé těleso
{
    <0,0, 0>, 0.45
    pigment                    // barva povrchu
    {
        Gray45
    }
    finish
    {
        Shiny
        diffuse 0.2
        irid                   // nastavení interference světla
        {
            0.50               // míra interference
            thickness 1        // tloušťka filmu
            turbulence 0.75    // proměnlivost tloušťky filmu
        }
    }
    translate <0, 0.45, 0>
}

sphere                         // třetí těleso
{
    <0,0, 0>, 0.45
    pigment                    // barva povrchu
    {
        Gray45
    }
    finish {
        Shiny
        diffuse 0.2
        irid                   // nastavení interference světla
        {
            0.75               // míra interference
            thickness 1        // tloušťka filmu
            turbulence 0.75    // proměnlivost tloušťky filmu
        }
    }
    translate <1, 0.45, 0>
}

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray4106

Obrázek 6: Změna základní vlnové délky při výpočtu interference světla.

povray4107

Obrázek 7: Odlišná vlnová délka použitá při výpočtu interference světla.

4. Tvorba atmosférických jevů v POV-Rayi

V předchozích částech tohoto seriálu jsme si popsali již velké množství způsobů, kterými lze ovlivnit způsob vykreslení jak jednotlivých geometrických objektů, tak i celé scény. Prozatím jsme si však nevysvětlili jednu velmi zajímavou (a přitom poměrně snadno použitelnou) techniku určenou pro vykreslení oblohy, včetně mnoha atmosférických jevů, které můžeme na obloze vidět. V nejjednodušších scénách si můžeme vystačit s jednobarevným pozadím. To je možné nastavit, jak jsme si již ostatně ukázali v předchozích částech tohoto seriálu, globálním atributem background, popř. lze scénu uzavřít do jednobarevné koule či krychle (mělo by se však zakázat vrhání stínů na tato globální obalová tělesa). Ovšem ve chvíli, kdy se má zobrazit exteriér ve fotorealistické kvalitě, je již zapotřebí vynaložit jisté úsilí na správné vykreslení oblohy. Základními objekty, které nám mohou pomoci, jsou objekty typu sky_sphere a v menší míře rainbow. V následující kapitole se seznámíme s možnostmi objektu sky_sphere.

povray4108

Obrázek 8: Obloha je v této scéně vytvořena gradientním přechodem mezi dvěma barvami a poloprůhlednou texturou mraků.

5. Objekt typu sky_sphere

Objekt nazvaný sky_sphere je možné použít pro snadné pro vytvoření oblohy. Princip je z uživatelského hlediska velmi jednoduchý – celá scéna je uzavřena do virtuální koule, jejíž střed leží v místě pozorovatele. Ve skutečnosti však sky_sphere není skutečnou koulí s nějakým povrchem, tudíž pro ni není možné specifikovat všechny vlastnosti povrchu – velikost odlesků, průhlednost, vlastnosti objemu tělesa (částice vyzařující, pohlcující či rozptylující světlo) atd. Jedinou vlastnost, kterou je možné měnit, je barvový vzorek (pigment). Při specifikaci pigmentu (většinou se používá nějaká forma procedurální textury) je nutné mít na paměti, že objekt sky_sphere se při výpočtu souřadnic (mapování souřadnic z prostoru modelu do prostoru textury) chápe jako koule o poloměru jedné délkové jednotky, i když při vykreslování je její poloměr zdánlivě nekonečný. Toto je jeden z největších rozdílů mezi sky_sphere a ručně vytvořenou „obalovou“ koulí, u které má poloměr velký význam – mnohdy se totiž může stát, že některý ze světelných zdrojů (či dokonce pozorovatel) se nachází mimo „obalovou“ kouli, což samozřejmě způsobí nekorektní vykreslení celé scény. U objektu sky_sphere k tomuto chování nikdy nemůže dojít.

povray4109

Obrázek 9: Screenshot třetího demonstračního příkladu

Při použití objektu typu sky_sphere je možné specifikovat libovolné množství barev nebo pigmentů, které se vybírají podobně jako u barvové mapy. Na základě úhlu mezi horizontem a bodem v nadhlavníku je vypočtena hodnota ležící v rozsahu 0 až 1. Tato hodnota je použita pro přístup do tabulky pigmentů, která může vypadat například následovně:

pigment_map            // definice mapy jednotlivých vzorků
{                      // vybíraných na základě hodnoty
                       // interní proměnné
    [0.00 rgb <0.6, 0.7, 0.847>/2 ] // horizont
    [0.15 P_Cloud4 ]                // nad horizontem v relativně malé výšce začínají mraky
    [0.90 rgb <0, 0, 0> ]     // obloha v nadhlavníku má konstantní černou barvu
} 

Z výše uvedeného fragmentu kódu je patrné, že se nemusí použít pouze konstantní barvy, ale i složitější pigmenty (P_Cloud4).

povray4110

Obrázek 10: Třetí demonstrační příklad – pro sky_sphere je použit objekt S_Cloud1

6. Třetí demonstrační příklad – jednoduchá obloha s mračny

Ve třetím demonstračním příkladu je ukázán způsob použití objektu typu sky_sphere pro tvorbu základních optických jevů viditelných v atmosféře. V případě, že je ve scéně pro sky_sphere použit objekt pojmenovaný S_Cloud0, uzavře se celá viditelná část scény do polokoule, na níž je nanesena textura (přesněji řečeno jen pigment textury), jejíž barva i samotný vzorek se mění spolu se vzrůstajícím úhlem (měřeným vůči vodní hladině).

povray4111

Obrázek 11: Třetí demonstrační příklad – pro sky_sphere je použit objekt S_Cloud2

Blízko horizontu, kde se obloha stýká s mořskou hladinou, má textura oblohy podobu namodralého pásu, který postupně přechází v červenožlutou oblohu s mraky vytvořenými procedurální texturou wrinkles (šlo by však použít i texturu bozo nebo dokonce i marble). Celá obloha se odráží jak ve vodní hladině, tak i ve dvou obloucích, které mají stříbřitý (chromovaný) a tím pádem i vysoce odrazivý povrch.

povray4112

Obrázek 12: Třetí demonstrační příklad – pro sky_sphere je použit objekt S_Cloud3

Kromě objektu S_Cloud0 lze na řádku 71 specifikovat i objekty S_Cloud1S_Cloud5, které jsou definované ve vkládaném souboru skies.inc. Povšimněte si, jak velký vliv má barva oblohy na výsledný dojem z celé scény.

povray4113

Obrázek 13: Třetí demonstrační příklad – pro sky_sphere je použit objekt S_Cloud4

root_podpora

Zdrojový kód třetího demonstračního příkladu:

// ------------------------------------------------------------
// Třetí demonstrační příklad - použití objektu typu sky_sphere
// a využití textury mraků. Vodní hladina byla vytvořena
// pomocí procedurální textury typu "waves".
// Texturu oblohy lze změnit na řádku 71.
//
// Vykresleno s volbami -w1024 -h768 +a0.3
// ------------------------------------------------------------

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

#include "colors.inc"
#include "textures.inc"
#include "metals.inc"
#include "skies.inc"

camera                         // nastavení kamery
{
    location <60, 0, -135>     // pozice kamery
    direction <0.0, 0.0, 2.0>  // směr pohledu kamery
    up  <0.0, 1.0, 0.0>        // vektor směřující vzhůru (implicitní hodnota)
    right <4/3, 0.0, 0.0>      // vektor směřující doprava
    look_at <0.0, 0.0, 0.0>    // bod, na který se kamera dívá
}

light_source                   // světelný zdroj
{
    <200.0, 200.0, -150.0>     // pozice světelného zdroje
    color red 1 green 0.5      // barva světelného zdroje
}

#declare P_Cloud4 =
pigment                        // textura představující mraky
{
    wrinkles
    turbulence 0.1
    lambda 2.2
    omega 0.707
    color_map                  // barvová mapa mraků
    {
        [0.20 Red * 0.85 ]
        [0.50 Yellow ]
        [1.00 Yellow ]
    }
    scale <0.5, 0.15, 1>
}

#declare S_Cloud0 =
sky_sphere                     // objekt typu sky_sphere
{                              // do kterého je scéna uzavřena
    pigment
    {
        gradient y             // směr změny interní proměnné
                               // použité pro výběr z pigmentové mapy
        pigment_map            // definice mapy jednotlivých vzorků
        {                      // vybíraných na základě hodnoty
                               // interní proměnné
            [0.00 rgb <0.6, 0.7, 0.847>/2 ] // horizont
            [0.15 P_Cloud4 ]                // obloha v nadhlavníku
        }
    }
}

sky_sphere                     // použití objektu typu sky_sphere
{
    S_Cloud0                   // lze měnit mezi S_Cloud0 až S_Cloud5
}

plane                          // hladina oceánu
{
    y, -10.0
    texture
    {
        T_Chrome_2D
        normal
        {                      // bump mapa pro hladinu
            waves 0.05         // - zdánlivé zvlnění hladiny
            frequency 5000.0
            scale 3000.0
        }
    }
}

// Paraboloid vytvořený na základě implicitní rovnice:
// x^2 + z^2 - y = 0
#declare Paraboloid_Y =
quadric
{
    <1,  0,  1>,               // deset parametrů kvadriky
    <0,  0,  0>,
    <0, -1,  0>, 0
}

// každý oblouk je vymodelován pomocí CSG operace rozdílu mezi
// dvojicí paraboloidů
difference                     // první oblouk
{
    object
    {
        Paraboloid_Y
        scale <20.0, 20.0, 5.0>
        rotate 180*x
        texture
        {
            T_Chrome_3C
        }
    }
    object
    {
        Paraboloid_Y
        scale <18.0, 20.0, 18.0>
        rotate 180*x
        translate -2*y
        texture
        {
            T_Copper_3C
        }
    }
    translate <0.0, 30.0, -25.0>
}

difference                     // druhý oblouk
{
    object
    {
        Paraboloid_Y
        scale <20.0, 20.0, 5.0>
        rotate 180*x
        texture
        {
            T_Chrome_3C
        }
    }
    object
    {
        Paraboloid_Y
        scale <18.0, 20.0, 18.0>
        rotate 180*x
        translate -2*y
        texture
        {
            T_Copper_3C
        }
    }
    translate <0.0, 30.0, 50.0>
}

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray4114

Obrázek 14: Třetí demonstrační příklad – pro sky_sphere je použit objekt S_Cloud5

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.