Hlavní navigace

Procedurální textury a role turbulence

24. 6. 2008
Doba čtení: 16 minut

Sdílet

V dnešní části našeho seriálu o mocném raytraceru POV-Ray si na příkladech vysvětlíme, jakým způsobem je možné při aplikaci procedurálních textur využít takzvanou turbulenci, pomocí níž lze do původně zcela pravidelného vzorku generovaného procedurální texturou vnést žádoucí prvek náhodnosti.

Obsah

1. Procedurální textury a role turbulence při jejich použití
2. Parametry ovlivňující výpočet turbulence pomocí funkce DNoise
3. První demonstrační příklad: postupná změna hodnoty parametru turbulence
4. Druhý demonstrační příklad: postupná změna hodnoty parametru octaves
5. Třetí demonstrační příklad: postupná změna hodnoty parametru omega
6. Procedurální textura typu „leopard“
7. Procedurální textura typu „wood“
8. Procedurální textura typu „marble“
9. Obsah další části seriálu

1. Procedurální textury a role turbulence při jejich použití

Všechny procedurální textury, které jsme si popsali v předchozí části tohoto seriálu, i procedurální textury popsané dnes (v posledních třech kapitolách), mají jednu společnou vlastnost – vzorky generované těmito texturami jsou zcela pravidelné a postrádají tak žádoucí náznak náhodnosti, se kterým se setkáme prakticky u všech přírodních materiálů i přírodních fenoménů (oheň, kouř, oblaky). Aby bylo možné jednoduše tvořit a následně i prakticky používat textury takových materiálů, jakými jsou například různé typy dřeva, mramoru, srsti zvířat, ale i mraků či kouře, umožňuje POV-Ray na generované procedurální textury aplikovat takzvanou turbulenci, pomocí níž se původní zcela pravidelný vzorek více či méně deformuje a stane se tak více náhodným (přesněji řečeno pseudonáhodným, protože výpočet lze kdykoli opakovat se shodným výsledkem). Právě způsobem zadání všech důležitých parametrů turbulence a jejich vlivu na výslednou texturu se budeme v dnešním článku zabývat.

povray1701

Obrázek 1: Velmi jednoduchá scéna obsahující dvě tělesa a dvě procedurální textury – jedna z textur simuluje strukturu dřeva, druhá textura pak strukturu mramoru

2. Parametry ovlivňující výpočet turbulence pomocí funkce DNoise

Interně se při výpočtu turbulence používá šumová funkce (noise function) nazvaná DNoise. Tato funkce pro každý bod v trojrozměrném prostoru R3 vrací trojrozměrný vektor d=(dx, dy, dz) reprezentující posun, o který se má bod posunout, přičemž jeho nová hodnota je použita při výpočtu barvy pomocí vybrané procedurální textury (bod posunutý do nových souřadnic bude mít obecně jinou barvu než bod původní). Přitom platí, že pro body, které jsou umístěny blízko sebe, se i jejich posuny přibližují a pro body vzdálenější se více odlišují (resp. mohou odlišovat) jejich vektory posunu. Výpočet turbulence se ovlivňuje pomocí několika parametrů. Nejdůležitější je parametr turbulence, pomocí kterého se udává míra působení turbulence na nějaký bod. Většinou se jedná o reálnou hodnotu z rozsahu 0 až 1, přičemž nulová hodnota značí nulovou míru turbulence a jednička poměrně velký vliv turbulence na tvar textury. Je však také možné tento parametr zadat ve formě vektoru <sx, sy, sz> a ovlivnit tak míru turbulence ve směru souřadných os.

Mezi další parametry, které je možné měnit, patří octave, omega a lambda. Počet aplikací funkce DNoise na nějaký bod je určen hodnotou octave. V případě, že je hodnota octave větší než jedna, je funkce DNoise volána vícekrát a tím pádem je na bod aplikováno i větší množství vektorů posunu. Míra zmenšování velikostí vektorů posunů generovaných funkcí DNoise se zvyšující se hodnotou octave je řízena parametrem omega, změna úhlu mezi jednotlivými vektory může být ovlivněna parametrem lambda. Čím menší je hodnota parametru omega, tím menší amplitudu (velikost) bude mít každý další vektor vypočtený pomocí funkce DNoise. Implicitní hodnota tohoto parametru je rovna 0.5, což znamená, že každý následující vektor má poloviční velikost než vektor předchozí. Implicitní hodnota parametru lambda je rovna dvěma a znamená, že následné vektory jsou oproti sobě natočeny náhodně. Hodnota blízko jedné naopak značí, že se orientace vektorů budou odlišovat pouze o malý úhel.

