Hlavní navigace

Pokročilý warping textur a interference světla

16. 12. 2008
Doba čtení: 11 minut

Sdílet

V dnešní části seriálu o raytraceru POV-Ray dokončíme popis warpingu textur. Ukážeme si tvorbu přirozeně působících povrchů, například dřeva se suky. Také si popíšeme další pokročilé techniky, zejména to, jakým způsobem lze nastavit interferenci světla na povrchu s tenkou vrstvou vody či oleje.

Obsah

1. Pokročilý warping textur a interference světla v POV-Rayi
2. Opakování a náhodné rozmístění objektů typu „black-hole“
3. První demonstrační příklad – vytvoření dřevěného povrchu se suky
4. Druhý demonstrační příklad – jednoduchá animace warpingu textur
5. Interference světla a její simulace v POV-Rayi
6. Parametry ovlivňující interferenci
7. Obsah dalšího pokračování seriálu

1. Pokročilý warping textur a interference světla v POV-Rayi

V předchozí části tohoto seriálu jsme si popsali některé z možností takzvaného warpingu textur. Jedná se o nelineární transformace, které mohou být aplikovány na procedurální textury. Warping textur je možné použít například pro mapování (nanášení) původně planárních procedurálních textur (wood, checker, hexagon, brick, mandel, julia, magnet apod.) na předměty, jejichž tvar je kulový, válcovitý či se podobá toroidu. Další oblastí, ve které se warping textur poměrně často v praxi používá, je aplikace tzv. černé díry (black hole) na texturu, tj.  vložení neviditelného objektu do prostoru textury, který k sobě přitahuje či naopak odpuzuje jednotlivé body tvořící barevný vzorek. Objekt se tedy chová jako skutečná černá díra – ta také není sama o sobě viditelná, můžeme však pozorovat její účinek na své okolí. Pomocí této technologie lze například vytvořit procedurální texturu představující dřevo se suky, což si ukážeme v dnešním prvním demonstračním příkladu popsaném ve třetí kapitole.

povray4001

Obrázek 1: Vznik textury dřeva se suky. Základem je procedurální textura typu „wood“, která (bez aplikace turbulence) vytvoří pravidelné barevné kruhy s pozvolným přechodem barev.

Ve druhém demonstračním příkladu si také ukážeme, jakým způsobem lze warping textur založený na aplikaci černé díry s kladnou i zápornou gravitací použít pro tvorbu zajímavě vypadající animace. Základem ukázané animace je procedurální textura typu marble, na kterou je aplikována jedna černá díra s kladnou gravitací a druhá černá díra s gravitací zápornou. Oba tyto objekty se v prostoru textury pohybují (dokonce se mohou navzájem překrývat či dotýkat), čímž dochází k viditelným lokálním deformacím procedurální textury.

povray4002

Obrázek 2: Posun textury „wood“ tak, aby na vykreslovaném objektu nebyl vidět střed kruhů.

Kromě warpingu textur si dnes také popíšeme další poměrně pokročilou renderovací techniku, kterou POV-Ray svým uživatelům nabízí. Jedná se o simulaci interference světla na tělesech, jejichž povrch je pokryt velmi tenkou vrstvou poloprůhledného materiálu. Příkladem může být například vodní hladina, na níž se nachází olejové skvrny. Tloušťka skvrn je srovnatelná s vlnovou délkou světla, takže při osvětlení vodní hladiny dochází k zajímavému a všeobecně známému jevu – část světelných paprsků se odrazí již od horní vrstvy oleje a druhá část paprsků naopak touto vrstvou projde a odrazí se až od místa, kde se olej stýká s vodou. Vlivem interference mezi oběma skupinami světelných paprsků vznikají různé duhové obrazce, jejichž barva závisí na pozorovacím úhlu i úhlu dopadu světla. POV-Ray sice nedokáže interferenci světla vypočítat zcela přesně (používá totiž barvový model RGB, který skutečnou podstatu světla dosti podstatným způsobem zjednodušuje), ale přesto jsou výsledné obrázky využívající interferenci poměrně realistické.

povray4003

Obrázek 3: Natočení procedurální textury v prostoru. Z kruhů se stávají protáhlé elipsy, protože procedurální textura „wood“ tvoří v prostoru soustředné válce, jejichž řezem vzniká zobrazený vzorek.

2. Opakování a náhodné rozmístění objektů typu „black-hole“

