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?
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.
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.
Ještě výše položená vodní hladina
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.
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:
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.
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
// ------------------------------------------------------------
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):
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!
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.
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.
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.
Bodové světlo, které nevrhá stíny a nejsou pro něj spočteny odlesky
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.
Plošné světlo s nastavením měkkých stínů
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).
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.