pigment  {
    typ_textury
    turbulence FLOAT nebo TURB_VECTOR
    octaves    FLOAT (převedené na celé číslo v rozsahu 1-10)
    omega      FLOAT
    lambda     FLOAT
} 

3. První demonstrační příklad: postupná změna hodnoty parametru turbulence

V dnešním prvním demonstračním příkladu je prakticky ukázáno, jaký vliv má turbulence na tvar původně velmi jednoduché textury nazvané marble neboli mramor. Bez aplikace turbulence má tato textura vzorek velmi podobný již minule popsané textuře gradient, ovšem s tím rozdílem, že se hodnota použitá pro výběr barvy z barvové mapy nejprve postupně zvyšuje od nuly do jedničky a posléze se opět snižuje směrem k nulové hodnotě. Výsledkem je, že textura je složena ze symetrických barevných pruhů určených barvovou mapou. Ovšem díky aplikaci turbulence se původní zcela pravidelný tvar textury mění, a to dosti podstatným způsobem (viz obrázek číslo 2). V demonstračním příkladu je vytvořeno devět viditelných povrchů (jedná se vždy o jednu ze stran kvádru) pokrytých právě texturou marble. Jednotlivé povrchy se od sebe odlišují mírou vlivu turbulence. Zatímco u prvního povrchu je míra rovna 0 %, u povrchu posledního je to již 80 %. Následuje výpis zdrojového kódu prvního demonstračního příkladu:

// ------------------------------------------------------------
// První demonstrační příklad ukazující práci s procedurálními
// texturami.
//
// Postupná změna hodnoty turbulence pro zvolenou procedurální
// texturu od hodnoty 0.0 do hodnoty 0.8.
//
// rendering lze spustit příkazem:
//     povray +W1024 +H1024 +B100 +FN +D +Itextures.pov +Otextures.png
//
// !POZOR: scénu je nutné vykreslit se stejným horizontálním
//         i vertikálním rozlišením!
// ------------------------------------------------------------

#version 3.0
global_settings {
    assumed_gamma 2.2
}

#include "colors.inc"

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

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

#declare COL1=-4.5;            // posuny objektů ve vztahu
#declare COL2= 0.0;            // k pomyslné mřížce
#declare COL3= 4.5;            // o rozměrech 3x3
#declare ROW1= 4.5;
#declare ROW2= 0.0;
#declare ROW3=-4.5;
#declare Z=0.0;

#declare PIGMENT=pigment {     // testovací procedurální textura
    marble                     // základ pro tvorbu textury mramoru
    color_map {                // náhrada původní barvové mapy
        [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>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.0
        }
    }
    translate <COL1, ROW1, Z>
}


object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.1
        }
    }
    translate <COL2, ROW1, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.2
        }
    }
    translate <COL3, ROW1, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.3
        }
    }
    translate <COL1, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.4
        }
    }
    translate <COL2, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.5
        }
    }
    translate <COL3, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.6
        }
    }
    translate <COL1, ROW3, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.7
        }
    }
    translate <COL2, ROW3, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.8
        }
    }
    translate <COL3, ROW3, Z>
}

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1702

Obrázek 2: Výsledek spuštění prvního demonstračního příkladu v POV-Rayi

4. Druhý demonstrační příklad: postupná změna hodnoty parametru octaves

