Obsah
1. Tvorba pokročilejších animací v POV-Rayi
2. První demonstrační příklad – změna souřadnic prvků kostry implicitní plochy
3. Druhý demonstrační příklad – modifikace parametrů superelipsoidu
4. Třetí demonstrační příklad – změna koeficientů kvadrik
5. Deklarace proměnných v POV-Rayi
6. Použití programové smyčky typu „while“
7. Čtvrtý demonstrační příklad – tvorba a animace tělesa s využitím smyčky „while“
8. Obsah následující části seriálu
1. Tvorba pokročilejších animací v POV-Rayi
V předchozí části tohoto seriálu jsme si jak teoreticky, tak i na několika demonstračních příkladech ukázali, jakým způsobem je možné v raytraceru POV-Ray vytvářet jednoduché animace bez nutnosti použití externího modelovacího či animačního programu. Při ruční či poloautomatické tvorbě animací lze popis scény generovat buď pomocí vhodně napsaného skriptu (což je sice složité, zato však takřka univerzální řešení), nebo je možné využít interní proměnnou nazvanou příznačně clock, jejíž hodnotu lze nastavit buď při volání raytraceru z příkazové řádky nebo (po volbě vhodných parametrů vypsaných níže) se o změnu hodnoty této proměnné v každém snímku animace postará samotný POV-Ray.
Obrázek 1: Počáteční snímek animace vytvořené pomocí prvního demonstračního příkladu
Implicitně je v prvním snímku animace obsah proměnné clock nulový a v posledním snímku obsahuje hodnotu 1,0 bez ohledu na celkový počet snímků v animaci (animace však musí obsahovat alespoň dva snímky). Pro připomenutí si uveďme, jaké parametry zadávané z příkazové řádky ovlivňují automatickou tvorbu animací:
Parametr | Význam parametru |
---|---|
+KFIn | první snímek animace bude mít číslo n |
+KFFn | poslední snímek animace bude mít číslo n |
+KIn.n | hodnota clock na prvním snímku animace bude nastavena na n.n |
+KFn.n | hodnota clock na posledním snímku animace bude nastavena na n.n |
Obrázek 2: Snímek z animace vytvořené pomocí prvního demonstračního příkladu, která se nachází ve své první třetině
V následujících kapitolách si na několika demonstračních příkladech ukážeme další možnosti vytváření animací. Využijeme přitom faktu, že interní proměnnou clock lze použít prakticky v jakémkoli parametru téměř libovolného objektu, ve kterém se může vyskytovat celočíselná či reálná hodnota. Také je možné konstruovat složitější matematické výrazy s proměnnou clock a v případě, že by ani tento poměrně silný aparát pro některé animace nedostačoval, lze využít i toho, že popis scény je zapisován nikoli v pouhém strukturovaném souborovém formátu, ale pomocí plnohodnotného programovacího jazyka obsahujícího možnosti tvorby maker, funkcí, podmínky (především řídicí příkazy typu if–then–else) i programové smyčky.
Obrázek 3: Snímek z animace vytvořené pomocí prvního demonstračního příkladu, která se nachází ve své druhé třetině
Pro velmi složité animace, které vznikají například jako výsledek fyzikálních aj. simulací, se tvoří ucelenější a současně i obecnější frameworky, jejichž příkladem může být již v tomto seriálu zmíněný Rune's Particle System.
Obrázek 4: Snímek animace vytvořené pomocí prvního demonstračního příkladu
2. První demonstrační příklad – změna souřadnic prvků kostry implicitní plochy
V dnešním prvním demonstračním příkladu je ukázáno, jakým způsobem je možné v průběhu animace měnit souřadnice jednoho z prvků kostry implicitní plochy. Ve scéně je vytvořena implicitní plocha specifikovaná pomocí tří úsečkových prvků kostry (ty by při samostatném vykreslení měly tvar válce s polokoulemi na koncích) a jednoho bodového prvku (ten má při samostatném vykreslení tvar koule). Střed bodového prvku kostry se v jednotlivých snímcích animace mění, konkrétně je modifikována jeho x-ová souřadnice, jejíž hodnoty mají rozsah od –2 do 2.
Obrázek 5: Nepatrnou úpravou zdrojového kódu prvního demonstračního příkladu lze dosáhnout toho, že každý prvek kostry implicitní plochy bude mít na svém povrchu nanesenou odlišnou texturu
Aby byl „rozjezd“ i „zpomalení“ bodového prvku kostry plynulý, je pro výpočet x-ové souřadnice zvolena funkce 2sin(radians(clock360)), ve které se mj. provádí i přepočet stupňů na radiány. Ve skutečnosti by samozřejmě nebylo nutné tento přepočet provádět, protože proměnnou clock lze přímo vynásobit hodnotou 2Π, ovšem výše zmíněný zápis je na jednu stranu přehlednější (alespoň pro uživatele navyklého na používání stupňů), na stranu druhou není nutné v programu používat hodnotu Π. Výsledná animace zpracovaná do formátu MPEG-1 je dostupná pod tímto odkazem.
Zdrojový kód prvního demonstračního příkladu má tvar:
// ------------------------------------------------------------
// První demonstrační příklad.
//
// Jednoduchá scéna s jednou implicitní plochou vymodelovanou
// pomocí čtyř prvků kostry - jednoho bodového prvku kostry a
// tří úsečkových prvků kostry. Každému prvku kostry je přiřazen
// jiný materiál povrchu. Bodový prvek kostry je navíc posouván
// na základě hodnoty interní proměnné "clock"
//
// rendering lze spustit příkazem:
// povray +W800 +H600 +B100 +FN +D +Iblobs.pov +Oblobs.png
// (pro náhled postačí zadat pouze příkaz povray blobs.pov)
//
// animaci lze vytvořit přidáním parametru:
// +KFFpočet_snímků
//
// popř. je možné zvolit konkrétní hodnotu proměnné clock:
// +Kn.n
// ------------------------------------------------------------
// globální nastavení parametrů scény
global_settings
{
assumed_gamma 2.2
max_trace_level 5
}
// načtení všech potřebných externích souborů
#include "colors.inc"
#include "woods.inc"
#include "glass.inc"
// nastavení kamery (pozorovatele)
camera
{
location <1.65, 5.5, -5.0> // pozice kamery
up <0.0, 1.0, 0.0> // vektor směřující vzhůru
right <4/3, 0.0, 0.0> // vektor směřující doprava
look_at <0.5, 1.8, -1.0> // bod, na který kamera směřuje
}
// tři světelné zdroje
light_source
{
<-30, 11, 20> // pozice světelného zdroje
color White // barva světla
}
light_source {
< 31, 12, -20> // pozice světelného zdroje
color White // barva světla
}
light_source
{
< 32, 11, -20> // pozice světelného zdroje
color LightGray // barva světla
}
#declare X = 2.0*sin(radians(clock*360));// výpočet souřadnice bodového prvku kostry
// první objekt ležící ve scéně - implicitní plocha
blob
{
threshold 0.5
sphere
{ // bodový (kulový) prvek kostry
<X, 0, 0>, // souřadnice středu - prvek je při animaci posouván
1.0, // poloměr
2.0 // síla (intenzita)
texture
{ // textura - povrch části implicitní plochy
T_Glass1 // definováno v externím souboru
pigment
{
color green 1.00 filter 0.85 // barva povrchu
}
finish
{ // optické vlastnosti materiálu
phong 1 // velikost a síla odlesků
phong_size 300
reflection 0.15 // odrazivost
}
}
}
cylinder
{ // úsečkový (válcový) prvek kostry
<-2, 0, 0>, // střed první podstavy
< 2, 0, 0>, // střed druhé podstavy
0.5, // poloměr
1.0 // síla
}
cylinder
{ // úsečkový (válcový) prvek kostry
<0, 0, -2>,
<0, 0, 2>,
0.5,
1.0
texture
{ // textura - povrch části implicitní plochy
T_Glass1 // definováno v externím souboru
pigment
{
color red 0.90 green 0.90 filter 0.85 // barva povrchu
}
finish
{ // optické vlastnosti materiálu
phong 1 // velikost a síla odlesků
phong_size 300
reflection 0.15 // odrazivost
}
}
}
cylinder
{ // úsečkový (válcový) prvek kostry
<0, -2, 0>,
<0, 2, 0>,
0.5,
1.0
texture
{ // textura - povrch části implicitní plochy
T_Glass1 // definováno v externím souboru
pigment
{
color red 0.90 filter 0.85 // barva povrchu
}
finish
{ // optické vlastnosti materiálu
phong 1 // velikost a síla odlesků
phong_size 300
reflection 0.15 // odrazivost
}
}
}
interior
{ // vlastnosti "vnitřku" části implicitní plochy
caustics 1.0
ior 1.5
}
texture
{ // textura - povrch části implicitní plochy
T_Glass1 // definováno v externím souboru
pigment
{
color blue 0.90 filter 0.85 // barva povrchu
}
finish
{ // optické vlastnosti materiálu
phong 1 // velikost a síla odlesků
phong_size 300
reflection 0.15 // odrazivost
}
}
rotate <15,15,0>
scale 1.8
}
// druhý objekt - nekonečná rovina
plane
{
y, // orientace roviny
-2.5 // vzdálenost od počátku
texture
{ // textura - vlastnosti povrchu
T_Wood10 // definováno v externím souboru
finish
{ // optické vlastnosti materiálu
reflection 0.10
}
}
}
// ------------------------------------------------------------
// finito
// ------------------------------------------------------------
3. Druhý demonstrační příklad – modifikace parametrů superelipsoidu
V páté části tohoto seriálu jsme si popsali základní geometrické vlastnosti superelipsoidů včetně toho, jakým způsobem lze tyto zajímavé objekty používat ve scénách vykreslovaných POV-Rayem. Ve stručnosti (a bez dalšího opakování parametrického či implicitního tvaru rovnic popisujících superelipsoid) je možné říci, že tvar superelipsoidu je možné měnit pomocí dvou parametrů (reálných čísel).
Obrázek 6: První snímek animace vytvořené pomocí druhého demonstračního příkladu
První parametr slouží ke změně tvaru objektu v rovině x-y, druhý parametr pak ovlivňuje tvar řezu rovinou x-z či y-z. Pomocí druhého demonstračního příkladu je vytvořena animace, ve které pro horní polovinu těles dochází k postupné změně prvního parametru superelipsoidu, zatímco druhý parametr zůstává konstantní (ovšem každý z vykreslených objektů má druhý parametr nastavený na odlišnou hodnotu, což se samozřejmě projevuje na tvaru těchto objektů). U těles, které se nachází ve spodní polovině scény, je situace opačná – první parametru superelipsoidu je konstantní, zatímco parametr druhý se v rámci animace mění.
Obrázek 7: Prostřední snímek animace vytvořené pomocí druhého demonstračního příkladu
Výslednou animaci vzniklou vykreslením sta snímků si můžete prohlédnout zde.
Obrázek 8: Další snímek animace vytvořené pomocí druhého demonstračního příkladu
Následuje výpis zdrojového kódu druhého demonstračního příkladu:
// ------------------------------------------------------------
// Druhý demonstrační příklad.
//
// Několik animovaných superelipsoidů.
//
// rendering jednoho snímku animace lze spustit příkazem:
// povray +W800 +H600 +B100 +FN +D +Isuper2.pov +Osuper2.png
// (pro náhled postačí zadat povray super2.pov)
//
// animaci lze vytvořit přidáním parametru:
// +KFFpočet_snímků
//
// popř. je možné zvolit konkrétní hodnotu proměnné clock:
// +Kn.n
// ------------------------------------------------------------
// globální nastavení parametrů scény
global_settings
{
assumed_gamma 2.2
}
camera
{
orthographic // vypnutí perspektivního zkreslení
location <0, 0, -10> // umístění kamery
right 4/3 * x * 20 // vektor směřující doprava
up y * 20 // a nahoru
look_at <0, 0, 0> // bod, na který se kamera zaměřila
}
light_source
{ // první světelný zdroj
<50, 50, -100> // pozice světelného zdroje
color red 0.7 green 0.7 blue 0.7 // barva světelného zdroje
}
light_source
{ // druhý světelný zdroj
<0, 0, -10000> // pozice světelného zdroje
color red 0.7 green 0.7 blue 0.7 // barva světelného zdroje
shadowless
}
plane
{ // rovina tvořící pozadí scény
<0, 0, 1>, 3 // posun a orientace roviny
hollow on
pigment
{ // procedurální textura
agate
agate_turb 0.3
}
finish
{ // optické vlastnosti materiálu povrchu
ambient 0.1
diffuse 0.4
}
}
// pozice jednotlivých objektů ve scéně
#declare Row1 = +8;
#declare Row2 = +3;
#declare Row3 = 0;
#declare Row4 = -3;
#declare Row5 = -8;
#declare Col1 = -10;
#declare Col2 = -5;
#declare Col3 = 0;
#declare Col4 = +5;
#declare Col5 = +10;
// textura prvních deseti objektů
#declare Tex1 =
texture
{
pigment
{
color red 1 green 0 blue 0
}
finish
{
ambient 0.2 diffuse 0.4 phong 0.5 phong_size 5
}
}
// textura druhých deseti objektů
#declare Tex2 =
texture
{
pigment
{
color red 0 green 0 blue 1
}
finish
{
ambient 0.2 diffuse 0.4 phong 0.5 phong_size 5
}
}
// výpočet parametru použitého při specifikaci tvaru superelipsoidů
#declare A = 2.0 - 1.9*sin(radians(clock*360));
// následují jednotlivé superelipsoidy
// animace změny prvního parametru superelipsoidu
superellipsoid { <A, 0.1> scale 1.5 rotate <-15, 30, 0> translate <Col1, Row1, 0> texture { Tex1 } }
superellipsoid { <A, 0.2> scale 1.5 rotate <-15, 30, 0> translate <Col2, Row1, 0> texture { Tex1 } }
superellipsoid { <A, 0.3> scale 1.5 rotate <-15, 30, 0> translate <Col3, Row1, 0> texture { Tex1 } }
superellipsoid { <A, 0.8> scale 1.5 rotate <-15, 30, 0> translate <Col4, Row1, 0> texture { Tex1 } }
superellipsoid { <A, 1.0> scale 1.5 rotate <-15, 30, 0> translate <Col5, Row1, 0> texture { Tex1 } }
superellipsoid { <A, 1.5> scale 1.5 rotate <-15, 30, 0> translate <Col1, Row2, 0> texture { Tex1 } }
superellipsoid { <A, 2.0> scale 1.5 rotate <-15, 30, 0> translate <Col2, Row2, 0> texture { Tex1 } }
superellipsoid { <A, 2.5> scale 1.5 rotate <-15, 30, 0> translate <Col3, Row2, 0> texture { Tex1 } }
superellipsoid { <A, 3.0> scale 1.5 rotate <-15, 30, 0> translate <Col4, Row2, 0> texture { Tex1 } }
superellipsoid { <A, 4.0> scale 1.5 rotate <-15, 30, 0> translate <Col5, Row2, 0> texture { Tex1 } }
// animace změny druhého parametru superelipsoidu
superellipsoid { <0.1, A> scale 1.5 rotate <-15, 30, 0> translate <Col1, Row4, 0> texture { Tex2 } }
superellipsoid { <0.2, A> scale 1.5 rotate <-15, 30, 0> translate <Col2, Row4, 0> texture { Tex2 } }
superellipsoid { <0.3, A> scale 1.5 rotate <-15, 30, 0> translate <Col3, Row4, 0> texture { Tex2 } }
superellipsoid { <0.8, A> scale 1.5 rotate <-15, 30, 0> translate <Col4, Row4, 0> texture { Tex2 } }
superellipsoid { <1.0, A> scale 1.5 rotate <-15, 30, 0> translate <Col5, Row4, 0> texture { Tex2 } }
superellipsoid { <1.5, A> scale 1.5 rotate <-15, 30, 0> translate <Col1, Row5, 0> texture { Tex2 } }
superellipsoid { <2.0, A> scale 1.5 rotate <-15, 30, 0> translate <Col2, Row5, 0> texture { Tex2 } }
superellipsoid { <2.5, A> scale 1.5 rotate <-15, 30, 0> translate <Col3, Row5, 0> texture { Tex2 } }
superellipsoid { <3.0, A> scale 1.5 rotate <-15, 30, 0> translate <Col4, Row5, 0> texture { Tex2 } }
superellipsoid { <4.0, A> scale 1.5 rotate <-15, 30, 0> translate <Col5, Row5, 0> texture { Tex2 } }
// ------------------------------------------------------------
// finito
// ------------------------------------------------------------
Obrázek 9: Poslední snímek animace vytvořené pomocí druhého demonstračního příkladu
4. Třetí demonstrační příklad – změna koeficientů kvadrik
Dnešní třetí demonstrační příklad možná potěší milovníky geometrie. V průběhu animace dochází ke změně parametrů a tím i tvarů kvadrik, což jsou objekty, jejichž povrch je popsaný implicitní rovnicí představovanou polynomem (viz předchozí části tohoto seriálu). Parametry kvadrik, mezi něž se mj. řadí i koule, kužele, válce, elipsoidy či paraboloidy se v POV-Rayi zapisují pomocí trojice třísložkových vektorů a jednoho skaláru.
Obrázek 10: První snímek animace vytvořené pomocí třetího demonstračního příkladu
V tomto demonstračním příkladu je ukázána postupná metamorfóza mezi různými typy kvadrik, například přechod mezi paraboloidem, elipsoidem, koulí a válcem. Princip je jednoduchý – některé parametry kvadriky se postupně mění od nuly do jedné, jiné pak opačným směrem od hodnoty 1,0 do nuly.
Obrázek 11: Animace se nachází ve své první čtvrtině
Pod tímto odkazem je uložena výsledná animace metamorfózy kvadrik.
Obrázek 12: Animace se nachází ve své třetí čtvrtině
Výpis zdrojového kódu třetího demonstračního příkladu má tvar:
// ------------------------------------------------------------
// Třetí demonstrační příklad
//
// Animace tvořená změnou parametrů šesti kvadrik.
//
// rendering lze spustit příkazem:
// povray +W800 +H600 +B100 +FN +D +Iquadric1.pov +Oquadric.png
// (pro náhled postačí zadat povray quadric.pov)
//
// animaci lze vytvořit přidáním parametru:
// +KFFpočet_snímků
//
// popř. je možné zvolit konkrétní hodnotu proměnné clock:
// +Kn.n
// ------------------------------------------------------------
#version 3.1; // specifikace verze POV-Raye
// globální nastavení parametrů scény
global_settings
{
assumed_gamma 2.2
}
#include "colors.inc"
#include "woods.inc"
// makra použitá pro rozmístění kvadrik v prostoru
#declare Dist=-3;
#declare Row2= 3.5;
#declare Row1= -3.5;
#declare Col1= -7;
#declare Col2= 0;
#declare Col3= 7;
camera {
location <0, 0, -60> // umístiní kamery
direction <0, 0, 10> // směr pohledu kamery
look_at <0, 0, 0>
translate <0, 0,-110> // změna umístění kamery v prostoru
}
light_source
{
<1000, 1000, -2000> // pozice světelného zdroje
color White // barva světelného zdroje
}
plane
{ // rovina tvořící pozadí scény
<0, 0, 1>, 1.01 // posun a orientace roviny
hollow on
pigment
{ // procedurální textura
agate
agate_turb 0.3
}
finish
{ // optické vlastnosti materiálu povrchu
ambient 0.1
diffuse 0.4
}
}
#declare Solid=
texture
{ // vlastnosti materiálu
pigment
{ // použitého pro kvadriky
Green
}
finish
{
phong 1
}
}
#declare UnitBox = box
{ // omezující těleso pro nekonečné kvadriky
<-1.2, -1.2, -1.2>,
< 1.2, 1.2, 1.2>
}
#declare A=clock // parametry použité během animace
#declare B=1.0-A
// deklarace jednotlivých typů kvadrik
// různě orientované nekonečné válce
#declare Cylinder_X = quadric
{
<A, B, 1>,
<0, 0, 0>,
<0, 0, 0>,
-1
}
#declare Cylinder_Y = quadric
{
<1, A, B>,
<0, 0, 0>,
<0, 0, 0>,
-1
}
#declare Cylinder_Z = quadric
{
<B, 1, A>,
<0, 0, 0>,
<0, 0, 0>,
-1
}
// paraboloidy
/* y^2 + z^2 - x = 0 */
#declare Paraboloid_X = quadric
{
< A, B, 1>,
< 0, 0, 0>,
<-1, 0, 0>,
0
}
/* x^2 + z^2 - y = 0 */
#declare Paraboloid_Y = quadric
{
<1, A, B>,
<0, 0, 0>,
<0, -1, 0>,
0
}
/* x^2 + y^2 - z = 0 */
#declare Paraboloid_Z = quadric
{
<B, 1, A>,
<0, 0, 0>,
<0, 0, -1>,
0
}
// umístění jednotlivých objektů tvořených kvadrikami v prostoru
// spolu se specifikací textury a obalového tělesa
quadric {Cylinder_X texture {Solid} clipped_by { object{UnitBox scale 3}} translate <Col1, Row1, Dist>}
quadric {Cylinder_Y texture {Solid} clipped_by { object{UnitBox scale 3}} translate <Col2, Row1, Dist>}
quadric {Cylinder_Z texture {Solid} clipped_by { object{UnitBox scale 3}} translate <Col3, Row1, Dist>}
quadric {Paraboloid_X texture {Solid} clipped_by { object{UnitBox scale 3}} translate <Col1, Row2, Dist>}
quadric {Paraboloid_Y texture {Solid} clipped_by { object{UnitBox scale 3}} translate <Col2, Row2, Dist>}
quadric {Paraboloid_Z texture {Solid} clipped_by { object{UnitBox scale 3}} translate <Col3, Row2, Dist>}
// ------------------------------------------------------------
// finito
// ------------------------------------------------------------
Obrázek 13: Poslední snímek animace vytvořené pomocí třetího demonstračního příkladu
5. Deklarace proměnných v POV-Rayi
Při pohledu na zdrojové kódy předchozích demonstračních příkladů jste si možná všimli, že se v nich nachází řádek vypadající přibližně takto:
#declare A=nějaký_výraz
Jedná se o deklaraci nového objektu. Tímto termínem se v POV-Rayi označuje skalární hodnota, vektor, textura, geometrický objekt, světelný zdroj atd. Důležité přitom je, že se objekt pomocí konstrukce #declare současně pojmenuje, takže se s ním dá v další části zdrojového kódu manipulovat. Pokud se výraz na pravé straně přiřazení vyhodnotí na skalární hodnotu nebo vektor, je možné takto nadeklarovaný objekt považovat za běžnou proměnnou, kterou lze vkládat například do matematických výrazů.
Obrázek 14: Snímek ze čtvrté animace
6. Použití programové smyčky typu „while“
V POV-Rayi je možné vytvářet i programové smyčky. Zatímco v běžných programovacích jazycích se můžeme setkat s větším množstvím smyček, většinou typu while, repeat-until (do-while) a počítané smyčky typu for, v POV-Rayi je dostupná pouze smyčka typu while, která je však současně smyčkou univerzální – ostatní typy smyček se pomocí ní dají vždy zkonstruovat. Smyčka se zapisuje následovně:
#while (podmínka)
...
...
#end
Obrázek 15: Další snímek ze čtvrté animace
Vzhledem k tomu, že výsledkem zpracování zdrojového kódu scény v POV-Rayi je interní stromová reprezentace této scény uložená v operační paměti, jsou podmínky smyček while vyhodnocovány již při načítání a prvotním parsingu zdrojového kódu. V případě, že je výraz umístěný za slovem #while nenulový, je tělo smyčky vloženo do vytvářené stromové struktury a podmínka se vyhodnotí znovu, v opačném případě je celá smyčka přeskočena. Při zápisu podmínek je možné využít širokou škálu operátorů a funkcí, které budou vysvětleny v některé z dalších částí tohoto seriálu.
7. Čtvrtý demonstrační příklad – tvorba a animace tělesa s využitím smyčky „while“
V dnešním čtvrtém demonstračním příkladu, jehož výslednou animaci si můžete prohlédnout po výběru tohoto odkazu, je ukázáno použití univerzální smyčky typu while při vytváření těles. V našem případě se jedná o těleso složené ze skupiny koulí. Bylo by možné použít i implicitní plochy, rendering by se však prodloužil. Koule jsou v prostoru umisťovány na základě vyhodnocení trojice funkcí, pomocí nichž se získají souřadnice jejich středů a současně i barvy povrchu. Souřadnice i barvy jsou ovlivněny jak počitadlem smyčky, které je neustále snižováno až k nulové hodnotě, tak i interní proměnnou clock.
Zdrojový kód čtvrtého demonstračního příkladu:
// ------------------------------------------------------------
// Čtvrtý demonstrační příklad
//
// Složitější těleso vytvořené pomocí deklarace proměnných
// a použití programové smyčky typu "while".
//
// Tvar tělesa se v animaci mění díky použití interní proměnné
// "clock".
//
// Založeno na souboru dodávaném současně s POV-Ray 3.x
//
// rendering lze spustit příkazem:
// povray +W800 +H600 +B100 +FN +D +Iwhile1.pov +Owhile1.png
// (pro náhled postačí zadat povray while1.pov)
//
// animaci lze vytvořit přidáním parametru:
// +KFFpočet_snímků
//
// popř. je možné zvolit konkrétní hodnotu proměnné clock:
// +Kn.n
// -----------------------------------------------------------
#version 3.0
// globální nastavení parametrů scény
global_settings
{
assumed_gamma 2.2
}
// nastavení kamery (pozorovatele)
camera
{
location <0, 0,-30> // pozice kamery ve scéně
direction <0, 0, 1> // směr pohledu kamery
up <0, 1, 0> // orientace souřadného systému kamery
right <4/3, 0, 0>
look_at <0, 0, 0>
}
background
{
color rgb <0.5, 0.5, 0.5> // barva pozadí celé scény
}
light_source
{
<20, 30, -100> // pozice světelného zdroje
color <1.0, 1.0, 1.0> // barva světelného zdroje
}
#declare r1=12 // "poloměr" tělesa
#declare A=0.1 // první parametr
#declare B=0.15*clock // druhý parametr je ovlivněný proměnnou "clock"
#declare Count=400 // počitadlo smyčky
union
{
#while (Count>=0) // programová smyčka typu "while"
// výpočet souřadnic středů koulí tvořících těleso
#declare X=r1*sin(A*Count)*cos(B*Count)
#declare Y=r1*sin(A*Count)*sin(B*Count)
#declare Z=r1*cos(A*Count)
sphere
{
<X,Y,Z>, 1 // souřadnice středu koule a její poloměr
texture
{
pigment // barva jednotlivých koulí je závislá na jejich poloze
{
color rgb <abs(X/r1), abs(Y/r1), abs(Z/r1)>
}
finish // změna optických vlastností materiálu
{
ambient 0.2 // ambientní složka
diffuse 0.6 // difúzní složka
phong 0.3 // míra odlesků
phong_size 100 // relativní velikost odlesků
}
}
}
#declare Count=Count-1 // snížení počitadla
// (simulace počítané smyčky typu "for", která v POV-Rayi neexistuje)
#end // konec těla programové smyčky #while
rotate <-20,45,0> // výsledné natočení tělesa ve scéně
}
// ------------------------------------------------------------
// finito
// ------------------------------------------------------------
8. Obsah následující části seriálu
V další části seriálu o raytraceru POV-Ray si řekneme, jakým způsobem je možné specifikovat optické vlastnosti vnitřních částí těles. V tomto raytraceru je totiž možné jednoduše pracovat i s amorfními objekty typu oheň či pára, které jsou modelovány právě na základě optických objemových vlastností těles, nikoli pouhým odrazem či lomem paprsků na jejich povrchu.