Hlavní navigace

Výšková pole a specifikace osvětlení v POV-Rayi

20. 5. 2008
Doba čtení: 10 minut

Sdílet

Ve dvanácté části seriálu o renderovacím programu POV-Ray se budeme zabývat dvěma tématy. Tím prvním jsou takzvaná výšková pole, což je objekt POV-Raye, pomocí něhož se dá jednoduše vymodelovat například zemský povrch. Druhým tématem je osvětlení, které tvoří nedílnou součást všech vykreslovaných scén.

Obsah

1. Výšková pole (height fields)
2. První demonstrační příklad – výškové pole uložené v rastrovém obrázku
3. Druhý demonstrační příklad – vytvoření výškového pole přímo v POV-Rayi
4. Specifikace osvětlení a typy světelných zdrojů
5. Ambientní světlo
6. Bodové světlo
7. Plošné světlo
8. Reflektové světlo
9. Obsah následující části seriálu

1. Výšková pole (height fields)

Užitečným typem objektu, který je možné v POV-Rayi použít, jsou takzvaná výšková pole neboli height fields, jež se velmi často používají například pro modelování zemského povrchu (a samozřejmě povrchů jiných planet). Tyto objekty jsou poněkud zvláštní tím, že ve zdrojovém souboru jsou popsány pouze jejich základní geometrické a optické vlastnosti, zatímco samotný tvar výškového pole je odvozen od externího rastrového obrázku. Jak si vlastně máme výškové pole představit a jak vypadají po vykreslení v POV-Rayi?

povray1201

Výškové pole vytvořené původně v programu Fractint po renderingu v POV-Rayi

Výšková pole představují ve své podstatě specifický druh pravidelných trojúhelníkových sítí. Výšková pole přináší oproti obecné trojúhelníkové síti jedno zásadní omezení – jednotlivé trojúhelníky se nesmí po projekci do roviny xz překrývat (při reprezentaci zemského povrchu v POV-Rayi jsou osy x a z většinou orientovány vodorovně, kdežto osa y svisle vzhůru, což může být pro někoho, kdo například pracoval s modelovacími programy, poněkud matoucí). Toto omezení však přináší možnost reprezentace povrchu pomocí výšek uložených v pravidelné rastrové mřížce, což je výhodné především z hlediska paměťových nároků, ale i možnosti vytvořit výškové pole pouze s využitím jednoduchého grafického editoru.

povray1202

Totéž výškové pole po přidání vodní hladiny

V POV-Rayi je výškové pole skutečně uloženo v externím souboru, který má formát běžného rastrového obrázku. Podporovány jsou grafické formáty Compuserve GIF, Targa, PNG, JPEG, PPM a další. U každého pixelu v obrázku se při jeho načítání provede převod na úrovně šedé a posléze se tato úroveň převede na výšku ležící v rozmezí 0 až 1. V případě obrázků s barvovou paletou je index barvy přímo převeden na výšku v rozmezí 0 až 1, tj. v případě osmibitové palety je index podělen konstantou 255, takže výsledná hodnota skutečně leží v rozsahu 0 až 1.

povray1203

Ještě výše položená vodní hladina

povray1204

Rastrový obrázek vzniklý v programu Fractint, který byl použitý při vytváření všech tří výše zobrazených výškových polí

Sousední trojice bodů tvoří vrcholy trojúhelníku, který se interně vytvoří v operační paměti; následně je výškové pole zpracováno stejným způsobem jako běžná trojúhelníková síť. Rozměr výškového pole po jeho projekci do roviny xz je roven 1×1 délkové jednotce, tj. celé výškové pole leží uvnitř krychle s jednotkovými stěnami, jejíž jeden vrchol leží v počátku souřadné soustavy. Umístění výškového pole, na které není aplikována žádná lineární transformace, ve scéně je naznačeno na následujícím obrázku.

povray1205

Výškové pole je omezeno krychlí o rozměrech 1×1×1

Velmi zajímavé je použít pro výškové pole měnící se rastrové obrázky a vytvořit tak působivou animaci. Touto možností se ještě budeme podrobněji zabývat v následujících částech seriálu.

2. První demonstrační příklad – výškové pole uložené v rastrovém obrázku