Ve druhém demonstračním příkladu je opět ukázáno devět povrchů pokrytých procedurální texturou marble. Hodnota turbulence (resp. míra jejího vlivu na generovanou texturu) je v tomto případě konstantní (60 resp. 90 procent), liší se však hodnota octaves, která roste od minimální hodnoty 1 až do hodnoty 9. Jak je z obrázků patrné, i tato hodnota má velký vliv na výslednou podobu procedurální textury, ovšem tento vliv je odlišný od změny míry vlivu samotné turbulence. Za povšimnutí také stojí způsob vykreslení obrázku pomocí ortografického (rovnoběžného) promítání bez vlivu perspektivy (při použití perspektivního promítání by byly vidět i další stěny kvádrů) a způsob zajištění tvorby čtvercového obrázku, tj. nastavení měřítka vektorů right, up a direction, kterými se dolaďuje nastavení kamery ve scéně (podrobněji se tomuto tématu ještě budeme věnovat v navazujících částech tohoto seriálu).

povray1703

Obrázek 3: Výsledek spuštění druhého demonstračního příkladu v POV-Rayi při nastavení míry turbulence na hodnotu rovnou 60 procentům

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

// ------------------------------------------------------------
// Druhý demonstrační příklad ukazující práci s procedurálními
// texturami.
//
// Postupná změna hodnoty octaves pro zvolenou procedurální
// texturu od hodnoty 1 do hodnoty 9.
//
// rendering lze spustit příkazem:
//     povray +W1024 +H1024 +B100 +FN +D +Itextures.pov +Otextures.png
//
// !POZOR: scénu je nutné vykreslit se stejným horizontálním
//         i vertikálním rozlišením!
// ------------------------------------------------------------

#version 3.0
global_settings {
    assumed_gamma 2.2
}

#include "colors.inc"

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

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

#declare COL1=-4.5;            // posuny objektů ve vztahu
#declare COL2= 0.0;            // k pomyslné mřížce
#declare COL3= 4.5;            // o rozměrech 3x3
#declare ROW1= 4.5;
#declare ROW2= 0.0;
#declare ROW3=-4.5;
#declare Z=0.0;

#declare PIGMENT=pigment {     // testovací procedurální textura
    marble
    turbulence 0.6
    color_map {                // náhrada původní barvové mapy
        [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>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            octaves 1
        }
    }
    translate <COL1, ROW1, Z>
}


object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            octaves 2
        }
    }
    translate <COL2, ROW1, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            octaves 3
        }
    }
    translate <COL3, ROW1, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            octaves 4
        }
    }
    translate <COL1, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            octaves 5
        }
    }
    translate <COL2, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            octaves 6
        }
    }
    translate <COL3, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            octaves 7
        }
    }
    translate <COL1, ROW3, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            octaves 8
        }
    }
    translate <COL2, ROW3, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            octaves 9
        }
    }
    translate <COL3, ROW3, Z>
}

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1704

Obrázek 4: Výsledek spuštění druhého demonstračního příkladu v POV-Rayi při nastavení míry turbulence na hodnotu rovnou 90 procentům

5. Třetí demonstrační příklad: postupná změna hodnoty parametru omega

Ve třetím demonstračním příkladu je hodnota turbulence i hodnota octaves pro všech devět povrchů nastavena shodně, ovšem liší se hodnota parametru omega. Tímto parametrem se řídí, jak již víme z úvodních dvou kapitol, míra zmenšování vlivu turbulence při jejích opakovaných aplikacích v jednom bodu povrchu. Nulová hodnota parametru omega prakticky znamená, že se nebude brát ohled na hodnotu octaves, hodnota blízká jedničce pak velký vliv náhody (pseudonáhody) do tvaru generované textury.

povray1705

Obrázek 5: Výsledek spuštění třetího demonstračního příkladu v POV-Rayi při nastavení míry turbulence na hodnotu rovnou 60 procentům

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

// ------------------------------------------------------------
// Třetí demonstrační příklad ukazující práci s procedurálními
// texturami.
//
// Postupná změna hodnoty omega pro zvolenou procedurální
// texturu od hodnoty 0.0 do hodnoty 0.8.
//
// rendering lze spustit příkazem:
//     povray +W1024 +H1024 +B100 +FN +D +Itextures.pov +Otextures.png
//
// !POZOR: scénu je nutné vykreslit se stejným horizontálním
//         i vertikálním rozlišením!
// ------------------------------------------------------------