Minule jsme si řekli a na jednom demonstračním příkladu i ukázali, jakým způsobem je možné měnit tvar procedurální textury pomocí objektu nazvaného černá díra (black hole). Jedná se o neviditelný objekt vložený do prostoru textury, který k sobě přitahuje či naopak odpuzuje jednotlivé body tvořící barevný vzorek (pigment). Vzhledem k tomu, že procedurální textury jsou prostorové, je efekt působení černé díry patrný při jakémkoli řezu texturou. Mezi dvě nejdůležitější vlastnosti tohoto objektu patří velikost síly, kterou objekt na své okolí působí (strength) a také vzdálenost, do které síla působí (radius). Největší působení (a tedy i největší síla) je v geometrickém středu objektu, poté se vzrůstající vzdáleností lineárně či nelineárně klesá (funkce poklesu se specifikuje atributem falloff). Síla může být přitažlivá (podobně jako u skutečné černé díry) nebo naopak odpudivá – v tomto případě se body od černé díry odpuzují, takže při nastavení velké odpudivé gravitační síly se v textuře objevuje jednobarevný kruh. To, zda má černá díra body přitahovat či naopak odpuzovat, se řídí atributem inverse.

povray4004

Obrázek 4: Aplikace prvního „pole“ černých děr vede k vytvoření malých nepravidelně rozmístěných suků.

V některých případech postačuje procedurální texturu ovlivnit („zbortit“) pouze jednou černou dírou, ovšem v praxi často nastávají situace, kdy je zapotřebí aplikovat černých děr několik, přičemž jejich rozmístění má být víceméně pravidelné. Například již několikrát zmíněné dřevo může v řezu obsahovat mnoho lokálních deformací (malých suků), které se v původním vzorku textury nevyskytují; u textury betonu můžeme požadovat vykreslení malých bublinek atd. Zcela jistě by bylo nepraktické, kdyby se ve vytvářené textuře musel každý objekt černé díry explicitně zapisovat, to by vedlo k nepřehlednosti a samozřejmě také ke zbytečné pracnosti při editaci zdrojového kódu se scénou. Ani použití programových smyček typu #while – #end není ideální, jelikož znesnadňuje deklarativní způsob zápisu celé scény, nehledě na to, že většina uživatelů POV-Raye tyto programové konstrukce buď nezná, nebo je nechce používat.

povray4005

Obrázek 5: Aplikace druhého „pole“ černých děr na procedurální texturu dřeva.

POV-Ray nám však i v tomto případě nabízí schůdné řešení. To spočívá ve využití klíčového slova repeat, za nímž je uveden vektor tří hodnot, například <2, 1.5, 0>. Pomocí tohoto vektoru se specifikuje tělesová úhlopříčka virtuálního kvádru, který tvoří základ prostorové mřížky, jež rozděluje celý nekonečný prostor na stejně velké a souhlasně orientované kvádry (kvádry tedy celý prostor beze zbytku vyplňují). V každém kvádru leží jedna černá díra, přičemž souřadnice jejího středu (což je hodnota zapsaná přímo za klíčovým slovem black_hole) je chápána relativně k souřadnicím samotného kvádru. Výsledkem jsou tedy pravidelně rozmístěné černé díry v celém prostoru procedurální textury. Toto zcela pravidelné rozmístění, které by u mnoha textur nepůsobilo reálně, lze „znáhodnit“ tak, že se do uzlu warp navíc uvede klíčové slovo turbulence s vektorem, jehož složkami jsou specifikovány amplitudy šumové funkce, pomocí níž se k vypočteným souřadnicím černých děr připočte pseudonáhodná hodnota.

povray4006

Obrázek 6: Finální krok – vložení černé díry s velkým poloměrem na vhodné místo vede ke vzniku masivního suku. Takto „zdeformovaná“ textura si uchovala všechny kladné vlastnosti procedurálních textur – nezávislost na rozlišení výsledného obrázku, možnost použít při vykreslování antialiasing, jittering atd.

3. První demonstrační příklad – vytvoření dřevěného povrchu se suky

V dnešním prvním demonstračním příkladu si ukážeme tvorbu reálně vypadající textury dřeva se suky. Postup při tvorbě této procedurální textury byl ukázán na prvních šesti obrázcích (viz předchozí kapitoly). Základem je procedurální textura wood, která tvoří (při pohledu shora) vzorek připomínající soustředné barevné kruhy s plynulým přechodem barev. Tato textura je nejdříve pomocí lineární transformace posunuta tak, aby na použité části vzorku již nebyl přítomen střed celé textury. Následně je provedeno natočení textury v prostoru, takže se z původních kruhů stanou podlouhlé elipsy (tento postup znají všichni výrobci nábytku i táborníci z výroby „cingrlátek“, kdy se dřevěný špalíček neřeže kolmo, ale pod větším či menším úhlem). Tím je hotový základ textury, který však vypadá velmi pravidelně a uměle. Přidáme tedy dvě „pole“ černých děr (využívá se zde již popsané klíčové slovo repeat a turbulence) a navíc ještě jednu černou díru s větším poloměrem, která do původně pravidelného vzorku vnese žádoucí stupeň nepravidelnosti.