V dnešním prvním demonstračním příkladu je ukázáno použití rastrového obrázku pro tvorbu výškového pole představujícího trojrozměrný nápis. Obrázek s definicí výškového pole byl získán velmi jednoduchým postupem: v rastrovém grafickém editoru (PaintBrush, MTPaint, GIMP, KolourPaint atd.) se vytvořil nápis, který se poté pomocí několika aplikací konvolučního filtru typu smooth rozmazal, aby písmo neobsahovalo ostré přechody mezi černou barvou (reprezentující nulovou výšku) a barvou bílou (představující naopak výšku maximální). Vznikla tak bitmapa, která byla následně převedena do odstínů šedi (grayscale) a uložena v jednom z podporovaných formátů. V tomto případě se jedná o grafický rastrový formát GIF; výsledek je zobrazen na následujícím obrázku:

povray1206

Bitmapa použitá pro vytvoření geometrických informací o výškovém poli

V demonstračním příkladu je výškové pole vytvořeno pomocí objektu typu height_field, který má nastaveny své základní atributy. Prvním atributem je specifikace grafického formátu obrázku, ve kterém je výškové pole uloženo (zde gif), za nímž následuje jméno souboru. Druhý atribut, jenž má název smooth, slouží k tomu, aby se při tvorbě výškového pole vypočítaly průměrné normálové vektory ve společných vrcholech všech sousedních trojúhelníků, čímž vznikne opticky hladší plocha. Třetí atribut má název water_level a určuje se pomocí něho úroveň („hranice vodní hladiny“), pod níž dochází k ořezu všech trojúhelníků. V praxi to znamená například to, že pokud je úroveň vodní hladiny nastavena na hodnotu 0.3, jsou všechny trojúhelníky, jejichž vrcholy (přesněji řečeno jejich y-ové souřadnice) leží pod touto hodnotou, z výškového pole odstraněny a ty trojúhelníky, u nichž jsou některé vrcholy níže a některé výše, jsou ořezány. Výsledkem je výškové pole, u nějž chybí všechny jeho nižší části, které lze nahradit plochou představující vodní hladinu.

povray1207

První demonstrační příklad po renderingu v POV-Rayi

Vzhledem k tomu, že nadpis (tj. jeho trojrozměrná podoba) má být poměrně nízký, je výškové pole ve směru y-ové osy zvětšeno pouze 1× až 2×, zatímco ve směru ostatních dvou os se pole zvětšilo 17×. V případě, že by bylo měřítko ve směru y-ové osy záporné, bylo by pole „převráceno“, což je ukázáno na obrázku zobrazeném pod výpisem. Následuje již zmiňovaný výpis zdrojového kódu prvního demonstračního příkladu:

// ------------------------------------------------------------
// Demonstrační příklad na použití výškového pole (height field)
// v POV-Rayi. Pro úspěšný rendering je zapotřebí mít v pracovním
// adresáři soubor hf.gif.
//
// rendering lze spustit příkazem:
//     povray +W800 +H600 +B100 +FN +D +Iheight1.pov +Oheight1.png
// (pro náhled postačí zadat povray height1.pov)
// ------------------------------------------------------------

#version 3.1;                            // specifikace verze POV-Raye

global_settings {
    assumed_gamma 2.2
}

#include "colors.inc"
#include "woods.inc"

camera {                                 // nastavení kamery,
    location <2, 42, -40>                // pozice kamery ve scéně
    direction z*5                        // směr kamery
    look_at  <0, -1, 0>                  // bod, na který kamera směřuje
}


light_source {                           // světelný zdroj
    <500,500,-500>                       // pozice světelného zdroje
    White                                // barva světelného zdroje
}

height_field {                           // výškové pole
    gif "hf.gif"                         // rastrový obrázek s výškovým polem
    smooth                               // kvalitnější a pomalejší rendering
    water_level 0                        // úroveň "hladiny" - zde bez odřezání nižších částí
    texture {                            // vlastnosti materiálu
        pigment {                        // procedurální textura
            agate
            agate_turb 0.7
        }
        finish {                         // odlesky
            phong 1
        }
        scale 0.5                        // změna měřítka textury
        rotate <45,45,45>                // rotace textury (aby nebyla rovnoběžná se z-ovou osou)
    }
    translate <-0.52, 0, -0.5>           // posun a změna měřítka objektu
    scale <17, 1, 17>
}



// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1208

První demonstrační příklad, ve kterém je výškové pole podrobeno změně měřítka o vektor (1, –0.7, 1)

3. Druhý demonstrační příklad – vytvoření výškového pole přímo v POV-Rayi