#version 3.0
global_settings {
    assumed_gamma 2.2
}

#include "colors.inc"

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

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

#declare COL1=-4.5;            // posuny objektů ve vztahu
#declare COL2= 0.0;            // k pomyslné mřížce
#declare COL3= 4.5;            // o rozměrech 3x3
#declare ROW1= 4.5;
#declare ROW2= 0.0;
#declare ROW3=-4.5;
#declare Z=0.0;

#declare PIGMENT=pigment {     // testovací procedurální textura
    marble
    turbulence 0.6
    octaves 6
    color_map {                // náhrada původní barvové mapy
        [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>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            omega 0.0
        }
    }
    translate <COL1, ROW1, Z>
}


object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            omega 0.1
        }
    }
    translate <COL2, ROW1, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            omega 0.2
        }
    }
    translate <COL3, ROW1, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            omega 0.3
        }
    }
    translate <COL1, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            omega 0.4
        }
    }
    translate <COL2, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            omega 0.5
        }
    }
    translate <COL3, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            omega 0.6
        }
    }
    translate <COL1, ROW3, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            omega 0.7
        }
    }
    translate <COL2, ROW3, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            omega 0.8
        }
    }
    translate <COL3, ROW3, Z>
}

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1706

Obrázek 6: Výsledek spuštění třetího demonstračního příkladu v POV-Rayi při nastavení míry turbulence na hodnotu rovnou 90 procentům

6. Procedurální textura typu „leopard“

Jednou z pravidelných procedurálních textur, na kterou lze aplikovat turbulenci, je i textura nazvaná leopard, která se snaží napodobit skvrny na srsti stejnojmenného dravce. Bez vlivu turbulence tvoří tato textura pravidelný vzorek složený z kružnic, pomocí turbulence je však možné do vzorku vnést náhodnost, což je také patrné při pohledu na sedmý obrázek. Zdrojový kód, ze kterého byl sedmý obrázek vytvořen, má tvar:

// ------------------------------------------------------------
// Čtvrtý demonstrační příklad ukazující práci s procedurálními
// texturami.
//
// Procedurální textura "leopard".
//
// rendering lze spustit příkazem:
//     povray +W1024 +H1024 +B100 +FN +D +Itextures.pov +Otextures.png
//
// !POZOR: scénu je nutné vykreslit se stejným horizontálním
//         i vertikálním rozlišením!
// ------------------------------------------------------------

#version 3.0
global_settings {
    assumed_gamma 2.2
}

#include "colors.inc"

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

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

#declare COL1=-4.5;            // posuny objektů ve vztahu
#declare COL2= 0.0;            // k pomyslné mřížce
#declare COL3= 4.5;            // o rozměrech 3x3
#declare ROW1= 4.5;
#declare ROW2= 0.0;
#declare ROW3=-4.5;
#declare Z=0.0;

#declare PIGMENT=pigment {
    leopard scale 0.4
    color_map {
        [0.0  color rgb <0.8, 0.2, 0.2>] // hodnota 0 je dolní mezí, pro kterou lze specifikovat barvu
        [0.2  color rgb <0.4, 0.2, 0.2>]
        [0.4  color White]
        [0.6  color rgb <0.2, 0.6, 0.6>]
        [1.0  color rgb <0.8, 0.2, 0.2>] // hodnota 1 je naopak horní mezí
  }
}

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

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.0
        }
    }
    translate <COL1, ROW1, Z>
}


object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.1
        }
    }
    translate <COL2, ROW1, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.2
        }
    }
    translate <COL3, ROW1, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.3
        }
    }
    translate <COL1, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.4
        }
    }
    translate <COL2, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.5
        }
    }
    translate <COL3, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.6
        }
    }
    translate <COL1, ROW3, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.7
        }
    }
    translate <COL2, ROW3, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.8
        }
    }
    translate <COL3, ROW3, Z>
}

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1707

Obrázek 7: Textura „leopard“ a vliv turbulence na její tvar

7. Procedurální textura typu „wood“

