Warping textur v POV-Rayi

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

Sdílet

Ve třicáté deváté části seriálu o raytraceru POV-Ray se budeme zabývat pokročilými metodami texturování. Ukážeme si, jak lze ovlivnit způsob výpočtu procedurálních textur. Jedná se o takzvaný warping textur, pomocí něhož je možné vymodelovat například působivý suk ve dřevě i další zajímavé vzory.

Obsah

1. Warping textur v POV-Rayi
2. Podporované typy warpingu textur
3. První demonstrační příklad – zeď vytvořená z nepravidelných kamenů
4. Nelineární zkreslení procedurálních textur (mapování)
5. Druhý demonstrační příklad – procedurální textura hexagon mapovaná na kouli a válec
6. Nelineární zkreslení typu „black_hole“
7. Třetí demonstrační příklad – procedurální textura „marble“ a nelineární zkreslení
8. Obsah dalšího pokračování seriálu

1. Warping textur v POV-Rayi

V předchozích částech tohoto seriálu jsme si vysvětlili způsob použití procedurálních a posléze i rastrových textur, které je možné při renderingu scény aplikovat na povrch vykreslovaných těles. Minule jsme si také ukázali, jakým způsobem je možné zkombinovat libovolné množství procedurálních i rastrových textur tak, aby mohly být současně namapovány (naneseny) na jedno těleso. Tímto způsobem je možné vytvořit i poměrně složité vzorky, například kámen, na jehož povrchu roste mech, zrezavělé vodovodní potrubí, oprýskanou omítku na domech apod. Ovšem POV-Ray disponuje i poměrně novou technikou (většina dále popsaných vlastností se objevila až ve verzi 3.0, další dokonce ve verzi 3.1), pomocí níž lze na procedurální textury aplikovat některé nelineární transformace (zkreslení). Tato technika se souhrnně nazývá warping textur (česky „zborcení textur“, v tomto článku se však budu držet termínu warping) a lze pomocí ní poměrně jednoduchým postupem vytvořit například suky ve dřevě, zeď složenou z nepravidelných kamenů apod.

povray3901

Obrázek 1: Textury dřeva v této scéně jsou v naprosté většině případů představovány několika vrstvenými procedurálními texturami. Autorem scény i některých textur je Dan Farmer.

V neposlední řadě je možné warping textur použít pro mapování (nanášení) některých původně planárních procedurálních textur (například checker, hexagon, brick, mandel, julia, magnet apod.) na kulatá, válcovitá či toroidální tělesa. Všechny uvedené procedurální textury jsou samozřejmě definovány v celém prostoru (objemu), ovšem při jejich namapování na jakýkoli povrch, který není kolmý na některou ze souřadných os, se objeví nežádoucí prostorové zkreslení těchto textur – viz druhý obrázek. Současná verze POV-Raye dává svým uživatelům k dispozici sedm základních typů warpingu textur, přičemž jednu texturu je možné podrobit libovolnému počtu warpingů (zde ovšem záleží na jejich pořadí, podobně jako u lineárních transformací). Každý typ je představován jedním klíčovým slovem uvedeným v uzlu warp (za nímž ve většině případů následují parametry warpingu), který sám je většinou součástí nadřazeného uzlu pattern, jehož význam jsme si již vysvětlili v předchozích částech tohoto seriálu.

povray3902

Obrázek 2: Nežádoucí zkreslení procedurální textury „bricks“ při jejím namapování na kulová či válcovitá tělesa. Největší problémy dělá nanášení této textury na kouli, protože – jak říkají počítačoví grafici – „kouli nelze učesat“.

2. Podporované typy warpingu textur