Druhý demonstrační příklad, který je mimochodem dodávaný spolu s POV-Rayem, je poměrně zajímavý, protože výškové pole se v tomto případě vytváří přímo v POV-Rayi a nikoli v nějakém externím rastrovém grafickém editoru. Celý rendering je rozdělený do dvou na sebe navazujících částí představovaných samostatnými zdrojovými soubory. V prvním souboru a tím pádem i prvním kroku se vykreslí základ výškového pole. Je použita rovina pokrytá procedurální texturou, která je vhodným způsobem osvětlena několika světelnými zdroji (dva jsou „záporné“, tj. světlo nevyzařují, ale naopak pohlcují). Na tomto místě je vhodné si uvědomit, že světlé části představují hory a naopak, tj. zde se vlastně přidáním zdrojů světla modeluje povrch. Vykreslený základ výškového pole vypadá následovně (jedná se o kráter se zbytkem původního meteoritu uprostřed):

povray1209

Rastrový soubor výškového pole představujícího kráter

Zdrojový soubor, pomocí kterého bylo výškové pole vytvořeno, má tvar:

// ------------------------------------------------------------
// Pomocí tohoto příkladu se vytvoří rastrový soubor, který
// představuje výškové pole ve tvaru kráteru.
//
// Originální hlavička:
// Persistence Of Vision raytracer version 3.0 sample file.
// Render this file to create CRAT_DAT.TGA and then render CRATER.POV
// Use special 16-bit gray output
// ------------------------------------------------------------

#version 3.0
global_settings {
    assumed_gamma 2.2
    hf_gray_16                           // zde se zapíná šestnáctibitový výstup
}

#include "colors.inc"

// rovina tvořící zvlněný povrch
plane {z,10
    hollow on
    pigment{
        wrinkles                         // procedurální textura, která vytvoří nerovný povrch
        color_map{
            [0 White*0.3]
            [1 White]
        }
    }
}

// Main spotlight creates crater mountain
light_source {
    0 color 1
    spotlight point_at z*10
    radius 7 falloff 11
}

// Dim spotlight softens outer edges further
light_source {
    0 color 0.25
    spotlight point_at z*10
    radius 2 falloff 15
}

// Narrow spotlight creates central peak
light_source {
    0 color 1
    spotlight point_at z*10
    radius 0 falloff 1.3
}

// Negative spotlight cuts out crater insides
light_source {
    0 color -0.9
    spotlight point_at z*10
    radius 5 falloff 9.5
}

// Dim negative spotlight counteracts dim positive light in center
light_source {
    0 color -.25
    spotlight point_at z*10
    radius 3 falloff 8
}



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

Vytvořený obrázek je možné použít pro rendering modelu kráteru. Díky procedurální textuře a správnému nasvětlení skutečně získáme relativně dokonalý výsledný obrázek, a to bez nutnosti použití jakéhokoli modelovacího programu!

povray1210

Výsledný model kráteru po vykreslení v POV-Rayi

Zdrojový soubor, pomocí kterého byl předchozí obrázek vytvořen, má tvar:

// ------------------------------------------------------------
// Druhý demonstrační příklad na použití výškového pole (height field)
// v POV-Rayi. Pro úspěšný rendering je zapotřebí mít v pracovním
// adresáři soubor crat_dat.tga/crat_dat.png.
// ------------------------------------------------------------

#version 3.1;                            // specifikace verze POV-Raye

global_settings {
    assumed_gamma 2.2
}

#include "colors.inc"

camera {                                 // nastavení kamery,
    location <0, 8, -20>                 // pozice kamery ve scéně
    direction z*5                        // směr kamery
    look_at  <0, 0, 0>                   // bod, na který kamera směřuje
}


light_source {                           // světelný zdroj
    <1000,1000,-1000>                    // pozice světelného zdroje
    White                                // barva světelného zdroje
}

height_field {                           // výškové pole
    png "crater_dat.png"                 // rastrový obrázek s výškovým polem
    smooth                               // kvalitnější a pomalejší rendering
    pigment {                            // barva výškového pole
        White
    }
    translate <-.5, 0, -.5>              // posun a změna měřítka objektu
    scale <17, 0.80, 17>
}



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

4. Specifikace osvětlení a typy světelných zdrojů

Velmi důležitou součástí naprosté většiny modelovaných prostorových scén je i správně navržené osvětlení, přesněji řečeno světelné zdroje umisťované v prostoru, které zásadním způsobem ovlivňují vnímání celé scény pozorovatelem.

povray1211

Správně nastavené světlo může scénu buď zcela znehodnotit či naopak obzvláštnit

