Tvorba pokročilejších animací v POV-Rayi

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

Sdílet

V dnešním pokračování seriálu o raytraceru POV-Ray si ukážeme některé další možnosti tvorby animací s využitím interní proměnné „clock“, například změnu souřadnic prvků kostry implicitní plochy, modifikaci parametrů superelipsoidu či kvadrik a tvorbu tělesa s využitím smyčky „while“.

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.

povray2801

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
povray2802

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.

povray2803

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.

povray2804

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.

povray2805

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(cloc­k360)), 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).

povray2806

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í.

povray2807

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.

povray2808

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
// ------------------------------------------------------------ 
povray2809

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.

povray2810

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.

povray2811

Obrázek 11: Animace se nachází ve své první čtvrtině

Pod tímto odkazem je uložena výsledná animace metamorfózy kvadrik.

povray2812

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
// ------------------------------------------------------------ 
povray2813

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ů.

povray2814

Obrázek 14: Snímek ze čtvrté animace

6. Použití programové smyčky typu „while“

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 
povray2815

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.

povray2816

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

ict ve školství 24

// ------------------------------------------------------------
// Č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
// ------------------------------------------------------------ 
povray2817

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.

Autor článku

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