povray4007

Obrázek 7: Obrázek získaný renderingem prvního demonstračního příkladu.

Následuje výpis zdrojového kódu prvního demonstračního příkladu, ve kterém si povšimněte, že jednotlivé výše popsané kroky vytvoření textury dřeva je možné povolit či naopak zakázat vhodným nastavením hodnoty proměnné STAGE. Pokud je tato hodnota nulová, je vykreslena základní procedurální textura wood; při hodnotě rovné pěti se aplikují všechny modifikace této textury:

// ------------------------------------------------------------
// První demonstrační příklad - ukázka použití procedurální
// textury zadané matematickým výrazem. Textura je ovlivněna
// modifikátorem "warp". Změnou hodnoty proměnné STAGE je možné
// postupně zapínat jednotlivé modifikátory procedurální textury.
//
// Hodnota STAGE by měla ležet mezi 0 až 5.
//
// rendering lze spustit příkazem:
//     povray +W1024 +H768 +B100 +FN +D +Ipriklad1.pov +Opriklad1.png
//
// ------------------------------------------------------------

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

#include "colors.inc"                    // načtení deklarací barev
#include "textures.inc"                  // načtení předpřipravených textur,
                                         // i dále použité DMFWood4

#declare STAGE = 5;                      // změnou této proměnné lze povolit
                                         // či zakázat modifikátory textury

camera                                   // nastavení kamery
{
    location <0, 0, -15>                 // pozice kamery ve scéně
    direction 3*z                        // směr pohledu kamery
}

light_source                             // první světelný zdroj
{
    <300, 500, -500>                     // pozice světelného zdroje
    color Gray65                         // barva světelného zdroje
}

light_source                             // druhý světelný zdroj
{
    <-50,  10, -500>                     // pozice světelného zdroje
    color Gray65                         // barva světelného zdroje
}

// deklarace tvaru vykreslovaného objektu
#declare Thing = box
{
    <-7, -3, 0>,                         // kvádr s viditelnou jednou stranou
    < 7, 3, 1>
}

// deklarace základní textury, kterou je objekt pokrytý
#declare Tree = pigment
{
    DMFWood4                             // procedurální textura založená na
    scale 2                              // interní textuře "wood"

    #if (STAGE>=1)
        translate <1/2,0,1>
    #end



    #if (STAGE>=2)
        rotate x*85                      // rotace textury - změna kružnic na elipsy
    #end

    #if (STAGE>=1)
        translate 10*y                   // posun textury, aby nebyl vidět její střed
    #end
}

// vykreslení objektu
object
{
    Thing                                // tvar objektu
    pigment
    {
        Tree                             // procedurální textura
        #if (STAGE>=3)
            warp                         // první "pole" malých suků
            {
              black_hole <0, 0, 0>, 0.5  // pozice a poloměr první černé díry
              falloff 3                  // tvar funkce úbytku gravitace
              strength 0.75
              inverse
              repeat <2, 1.5, 0>         // vzdálenost mezi prvky pole
              turbulence <1.0, 0.5, 0>   // náhodnost v jejich rozmístění
            }
        #end
        #if (STAGE>=4)
            warp                         // druhé "pole" malých suků
            {
              black_hole <0.15, 0.125, 0>, 0.5
              falloff 7                  // tvar funkce úbytku gravitace
              strength 1.0
              repeat <1.25, 1.25, 0>     // vzdálenost mezi prvky pole
              turbulence <0.25, 0.25, 0> // náhodnost v jejich rozmístění
              inverse
            }
        #end
        #if (STAGE>=5)
            warp                         // vytvoření největšího suku
            {
              black_hole <0, 0, 0>, 1.0  // pozice a poloměr černé díry
              falloff 2                  // tvar funkce úbytku gravitace
              strength 2
              inverse
            }
        #end
    }
}

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray4008

Obrázek 8: Suky ve dřevě je možné lépe zviditelnit tak, že se u objektů typu „black-hole“ nastaví větší intenzita gravitace.

4. Druhý demonstrační příklad – jednoduchá animace warpingu textur