V současnosti, tj. v POV-Rayi 3.1, je možné použít následující typy warpingu procedurálních textur:

  1. repeat – část vzorku vytvořeného procedurální texturou se může opakovat, a to v libovolném směru (jedná se o zobecněnou variantu textury checker a tiles). Při opakování je možné také vzorek převracet okolo libovolné osy. Použití tohoto typu warpingu bude ukázáno v dnešním prvním demonstračním příkladu.
  2. black_hole – 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í (i při teoretickém „vypařování“ černé díry vlastně vidíme pouze její okolí). Praktické použití tohoto typu warpingu si ukážeme ve třetím demonstračním příkladu.
  3. turbulence – specifikace turbulence (prostorové šumové funkce) aplikované na vytvářený vzorek. Oproti nám již známému klíčovému slovu turbulence se tento typ warpingu odlišuje v tom, že je možné přesně specifikovat, ve které chvíli (před lineární transformací, po ní, v průběhu nelineárního zkreslení atd.) je turbulence aplikována.
  4. spherical – zborcení prostoru textury tak, aby ji šlo jednoduše namapovat na kouli. Tento typ warpingu si ukážeme ve druhém demonstračním příkladu.
  5. cylindrical – zborcení prostoru textury tak, aby ji šlo jednoduše namapovat na válec. I tento typ warpingu bude prakticky ukázán ve druhém demonstračním příkladu.
  6. toroidal – zborcení prostoru textury tak, aby ji šlo jednoduše namapovat na torus.
  7. planar – v podstatě se jedná o vyříznutí roviny z původně objemové textury (orientace roviny je libovolná) a rozšíření tohoto řezu do nekonečna.
povray3903

Obrázek 3: Nežádoucí zkreslení procedurální textury „hexagon“ při jejím namapování na kulová či válcovitá tělesa.

3. První demonstrační příklad – zeď vytvořená z nepravidelných ka­menů

V dnešním prvním demonstračním příkladu je ukázána tvorba procedurální textury, kterou je možné použít například při modelování zdi postavené z kamenů či cihel. Celá textura je ve skutečnosti složena ze dvou vrstev. V podkladové vrstvě jsou vytvořeny jednotlivé cihly či kameny (současně stejná procedurální textura slouží k modulaci normálových vektorů plochy, neboli k bump mappingu), horní vrstva pak obsahuje jemnější vzorek tvořený pomocí nám již známé procedurální textury granite. Nás však nyní zajímá textura tvořící spodní vrstvu. Ta je vytvořena pomocí makra, ve kterém se skládají dvě funkce. První funkce představuje jednotlivé vrstvy cihel či kamenů, druhá funkce pak jednotlivé kameny v řadě. Právě zde se uplatňuje opakování vzorku zabezpečené warpingem typu repeat. Aby všechny kameny/cihly nebyly stejně široké (což by nemuselo působit přirozeným dojmem), je při výpočtu aplikována turbulence, ovšem pouze ve směru horizontální osy. Makro pro vytvoření podkladové procedurální textury má čtyři parametry, pomocí nichž se dá vzorek zdi podstatným způsobem ovlivnit:

  • T (thickness) – šířka malty mezi kameny/cihlami (0 – 1)
  • S (scaling)  – měřítko kamenů/cihel ve směru x-ové osy
  • V (variation) – míra náhodnosti délky kamenů/cihel (0 – pravidelné šířky, 1 – 100%). Viz čtvrtý obrázek, kde se postupně míra náhodnosti zvyšuje zleva doprava.
  • R (roudness)  – míra „kulatosti“ rohů kamenů/cihel (0,01 – téměř pravoúhlé, 1,00 – zakulacené). Na čtvrtém obrázku se míra kulatosti zvyšuje od horní řady směrem k řadě spodní.
povray3904

Obrázek 4: Screenshot prvního demonstračního příkladu. Na obrázku se postupně mění dva parametry: míra náhodnosti šířky cihel/kamenů ve směru horizontální osy a také zakulacení jejich rohů.

Zdrojový kód prvního demonstračního příkladu má tvar:

// ------------------------------------------------------------
// První demonstrační příklad - ukázka použití procedurální
// textury zadané matematickým výrazem. Textura je ovlivněna
// modifikátorem "warp".
//
// rendering lze spustit příkazem:
//     povray +W1024 +H1024 +B100 +FN +D +Ipriklad1.pov +Opriklad1.png
//
// !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.1                            // používají se nové vlastnosti z verze 3.1

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

