Hlavní navigace

Osvětlovací model v POV-Rayi

27. 5. 2008
Doba čtení: 12 minut

Sdílet

V dnešní části seriálu o renderovacím programu POV-Ray si popíšeme tvorbu trojrozměrného objektu složeného ze znaků načtených z externího souboru s fontem a také si ukážeme, jakým způsobem lze použít jednotlivé typy podporovaných světelných zdrojů - všesměrového, bodového a reflektorového světla.

Obsah

1. Osvětlovací model v POV-Rayi
2. Objekt složený ze znaků
3. Všesměrové světlo
4. Bodové zdroje osvětlení
5. Více bodových světelných zdrojů použitých současně
6. Reflektorové světlo
7. Obsah následující části seriálu

1. Osvětlovací model v POV-Rayi

You know you have been raytracing too long when …
… You take a photo course just to learn how to get the lighting right.
 – Christoph Rieder

Jednou z nejdůležitějších činností, které je nutné provést při vytváření a následném vykreslování trojrozměrných scén, je rozmístění vhodných světelných zdrojů do prostoru scény. Pokud jsou světelné zdroje umístěny na špatných místech nebo jsou některé jejich vlastnosti nastaveny chybně, pokazí se divákův dojem z celého obrázku. Naopak je možné i z poměrně chudé scény obsahující malé množství i zcela jednoduchých trojrozměrných objektů vytvořit zajímavý obrázek pouze vhodnou volbou osvětlení, což je patrné i z následujících dvou screenshotů vykreslených právě pomocí POV-Raye. V prvním případě tvoří světlo a efekty pomocí něj vytvořené ústřední motiv obrázku, ve druhém případě by scéna byla bez plynové lampy „plochá“, model stromu i sloupků by proti tmavé stěně domu opticky zanikl a výsledkem by byl nevýrazný obrázek, i když objekty v něm mají docela složitý tvar (strom je vytvořen procedurálně, ale o tom si povíme až v dalších částech seriálu).

povray1301

Obrázek 1: Ústřední motiv tohoto obrázku s relativně chudě vybavenou místností tvoří světelné efekty

Vhodné nastavení světelných zdrojů vyžaduje především trpělivost (většinou se musí provést velké množství pokusů) a také trošku zkušeností. Ukazuje se, že v tomto případě modelovací programy příliš nepomohou, na rozdíl od vytváření geometrie scény, kdy může být vizuální zpětná vazba vítaná. Naopak bývá vhodné si celý model například v půdorysu rozkreslit na čtverečkovaný papír a přitom dát prostor i světelným zdrojům, aby se objekty navzájem neskrývaly ve stínech. V následujících kapitolách (kromě kapitoly druhé, ve které trošku tématicky odbočíme) se budeme věnovat použití jednotlivých typů světelných zdrojů, které lze v POV-Rayi použít.

povray1302

Obrázek 2: Lampa představující zviditelněný světelný zdroj dodává scéně potřebnou hloubku

2. Objekt složený ze znaků

Před popisem jednotlivých typů světelných zdrojů si ukážeme použití jednoho poměrně užitečného typu objektu, který bude použitý i v demonstračních příkladech. Jedná se o trojrozměrný objekt složený ze znaků (zapsaných pomocí řetězce). Tvar jednotlivých znaků je přečten z externího souboru typu TrueType (soubory tohoto typu mají koncovku .ttf). Interně se v těchto souborech jednotlivé znaky popisují pomocí svého obrysu, který je složen z úseček a Bézierových kvadratických křivek (ty mohou být rastrovány velmi rychle a přesně). Interní mechanismy vykreslování fontů nás však nemusí při použití POV-Raye zajímat, protože se o korektní vytvoření trojrozměrných objektů ze znaků postará sám. Jediné co musíme doplnit, je „hloubka“ znaků, tj. jejich třetí rozměr a popř. mezera mezi jednotlivými znaky (specifikuje se pomocí vektoru nebo skalární hodnoty). Optické vlastnosti povrchu i jeho barva a textura se u tohoto typu objektu nastavuje zcela stejným způsobem, jako u všech objektů popsaných v předchozích částech tohoto seriálu. Syntaxe zápisu vypadá následovně:

// 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ý
        PinkAlabaster
        scale 0.5
    }
    scale 2.5                    // změna měřítka textového objektu
    translate <-4, 0, -1>        // posun textového objektu
} 

Následuje demonstrační příklad, který bude s drobnými úpravami použit i v navazujících kapitolách při popisu jednotlivých typů světelných zdrojů.