Ostatně si toto tvrzení můžeme jednoduše dokázat. Na následujících pěti obrázcích (viz další kapitoly) je vyobrazena naprosto stejná scéna obsahující tři uzavřené objekty, jednu nekonečnou rovinu a jeden (v tomto případě proměnlivý) světelný zdroj, přičemž se jednotlivé výsledky od sebe liší pouze použitým typem osvětlení. Barvy objektů umístěných ve scéně a optické vlastnosti jejich povrchu (neboli materiál objektů) je stále tentýž.

POV-Ray je sice označovaný za raytracer, ve kterém je osvětlení počítáno pomocí metody zpětného sledování paprsků (paprsky jsou „vystřelovány“ z pozice pozorovatele do scény a ne naopak, což by bylo výpočetně nepoměrně náročnější), ovšem je možné v něm použít i vyzařovací neboli radiozitní metodu výpočtu osvětlení. V POV-Rayi se tak spojuje síla klasického raytracingu umožňujícího vykreslovat zrcadlové i průhledné předměty s možnostmi radiozitní metody, pomocí které se – ovšem za cenu výrazného zpomalení celého výpočtu – fyzikálně v zásadě korektním způsobem počítá distribuce všesměrového rozptýleného (ambientního) světla. O této velmi zajímavé metodě si povíme více v následujících částech tohoto seriálu, nyní se zaměříme především na popis základních pěti typů světelných zdrojů, které je možné v modelovaných scénách použít. Jedná se o následující typy světel:

Typ světla Poznámka
všesměrové rozptýlené světlo jedná se o globální vlastnost scény
bodové světlo nejjednodušší typ světelného zdroje
směrové světlo lze omezit na světelný válec
reflektorové světlo ve skutečnosti světelný kužel
světlo vycházející z plochy simulace bodovými či směrovými světly

5. Ambientní světlo

Nejjednodušším zdrojem světla je takzvané ambientní světlo. Toto světlo není přímo vyzařováno ze žádných světelných zdrojů, ale přichází do scény ze všech stran s konstantní intenzitou. V osvětlovacím modelu použitém v POV-Rayi je toto světlo považováno za všesměrové, tj. osvětluje objekt ze všech směrů nezávisle na jeho poloze a orientaci. Z následujícího obrázku je patrné, že nezávisle na 3D tvaru objektu se tento objekt jeví jako plošný, ztrácíme tedy prostorový vjem.

povray1212

Ve scéně je použito pouze ambientní světelný zdroj (světlo je v celé scéně konstantní)

6. Bodové světlo

Nejjednodušším typem skutečného světelného zdroje je bodové světlo. Toto světlo si můžeme představit například jako idealizovanou žárovku umístěnou v prostoru, která vyzařuje světlo na všechny strany se stejnou intenzitou. V mnoha scénách i našich demonstračních příkladech je použit právě tento typ světla.

povray1213

Bodové světlo, které nevrhá stíny a nejsou pro něj spočteny odlesky

povray1214

Bodové světlo vrhající stíny (v raytracingu nejběžnější případ)

7. Plošné světlo

V POV-Rayi je možné simulovat i plošný světelný zdroj, který vytváří měkké stíny (polostíny). Jedná se o typ světla, jenž je podporován pouze v některých renderovacích aplikacích a který přitom přináší další úroveň ve fotorealističnosti vykreslené scény, protože v reálném světě (minimálně v prostoru s atmosférou) vznikají polostíny prakticky vždy. Vzhledem k tomu, že je výpočet plošných světelných zdrojů při raytracingu velmi složitý, simuluje POV-Ray skutečný plošný zdroj několika zdroji bodovými. Většinou se používá mřížka 3×3 či 5×5 bodových světelných zdrojů s jejich mírným rozptýlením z přesně vypočtených pozic. V případě potřeby výpočtu skutečných plošných světelných zdrojů je nutné použít vyzařovací (radiozitní) metodu popsanou v dalších částech seriálu.

povray1215

Plošné světlo s nastavením měkkých stínů

povray1216

Plošné světlo s nastavením měkkých stínů, přičemž je světelný zdroj zviditelněný

8. Reflektorové světlo

Výpočetně nejnáročnější je reflektorový světelný zdroj. U tohoto zdroje je možné zadávat velké množství parametrů. Kromě základních koeficientů použitých i u dalších světelných zdrojů, jakými jsou barva světla a jeho intenzity, 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, vrcholový úhel většího kužele, kde intenzita směrem k jeho okraji postupně klesá, maximální dosvit a také hodnota, pomocí které je specifikován pokles dosvitu (podobně jako u bodového zdroje světla).

Cloud 24 - tip 1

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

V následující části si praktické použití jednotlivých světelných zdrojů ukážeme na několika demonstračních příkladech.

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.