#include "colors.inc"                   // obsahuje definice mnoha barev

camera                                  // nastavení kamery
{
    orthographic                        // bez perspektivy, ta by plošný
                                        // obrázek zkreslila
    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 světelného zdroje
    color White                         // barva světelného zdroje
}

#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;                         // z-ová souřadnice těles

#declare COLMAP1 = color_map            // druhá barvová mapa
{                                       // použitá pro podkladový vzorek
    [0.0  color Gray]                   // hodnota 0 je dolní mezí,
                                        // pro kterou lze specifikovat barvu
    [1.0  color White]                  // hodnota 1 je naopak horní mezí
}

#declare COLMAP2 = color_map            // druhá barvová mapa pro horní vzorek
{                                       // všimněte si čtvrté složky barvy - průhlednosti
    [0.0  color rgbt<0,0,0,0.7>]        // hodnota 0 je dolní mezí,
                                        // pro kterou lze specifikovat barvu
    [1.0  color rgbt<1,1,1,0.7>]        // hodnota 1 je naopak horní mezí
}

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

// Makro pro vytvoření procedurální textury, která připomíná cihlovou či kamennou
// zeď. Tvar cihel/kamenů, z nichž je zeď složena, lze ovlivnit čtyřmi parametry:
// 1) T (thickness) - šířka malty mezi kameny/cihlami (0 - 1)
// 2) S (scaling)   - měřítko kamenů/cihel ve směru x-ové osy
// 3) V (variation) - míra náhodnosti délky kamenů/cihel (0 - pravidelné šířky, 1 - 100 %)
// 4) R (roudness)  - míra "kulatosti" rohů kamenů/cihel (0,01 - téměř pravoúhlé, 1,00 - zakulacené)
#macro Irregular_Bricks_Ptrn (T, S, V, R)
    #local FunctionXGrad =
    function
    {
        pattern                         // definice vzorku ve vertikálním směru
        {
            gradient x triangle_wave
            warp                        // náhodnost v délce kamenů
            {
                turbulence V*x octaves 1
            }
            warp                        // způsob mapování textury
            {
                planar z 0
            }
            warp                        // kameny se opakují
            {
                repeat z offset< 0.5, 5, 0>
            }
            rotate -90*x
        }
    }
    #local FunctionYGrad =
    function
    {
        pattern                         // definice vzorku ve směru horizontálním
        {                               // zde je vše pravidelné
            gradient y triangle_wave
            translate 0.5*y
        }
    }
    function                            // kompozice obou funkcí vede
    {                                   // k vytvoření kýženého vzorku textury
        pow
        (1-min(1,
            (
                +pow(FunctionXGrad(x/S,y,z)*(1+T/S),1/R*2)
                +pow(FunctionYGrad(x/S,y,z)*(1+T  ),1/R*2)
            )
        ),R/2)
    }
#end

// devět objektů potažených procedurální texturou
// textury se od sebe odlišují ve dvou parametrech:
//     - zakulacení
//     - mírou náhodnosti šířky jednotlivých "cihel"
object
{
    OBJECT
    texture
    {
        pigment
        {
            Irregular_Bricks_Ptrn (0.1, 1, 0.0, 0.01)
            color_map
            {
                COLMAP1
            }
        }
        normal
        {
            Irregular_Bricks_Ptrn (0.1, 1, 0.0, 0.01) 2
        }
    }
    texture
    {
        pigment
        {
            granite
            color_map
            {
                COLMAP2
            }
        }
    }
    translate <COL1, ROW1, Z>
}


object
{
    OBJECT
    texture
    {
        pigment
        {
            Irregular_Bricks_Ptrn (0.1, 1, 0.5, 0.01)
            color_map
            {
                COLMAP1
            }
        }
        normal
        {
            Irregular_Bricks_Ptrn (0.1, 1, 0.5, 0.01) 2
        }
    }
    texture
    {
        pigment
        {
            granite
            color_map
            {
                COLMAP2
            }
        }
    }
    translate <COL2, ROW1, Z>
}