Další velmi často používanou procedurální texturou je textura nazvaná wood. Tu jsme si již popsali v předchozí části tohoto seriálu – vzorek je tvořen soustřednými kružnicemi vzniklými řezem nekonečných válců rovnoběžných s osou z. Ovšem až díky aplikaci turbulence dostává tento vzorek skutečně praktický význam a lze ho použít při tvorbě většiny modelů složených z dřevěných materiálů. Následuje příklad využívající barvovou mapu napodobující dřevo:

// ------------------------------------------------------------
// Pátý demonstrační příklad ukazující práci s procedurálními
// texturami.
//
// Postupná změna hodnoty turbulence pro zvolenou procedurální
// texturu "wood".
//
// rendering lze spustit příkazem:
//     povray +W1024 +H1024 +B100 +FN +D +Itextures.pov +Otextures.png
//
// !POZOR: scénu je nutné vykreslit se stejným horizontálním
//         i vertikálním rozlišením!
// ------------------------------------------------------------

#version 3.0
global_settings {
    assumed_gamma 2.2
}

#include "colors.inc"

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

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

#declare COL1=-4.5;            // posuny objektů ve vztahu
#declare COL2= 0.0;            // k pomyslné mřížce
#declare COL3= 4.5;            // o rozměrech 3x3
#declare ROW1= 4.5;
#declare ROW2= 0.0;
#declare ROW3=-4.5;
#declare Z=0.0;

#declare PIGMENT=pigment {
    wood
    omega 0.5
    octaves 6
    color_map {
        [0.0, 0.1 color rgb <0.88, 0.60, 0.40>
                  color rgb <0.88, 0.60, 0.40>]
        [0.1, 0.9 color rgb <0.88, 0.60, 0.40>
                  color rgb <0.60, 0.30, 0.20>]
        [0.9, 1.0 color rgb <0.60, 0.30, 0.20>
                  color rgb <0.60, 0.30, 0.20>]
    }
}

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

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.0
        }
    }
    translate <COL1, ROW1, Z>
}


object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.1
        }
    }
    translate <COL2, ROW1, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.2
        }
    }
    translate <COL3, ROW1, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.3
        }
    }
    translate <COL1, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.4
        }
    }
    translate <COL2, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.5
        }
    }
    translate <COL3, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.6
        }
    }
    translate <COL1, ROW3, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.7
        }
    }
    translate <COL2, ROW3, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.8
        }
    }
    translate <COL3, ROW3, Z>
}

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1708

Obrázek 8: Textura „wood“ a vliv turbulence na její tvar

8. Procedurální textura typu „marble“

Procedurální texturu marble (mramor) jsme si již popsali ve třetí kapitole, na tomto místě si alespoň ukážeme její variabilnost při použití různých barvových map. Tato textura se velmi často používá ve více vrstvách (multi layers), což je velmi zajímavá a přitom užitečná technika, kterou si popíšeme až v navazujících částech tohoto seriálu. Jedná se i o jednu z textur, která má již implicitně předdefinovaný barvový vzorek; ten je použitý na levém horním povrchu. Všechny další povrchy již využívají uživatelsky definované barvové mapy:

// ------------------------------------------------------------
// Šestý demonstrační příklad ukazující práci s procedurálními
// texturami.
//
// Postupná změna hodnoty turbulence pro zvolenou procedurální
// texturu "marble".
//
// rendering lze spustit příkazem:
//     povray +W1024 +H1024 +B100 +FN +D +Itextures.pov +Otextures.png
//
// !POZOR: scénu je nutné vykreslit se stejným horizontálním
//         i vertikálním rozlišením!
// ------------------------------------------------------------

#version 3.0
global_settings {
    assumed_gamma 2.2
}

#include "colors.inc"

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

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

#declare COL1=-4.5;            // posuny objektů ve vztahu
#declare COL2= 0.0;            // k pomyslné mřížce
#declare COL3= 4.5;            // o rozměrech 3x3
#declare ROW1= 4.5;
#declare ROW2= 0.0;
#declare ROW3=-4.5;
#declare Z=0.0;

#declare PIGMENT=pigment {
   marble
   turbulence 0.7
   octaves 5
   omega 0.6
}

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

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
        }
    }
    translate <COL1, ROW1, Z>
}


