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.
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.
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:
- 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.
- 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.
- 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.
- 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.
- 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.
- toroidal – zborcení prostoru textury tak, aby ji šlo jednoduše namapovat na torus.
- 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.
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 kamenů
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í.
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).
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.
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é.
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.
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.
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_STRENGTH.
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
// ------------------------------------------------------------
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.
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.
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ě.