object
{
    OBJECT
    texture
    {
        pigment
        {
            Irregular_Bricks_Ptrn (0.1, 1, 1.0, 0.01)
            color_map
            {
                COLMAP1
            }
        }
        normal
        {
            Irregular_Bricks_Ptrn (0.1, 1, 1.0, 0.01) 2
        }
    }
    texture
    {
        pigment
        {
            granite
            color_map
            {
                COLMAP2
            }
        }
    }
    translate <COL3, ROW1, Z>
}

object
{
    OBJECT
    texture
    {
        pigment
        {
            Irregular_Bricks_Ptrn (0.1, 1, 0.0, 0.5)
            color_map
            {
                COLMAP1
            }
        }
        normal
        {
            Irregular_Bricks_Ptrn (0.1, 1, 0.0, 0.5) 2
        }
    }
    texture
    {
        pigment
        {
            granite
            color_map
            {
                COLMAP2
            }
        }
    }
    translate <COL1, ROW2, Z>
}

object
{
    OBJECT
    texture
    {
        pigment
        {
            Irregular_Bricks_Ptrn (0.1, 1, 0.5, 0.5)
            color_map
            {
                COLMAP1
            }
        }
        normal
        {
            Irregular_Bricks_Ptrn (0.1, 1, 0.5, 0.5) 2
        }
    }
    texture
    {
        pigment
        {
            granite
            color_map
            {
                COLMAP2
            }
        }
    }
    translate <COL2, ROW2, Z>
}

object
{
    OBJECT
    texture
    {
        pigment
        {
            Irregular_Bricks_Ptrn (0.1, 1, 1.0, 0.5)
            color_map
            {
                COLMAP1
            }
        }
        normal
        {
            Irregular_Bricks_Ptrn (0.1, 1, 1.0, 0.5) 2
        }
    }
    texture
    {
        pigment
        {
            granite
            color_map
            {
                COLMAP2
            }
        }
    }
    translate <COL3, ROW2, Z>
}

object
{
    OBJECT
    texture
    {
        pigment
        {
            Irregular_Bricks_Ptrn (0.1, 1, 0.0, 1.0)
            color_map
            {
                COLMAP1
            }
        }
        normal
        {
            Irregular_Bricks_Ptrn (0.1, 1, 0.0, 1.0) 2
        }
    }
    texture
    {
        pigment
        {
            granite
            color_map
            {
                COLMAP2
            }
        }
    }
    translate <COL1, ROW3, Z>
}

object
{
    OBJECT
    texture
    {
        pigment
        {
            Irregular_Bricks_Ptrn (0.1, 1, 0.5, 1.0)
            color_map
            {
                COLMAP1
            }
        }
        normal
        {
            Irregular_Bricks_Ptrn (0.1, 1, 0.5, 1.0) 2
        }
    }
    texture
    {
        pigment
        {
            granite
            color_map
            {
                COLMAP2
            }
        }
    }
    translate <COL2, ROW3, Z>
}

object
{
    OBJECT
    texture
    {
        pigment
        {
            Irregular_Bricks_Ptrn (0.1, 1, 1.0, 1.0)
            color_map
            {
                COLMAP1
            }
        }
        normal
        {
            Irregular_Bricks_Ptrn (0.1, 1, 1.0, 1.0) 2
        }
    }
    texture
    {
        pigment
        {
            granite
            color_map
            {
                COLMAP2
            }
        }
    }
    translate <COL3, ROW3, Z>
}

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

4. Nelineární zkreslení procedurálních textur (mapování)

Některé procedurální textury, například již v první kapitole zmíněné textury checker, hexagon, brick, mandel, julia, ale i leopard, jsou založené na matematických funkcích, které produkují barevný vzorek, jenž je nezkreslený pouze v případě, že se na něj díváme ve směru rovnoběžném se směrem jedné ze souřadných os. Typickým příkladem může být textura hexagon. Šestiúhelníky v této textuře tvoří základny nekonečně dlouhých hranolů, jejichž osa je rovnoběžná s osou y (šestiúhelníky tedy leží v jakékoli rovině rovnoběžné s rovinou x-z). Pokud je tato textura (či jakákoli jiná uvedená procedurální textura) nanesena na povrch koule, válce, torusu či nějaké složitější implicitní plochy, dochází k nežádoucím vizuálním chybám (artefaktům).