V dnešním druhém demonstračním příkladu si ukážeme, jakým způsobem lze warping textur založený na aplikaci černé díry s kladnou i zápornou gravitací použít pro tvorbu zajímavě vypadající animace. Základem animace, kterou můžete získat pod tímto odkazem, je procedurální textura typu marble modifikovaná šumovou funkcí (turbulence), na kterou je aplikována jedna černá díra s kladnou gravitací a druhá černá díra s gravitací zápornou. Oba tyto objekty se v prostoru textury pohybují (dokonce se mohou navzájem překrývat či dotýkat, protože jejich trajektorie jsou různé – každá trajektorie má tvar Lissajousova obrazce s poměrem frekvencí 2:3), čímž dochází k viditelným lokálním deformacím procedurální textury. Výsledná animace obsahuje 500 snímků, z nichž každý má rozlišení 320×320 pixelů, celková doba trvání animace je dvacet sekund.

povray4009

Obrázek 9: Druhý demonstrační příklad – první snímek animace.

Zdrojový kód druhého demonstračního příkladu vypadá následovně:

// ------------------------------------------------------------
// Druhý demonstrační příklad - ukázka použití procedurální
// textury zadané libovolnou funkcí, která je zkreslena pomocí
// warpingu typu "black_hole". Na texturu působí dva objekty
// typu black_hole, jeden má kladnou a druhý zápornou gravitaci
//
// rendering lze spustit příkazem:
//     povray +W1024 +H1024 +B100 +FN +D +Ipriklad2.pov +Opriklad2.png
//
// animaci lze vytvořit přidáním parametru:
//     +KFFpočet_snímků
//
// !POZOR: scénu je nutné vykreslit se stejným horizontálním
//         i vertikálním rozlišením, jinak dojde k nežádoucímu
//         zkreslení výsledného obrázku!
// ------------------------------------------------------------

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

#include "colors.inc"

#declare BLACK_HOLE_STRENGTH = 0.8;

camera                         // nastavení kamery
{
    orthographic               // bez perspektivy
    location < 0, 0, -1>       // pozice kamery
    right 5*x                  // šířka a výška snímané části scény
    up 5*y
    direction z                // směr pohledu kamery (k počátku)
}

light_source                   // světelný zdroj
{
    <200, 200, -500>           // pozice
    color White                // barva
}

#declare COLMAP1 = color_map   // barvová mapa
{
    [0.0  color Blue]          // hodnota 0 je dolní mezí, pro kterou lze specifikovat barvu
    [0.7  color White]
    [1.0  color Red]           // hodnota 1 je naopak horní mezí
}

#declare OBJECT = box
{                              // testovací objekt - jednoduchý kvádr
    <-2,-2, 0>,
    < 2, 2, 1>
}

// výpočet úhlu z hodnoty interní proměnné "clock"
#declare alfa = radians(-360*clock);

object                         // objekt potažený procedurální texturou,
{                              // která je zkreslena
    OBJECT                     // warpingem typu "black_hole"
    texture
    {
        pigment
        {
            marble
            turbulence 0.5
            color_map
            {
                COLMAP1
            }
            warp               // černá díra s kladnou gravitací
            {
                black_hole <1.5*cos(alfa*3), 1.5*sin(alfa*2), 0>, 2.5 // souřadnice a poloměr
                strength BLACK_HOLE_STRENGTH  // gravitační síla
            }
            warp               // černá díra s gravitací zápornou
            {
                black_hole <-1.5*cos(alfa*2), -1.5*sin(alfa*3), 0>, 2.5 // souřadnice a poloměr
                inverse
                strength BLACK_HOLE_STRENGTH  // gravitační síla
            }
        }
    }
}

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray4010

Obrázek 10: Druhý demonstrační příklad – prostřední snímek animace.

povray4011

Obrázek 11: Druhý demonstrační příklad – jeden z posledních snímků animace.

5. Interference světla a její simulace v POV-Rayi

Již v první kapitole jsem se zmínil o tom, že POV-Ray dokáže simulovat i interferenci světla vznikající na povrchu těles, které jsou pokryty velmi tenkou vrstvou (filmem) nějakého poloprůhledného materiálu. Pokud je tloušťka této vrstvy srovnatelná s vlnovou délkou světla, 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). 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.

povray4012

Obrázek 12: Simulace interference světla POV-Rayem.

6. Parametry ovlivňující interferenci

Základním parametrem, který ovlivňuje barvu i tvar duhových obrazců, je tloušťka poloprůhledné vrstvy (filmu). 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é simulovat aplikací šumové funkce (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. 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á. 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 příště.

povray4013

Obrázek 13: Míru interference i tloušťku filmu lze nastavit, stejně jako vlnovou délku světla, pro níž se interference počítá.

UX DAy - tip 2

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

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

povray4014

Obrázek 14: Objekty, na nichž dochází k interferenci světla. Oproti předchozímu obrázku došlo ke změně vlnové délky světla, pro kterou POV-Ray interferenci počítá.

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.