object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            color_map {
                [0.000 0.154   color red  0.690  green  0.612  blue  0.569
                color red  0.737  green  0.596  blue  0.522]
                [0.154 0.368   color red  0.737  green  0.596  blue  0.522
                color red  0.776  green  0.702  blue  0.624]
                [0.368 0.538   color red  0.776  green  0.702  blue  0.624
                color red  0.796  green  0.678  blue  0.643]
                [0.538 0.846   color red  0.796  green  0.678  blue  0.643
                color red  0.690  green  0.612  blue  0.569]
                [0.846 0.932   color red  0.690  green  0.612  blue  0.569
                color red  0.773  green  0.612  blue  0.569]
                [0.932 1.001   color red  0.773  green  0.612  blue  0.569
                color red  0.690  green  0.612  blue  0.569]
            }
        }
    }
    translate <COL2, ROW1, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            octaves 8
            omega 0.6
            turbulence 1
            color_map {
                [0.0 color Black]
                [0.8 color Black]
                [1.0 color Yellow]
            }
        }
    }
    translate <COL3, ROW1, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            color_map {
                [0.0 color Black]
                [0.5 color Green]
                [0.8 color Black]
            }
        }
    }
    translate <COL1, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            color_map {
                [0.0 0.05 color Black color Black]
                [0.05 0.90 color Pink color Red]
                [0.90 1.001 color Black color Black]
            }
        }
    }
    translate <COL2, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            color_map {
                [0.000 0.104   color red  0.161  green  0.133  blue  0.118
                color red  0.110  green  0.082  blue  0.071]
                [0.104 0.252   color red  0.110  green  0.082  blue  0.071
                color red  0.161  green  0.133  blue  0.118]
                [0.252 0.383   color red  0.161  green  0.133  blue  0.118
                color red  0.000  green  0.000  blue  0.000]
                [0.383 0.643   color red  0.000  green  0.000  blue  0.000
                color red  0.161  green  0.133  blue  0.118]
                [0.643 0.783   color red  0.161  green  0.133  blue  0.118
                color red  0.220  green  0.149  blue  0.137]
                [0.783 0.922   color red  0.220  green  0.149  blue  0.137
                color red  0.000  green  0.000  blue  0.000]
                [0.922 0.983   color red  0.000  green  0.000  blue  0.000
                color red  0.220  green  0.149  blue  0.137]
                [0.983 1.001   color red  0.220  green  0.149  blue  0.137
                color red  0.161  green  0.133  blue  0.118]
            }
        }
    }
    translate <COL3, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            color_map {                // náhrada původní barvové mapy
                [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í
            }
        }
    }
    translate <COL1, ROW3, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            color_map {
                [0.0  color rgb <0.8, 0.2, 0.2>] // hodnota 0 je dolní mezí, pro kterou lze specifikovat barvu
                [0.2  color rgb <0.4, 0.2, 0.2>]
                [0.4  color White]
                [0.6  color rgb <0.2, 0.6, 0.6>]
                [1.0  color rgb <0.8, 0.2, 0.2>] // hodnota 1 je naopak horní mezí
            }
        }
    }
    translate <COL2, ROW3, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            color_map {
                [0.0  color Yellow] // hodnota 0 je dolní mezí, pro kterou lze specifikovat barvu
                [0.3  color Green*0.7]
                [0.6  color White]
                [1.0  color Green*0.7] // hodnota 1 je naopak horní mezí
            }
        }
    }
    translate <COL3, ROW3, Z>
}

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1709

Obrázek 9: Textura „marble“ a vliv turbulence na její tvar

UX DAy - tip 2

9. Obsah další části seriálu

V následující části seriálu o raytraceru POV-Ray si ukážeme další procedurální textury, zejména ty, při jejichž vytváření jsou aplikovány různé šumové a náhodné funkce. Pomocí těchto textur je možné vytvářet například povrchy různých typů kamenů, mraky nebo povrch vodní hladiny. I na tyto „náhodné textury“ lze aplikovat turbulenci a změnit tak v malé či větší míře jejich výsledný vzorek.

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.