povray3905

Obrázek 5: Procedurální textury založené na fraktálech vytváří při mapování na kulatá či válcová tělesa stejné artefakty, jako výše uvedené textury bricks a hexagon. Díky členitosti těchto textur však artefakty nemusí být na první pohled patrné.

Těmto chybám je možné předejít, či je alespoň minimalizovat, použitím warpingu textur. Jedná se o nelineární transformace prostoru textury, tedy prostoru, ve kterém se prostorové souřadnice (x,y,z) mapují na barvu. Transformace jsou zvolené tak, aby bylo možné procedurální texturu nanést na kouli, válec či torus (toroid, anuloid). Při nanášení na tělesa odlišného (složitějšího) tvaru se musí zvolit nejbližší „základní“ tvar či nanášení provádět po částech.

povray3906

Obrázek 6: POV-Ray dokáže nanést původně plošné rastrové obrázky na objekty různých tvarů; zde se jedná o screenshot z demonstračního příkladu, jehož výpis byl uveden ve dvacáté části tohoto seriálu.

5. Druhý demonstrační příklad – procedurální textura hexagon mapovaná na kouli a válec

V dnešním druhém demonstračním příkladu je ukázána užitečnost warpingu procedurálních textur při jejich nanášení na povrch koule a válce. Na sedmém obrázku je ukázáno, jakým způsobem je nanesena již několikrát zmíněná textura typu hexagon na kouli a válec bez použití warpingu. Obě tělesa vypadají tak, jako by byly vyřezány z materiálu tvořeného nekonečně dlouhými šestiúhelníkovými kvádry tří barev. Ani při natočení textury pomocí lineární transformace rotate by se situace nijak zvlášť nezlepšila, artefakty by byly stále viditelné.

povray3907

Obrázek 7: Textura typu hexagon namapovaná přímo na kouli a válec bez použití warpingu. Ze vzorku na obou tělesech je patrné, že tato procedurální textura je skutečně tvořena nekonečně dlouhými šestiúhelníkovými kvádry.

Na osmém obrázku je ukázáno, jak se ta samá scéna změní v případě, že je použit warping textur. Ve zdrojovém kódu druhého demonstračního příkladu se nachází deklarovaná proměnná nazvaná USE_WARPING, která může nabývat hodnoty true či false. Změnou této proměnné se zapíná či vypíná mapování procedurální textury na kouli a válec – jak obrázek 7, tak i obrázek 8 je tedy vytvořen z jedné zdrojové scény. Povšimněte si, že při zadání warpingu je nutné specifikovat i tvar neviditelných těles, na které se textura nanáší. U koule je to její poloměr a orientace osy, u válce se jedná o tytéž hodnoty.

povray3908

Obrázek 8: S využitím warpingu textur se situace zlepšila. U válce je mapování zcela korektní (samozřejmě ne na jeho podstavách, i to je však řešitelné). U koule se artefakty alespoň zmenšily, výjimku tvoří oba její póly.

Zdrojový tvar druhého demonstračního příkladu má tvar:

// ------------------------------------------------------------
// Druhý demonstrační příklad - ukázka warpingu procedurálních
// textur za účelem jejich namapování na kulové a válcové těleso.
//
// rendering lze spustit příkazem:
//     povray +W1024 +H768 +B100 +FN +D +Ipriklad2.pov +Opriklad2.png
// ------------------------------------------------------------

#version 3.0

global_settings
{
    assumed_gamma 2.2
}

#declare USE_WARPING = true;             // povolení či zákaz warpingu textur

#include "colors.inc"

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

light_source
{                                        // světelný zdroj
    <-20, 70, -50>                       // pozice zdroje
    color White                          // barva zdroje
}