// ------------------------------------------------------------
// První demonstrační příklad na použití světelných zdrojů
// v prostorových scénách vykreslovaných POV-Rayem.
//
// Základ pro tvorbu dalších scén.
//
// rendering lze spustit příkazem:
//     povray +W800 +H600 +B100 +FN +D +Iscena.pov +Oscena.png
// (pro náhled postačí zadat příkaz povray scena.pov)
// ------------------------------------------------------------

#include "colors.inc"
#include "glass.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
}



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



// 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ý
        PinkAlabaster
        scale 0.5
    }
    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 - povrch koule
        T_Glass1                         // definováno v externím souboru
        pigment {
            color red 1.00 filter 0.95   // barva povrchu
        }
        finish {                         // optické vlastnosti materiálu
            phong 1                      // velikost a síla odlesků
            phong_size 300
            reflection 0.15              // odrazivost
        }
    }
    translate <1.5, 0, -2>               // posun koule ve scéně
}



// kvádr, do kterého je celá scéna uzavřena
box {
    <-12,-2,-12>, <20, 20, 8>
    texture {
        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>
        }
        finish {                         // odlesky a odrazy na povrchu
            diffuse 0.7
            reflection 0.2
        }
    }
}



// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1303

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

3. Všesměrové světlo

Nyní si již pojďme popsat jednotlivé typy světelných zdrojů, které je možné v POV-Rayi použít. Vzhledem k nedokonalosti osvětlovacího modelu použitého v POV-Rayi je nutné nějakým způsobem simulovat světlo, které ve scéně vzniká několikerým odrazem od povrchů všech objektů. Tento problém není možné uspokojivě pomocí raytracingu vyřešit, proto se do osvětlovacího modelu poněkud uměle (zato však velmi prakticky) zavádí všesměrové (ambientní) světlo, tj. světlo, které do scény jakoby přichází ze všech směrů a má konstantní intenzitu. Jedná se o globální vlastnost celé scény zapisovaná do sekce global_settings. Právě toto světlo je použito ve druhém demonstračním příkladu, na kterém je také patrné, že se zcela ztratily veškeré stíny (to, co je vidět pod koulí, je její odraz, nikoli stín) a scéna také vypadá velmi ploše – ztratil se dojem prostorovosti. Z tohoto důvodu se všesměrové světlo používá v kombinaci s některým dalším typem světelného zdroje. Druhý demonstrační příklad má tvar:

// ------------------------------------------------------------
// Druhý demonstrační příklad na použití světelných zdrojů
// v prostorových scénách vykreslovaných POV-Rayem.
//
// Použití ambientního světla
//
// rendering lze spustit příkazem:
//     povray +W800 +H600 +B100 +FN +D +Iscena.pov +Oscena.png
// (pro náhled postačí zadat povray scena.pov)
// ------------------------------------------------------------

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

global_settings {
    ambient_light White*7                // všesměrová složka světla (jak je patrné, lze použít i větší hodnoty než 1)
}



// 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
}



// 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
}



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



// kvádr, do kterého je celá scéna uzavřena
box {
    <-12,-2,-12>, <20, 20, 8>
    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
        }
    }
}



// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1304

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

4. Bodové zdroje osvětlení

Nejvíce používaný typ světelného zdroje v raytracingu je pravděpodobně bodový světelný zdroj. Ten si můžeme představit jako svítící bod umístěný v prostoru, který vyzařuje světlo do všech stran s konstantní intenzitou nezávislou na směru vysílání světelných paprsků. Tento typ světla má přednost v tom, že se jednoduše nastavuje (postačuje zvolit jeho pozici v prostoru a barvu), výpočty s ním jsou rychlé a přitom se s jeho pomocí dá docílit velkého množství světelných efektů. Bodový světelný zdroj může být do scény přidán pomocí uzlu light_source, ve kterém se specifikuje pouze pozice zdroje (vektor) a jeho barva. V následujícím příkladu je použit jeden bodový světelný zdroj s bílou barvou. Povšimněte si ostrých stínů pod objekty:

// ------------------------------------------------------------
// Třetí demonstrační příklad na použití světelných zdrojů
// v prostorových scénách vykreslovaných POV-Rayem.
//
// Použití bodového světelného zdroje
//
// rendering lze spustit příkazem:
//     povray +W800 +H600 +B100 +FN +D +Iscena.pov +Oscena.png
// (pro náhled postačí zadat povray scena.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
}

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



// 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
}



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



// kvádr, do kterého je celá scéna uzavřena
box {
    <-12,-2,-12>, <20, 20, 8>
    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
        }
    }
}



// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1305

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

5. Více bodových světelných zdrojů použitých současně

V jedné scéně je samozřejmě možné použít i větší množství světelných zdrojů, z nichž každý může mít nastavenou odlišnou barvu vyzařovaného světla. To je ukázáno na čtvrtém příkladu, který je schválně „vyumělkovaný“, ale ukazuje, jak použít tři světelné zdroje, každý s odlišnou barvou:

// ------------------------------------------------------------
// Čtvrtý demonstrační příklad na použití světelných zdrojů
// v prostorových scénách vykreslovaných POV-Rayem.
//
// Tři bodové světelné zdroje, z nichž každý má jinou barvu
//
// rendering lze spustit příkazem:
//     povray +W800 +H600 +B100 +FN +D +Iscena.pov +Oscena.png
// (pro náhled postačí zadat povray scena.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
}

// první bodový světelný zdroj
light_source {
    <4, 10, -5>                          // pozice světelného zdroje
    color Red                            // barva světla
}

// druhý bodový světelný zdroj
light_source {
    <-4, 10, -5>                         // pozice světelného zdroje
    color Green                          // barva světla
}

// třetí bodový světelný zdroj
light_source {
    <4, 10, 5>                           // pozice světelného zdroje
    color Blue                           // barva světla
}



// 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
}



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



// kvádr, do kterého je celá scéna uzavřena
box {
    <-12,-2,-12>, <20, 20, 8>
    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
        }
    }
}



// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1306

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

6. Reflektorové světlo

Z popisovaných světelných zdrojů je výpočetně nejnáročnější reflektorový světelný zdroj. U tohoto zdroje je možné zadávat velké množství parametrů. Kromě již známých koeficientů, jakými jsou barva světla, se nastavují parametry vlastního světelného kužele. Mezi tyto parametry patří vrcholový úhel kužele, ve kterém má světlo nejvyšší (konstantní) intenzitu (světelný kužel, jedná se o parametr radius), vrcholový úhel většího kužele, kde intenzita směrem k jeho okraji postupně klesá (stínový kužel, parametr falloff), maximální dosvit a také míra poklesu intenzity světla mezi oběma kužely (tightness). Tento světelný zdroj je tedy jakousi kombinací bodového a směrového zdroje, ke kterým přidává další unikátní vlastnosti (atributy).

povray1307

Obrázek 7: Základní parametry reflektorového světelného zdroje

Pomocí reflektorového zdroje světla lze scénu upravit tak, aby působila „dramaticky“, což je v jednoduché podobě ukázáno na pátém demonstračním příkladu. V něm je použit jeden bílý reflektor, ovšem po odkomentování označeného kódu se zapnou dva slabší barevné reflektory, které celou scénu ozvláštní:

// ------------------------------------------------------------
// Pátý demonstrační příklad na použití světelných zdrojů
// v prostorových scénách vykreslovaných POV-Rayem.
//
// Reflektorový zdroj světla (lze povolit další dva reflektory)
//
// rendering lze spustit příkazem:
//     povray +W800 +H600 +B100 +FN +D +Iscena.pov +Oscena.png
// (pro náhled postačí zadat povray scena.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
}

// reflektorový světelný zdroj
light_source {
    <0, 10, -3>                          // umístění reflektoru v prostoru
    color White                          // barva světla
    spotlight                            // modifikátor - jedná se o reflektorové světlo
    radius 15                            // poloměr světelného kužele zadaný ve stupních
    falloff 20                           // poloměr stínového kužele
    tightness 10                         // míra poklesu intenzity osvětlení
    point_at <0, 0, 0>
}

/* !!! odkomentováním následující části lze povolit další dva světelné zdroje
// reflektorový světelný zdroj
light_source {
    <10, 10, -1>
    color Red
    spotlight
    radius 12
    falloff 14
    tightness 10
    point_at <2, 0, 0>
}

// reflektorový světelný zdroj
light_source {
    <-12, 10, -1>
    color Blue
    spotlight
    radius 12
    falloff 14
    tightness 10
    point_at <-2, 0, 0>
}
*/



// 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
}



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



// kvádr, do kterého je celá scéna uzavřena
box {
    <-12,-2,-12>, <20, 20, 8>
    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
        }
    }
}



// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1308

Obrázek 8: Pátý demonstrační příklad po vykreslení v POV-Rayi (povolen jeden reflektor)

povray1309

Obrázek 9: Pátý demonstrační příklad po vykreslení v POV-Rayi (povoleny tři reflektory)

CS24_early

7. Obsah následující části seriálu

V další části seriálu o raytraceru POV-Ray budou (kromě popisu zbývajících dvou typů světelných zdrojů) popsány způsoby zadávání optických vlastností materiálů, způsoby nanášení textur, modulace normálových vektorů v jednotlivých částech povrchů těles atd.

povray1310

Obrázek 9: V POV-Rayi je možné pomocí jednoduchého triku vytvořit i viditelný světelný zdroj

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.