// koule
sphere
{
    <0, 0, 0>, 1                         // pozice středu a poloměr
    texture
    {
        pigment
        {
            hexagon
            scale 0.1
            #if (USE_WARPING)            // pokud je warping povolený
                warp                     // provést mapování textury na kouli
                {
                    spherical
                    orientation y+z      // orientace při mapování
                    dist_exp 1           // poloměr neviditelné koule, na kterou se mapuje
                }
                scale 0.5
            #end
        }
        finish
        {
            phong 1.0
        }
    }
    scale     10                         // lineární transformace aplikovaná na objekt
    rotate    -90*y
    translate <-12, 0, 20>
}

cylinder
{
    -y, y, 1
    texture
    {
        pigment
        {
            hexagon
            scale 0.1
            #if (USE_WARPING)            // pokud je warping povolený
                warp                     // provést mapování textury na válec
                {
                    cylindrical
                    orientation y        // orientace neviditelného válce
                    dist_exp 1           // a jeho poloměr
                }
                scale <0.5,3.0,0.5>
            #end
        }
        finish
        {
            phong 1.0
        }
    }
    scale     10                         // lineární transformace aplikovaná na objekt
    rotate    <-20, 0, 0>
    translate <12, 0, 20>
}

// kvádr, do kterého je celá scéna uzavřena
box
{
    <-60,-20,-80>, <60, 80, 80>
    texture
    {
        pigment
        {                                // šachovnicová textura
            checker
            color <0.1, 0.3, 0.4>,
            color <0.2, 0.5, 0.7>
            scale 10
        }
        finish
        {                                // odlesky a odrazy na povrchu
            diffuse 0.7
            reflection 0.2
        }
    }
}

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

6. Nelineární zkreslení typu „black_hole“

Dalším typem nelineárního zkreslení procedurálních textur (warpingu), který je možné v POV-Rayi využít, je takzvaná č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 její velké síle se v textuře objevuje jednobarevný kruh. To, zda má černá díra body přitahovat či naopak odpuzovat, se řídí atributem inverse.

povray3909

Obrázek 9: Scéna vykreslená pomocí třetího demonstračního příkladu. Síla nelineární transformace „black_hole“ byla nastavena na hodnotu 1.

7. Třetí demonstrační příklad – procedurální textura „marble“ a nelineární zkreslení

Efekt působení černé díry na procedurální texturu můžeme prozkoumat po vykreslení dnešního třetího demonstračního příkladu. Ve scéně se nachází devět kvádrů, z nichž je viditelná pouze jedna strana. Na všechny kvádry je nanesena již dříve popsaná (a mezi POV-Rayisty oblíbená) procedurální textura „marble“. V horizontálním směru se od sebe jednotlivé textury odlišují tím, že se mění míra turbulence (šumové funkce), která ovlivňuje rozmístění pigmentu v textuře. Dále se textury odlišují působením objektu černé díry. Pro kvádry zobrazené na prvním řádku není černá díra použita, tj. textura se vykreslila bez zkreslení. Na druhém řádku je do prostoru textury vložena černá díra, která přitahuje body ve svém okolí a na řádku posledním pak černá díra, které body naopak odpuzuje. Efekt působení černé díry se v tomto příkladu dá ovlivnit také hodnotou deklarované proměnné BLACK_HOLE_STREN­GTH.

povray3910

Obrázek 10: Scéna vykreslená pomocí třetího demonstračního příkladu. Síla nelineární transformace „black_hole“ byla nastavena na hodnotu 2.

Následuje výpis zdrojového kódu třetího demonstračního příkladu:

// ------------------------------------------------------------
// Třetí demonstrační příklad - ukázka použití procedurální
// textury zadané libovolnou funkcí, která je zkreslena pomocí
// warpingu typu "black_hole".
//
// rendering lze spustit příkazem:
//     povray +W1024 +H1024 +B100 +FN +D +Ipriklad3.pov +Opriklad3.png
//
// !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 = 2;

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

// devět objektů potažených procedurální texturou, která je zkreslena
// warpingem typu "black_hole" (první řada je nezkreslená, další dvě již ano)
object
{
    OBJECT
    texture
    {
        pigment
        {
            marble
            turbulence 0.0
            color_map
            {
                COLMAP1
            }
        }
    }
    translate <COL1, ROW1, Z>
}


object
{
    OBJECT
    texture
    {
        pigment
        {
            marble
            turbulence 0.5
            color_map
            {
                COLMAP1
            }
        }
    }
    translate <COL2, ROW1, Z>
}

object
{
    OBJECT
    texture
    {
        pigment
        {
            marble
            turbulence 1.0
            color_map
            {
                COLMAP1
            }
        }
    }
    translate <COL3, ROW1, Z>
}

object
{
    OBJECT
    texture
    {
        pigment
        {
            marble
            turbulence 0.0
            color_map
            {
                COLMAP1
            }
            warp
            {
                black_hole <0.0, 0.0, 0>, 1.5 // souřadnice a poloměr
                strength BLACK_HOLE_STRENGTH  // gravitační síla
            }
        }
    }
    translate <COL1, ROW2, Z>
}


object
{
    OBJECT
    texture
    {
        pigment
        {
            marble
            turbulence 0.5
            color_map
            {
                COLMAP1
            }
            warp
            {
                black_hole <0.0, 0.0, 0>, 1.5 // souřadnice a poloměr
                strength BLACK_HOLE_STRENGTH  // gravitační síla
            }
        }
    }
    translate <COL2, ROW2, Z>
}

object
{
    OBJECT
    texture
    {
        pigment
        {
            marble
            turbulence 1.0
            color_map
            {
                COLMAP1
            }
            warp
            {
                black_hole <0.0, 0.0, 0>, 1.5 // souřadnice a poloměr
                strength BLACK_HOLE_STRENGTH  // gravitační síla
            }
        }
    }
    translate <COL3, ROW2, Z>
}

object
{
    OBJECT
    texture
    {
        pigment
        {
            marble
            turbulence 0.0
            color_map
            {
                COLMAP1
            }
            warp
            {
                black_hole <0.0, 0.0, 0>, 1.5 // souřadnice a poloměr
                strength BLACK_HOLE_STRENGTH  // gravitační síla
                inverse                       // odpuzování
            }
        }
    }
    translate <COL1, ROW3, Z>
}

object
{
    OBJECT
    texture
    {
        pigment
        {
            marble
            turbulence 0.5
            color_map
            {
                COLMAP1
            }
            warp
            {
                black_hole <0.0, 0.0, 0>, 1.5 // souřadnice a poloměr
                strength BLACK_HOLE_STRENGTH  // gravitační síla
                inverse                       // odpuzování
            }
        }
    }
    translate <COL2, ROW3, Z>
}

object
{
    OBJECT
    texture
    {
        pigment
        {
            marble
            turbulence 1.0
            color_map
            {
                COLMAP1
            }
            warp
            {
                black_hole <0.0, 0.0, 0>, 1.5 // souřadnice a poloměr
                strength BLACK_HOLE_STRENGTH  // gravitační síla
                inverse                       // odpuzování
            }
        }
    }
    translate <COL3, ROW3, Z>
}

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray3911

Obrázek 11: Scéna vykreslená pomocí třetího demonstračního příkladu. Síla nelineární transformace „black_hole“ byla nastavena na hodnotu 3.

ict ve školství 24

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

I v následující části seriálu o raytraceru POV-Ray se budeme zabývat warpingem textur, především při vytváření přirozeně působících povrchů, například dřeva nebo betonu. Také si ukážeme další pokročilé modelovací techniky, například to, jakým způsobem je možné ovlivnit způsob odrazu světla od povrchů těles, na nichž se nachází tenká vrstva jiného materiálu. Tuto techniku lze využít tehdy, když potřebujeme vykreslit olejovou skvrnu na vodě či povrch kompaktního disku.

povray3912

Obrázek 12: Suky v procedurální textuře připomínající dřevo byly vytvořeny také pomocí nelineární transformace „black_hole“. Demonstrační příklad, pomocí něhož byl tento obrázek vytvořen, si ukážeme příště.

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.