Hlavní navigace

Spline funkce a makro Spline_Trans

17. 2. 2009
Doba čtení: 15 minut

Sdílet

V dnešní části seriálu o POV-Ray si řekneme, jakým způsobem je možné použít spline funkce při tvorbě procedurálních textur, a také si ukážeme využití spline funkcí v animacích, ve kterých se objekty při svém pohybu také otáčí a naklápí. Většina výpočtů pohybu objektů je založena na makru Spline_Trans.

Obsah

1. Spline funkce použité při práci s procedurálními texturami
2. První demonstrační příklad – procedurální textura využívající spline funkci
3. Makro Spline_Trans
4. Druhý demonstrační příklad – pohyb objektu ve scéně bez a s použitím makra Spline_Trans
5. Třetí demonstrační příklad – změna parametrů makra Spline_Trans
6. Literatura a odkazy na Internetu
7. Odkazy na vytvořené animace

1. Spline funkce použité při práci s procedurálními texturami

V předchozí části tohoto seriálu jsme si řekli, že raytracer POV-Ray je v současné verzi 3.x vybaven poměrně sofistikovaným a přitom snadno použitelným matematickým aparátem určeným pro práci s kvadratickými, kubickými a také „přirozenými“ spline funkcemi. Možnosti použití spline funkcí jsou poměrně rozsáhlé, od tvorby animací s objekty pohybujícími se po zadané trajektorii (viz třetí kapitola a kapitoly na ní navazující), přes modelování těles s členitým povrchem až po definici procedurálních textur se vzorkem založeným na uživatelsky zadané spline funkci. V první kapitole si popíšeme poslední zmíněný způsob použití spline funkcí při definici procedurálních textur. Z předchozích částí tohoto seriálu již víme, že procedurální textura je buď zadána nějakou interní funkcí POV-Raye (jedná se například o textury nazvané agate, marble či granite) nebo matematickým výrazem zadaným přímo uživatelem. Pokud je použita uživatelská funkce, jsou jejími vstupy (nezávislými parametry) souřadnice bodu v trojrozměrném prostoru a výstupem (hodnotou funkce) reálné číslo, které je buď přímo použito pro určení barvy, nebo představuje vstup do barvové mapy (color map).

povray4801

Obrázek 1: Procedurální textura vytvořená pomocí prvního demonstračního příkladu na základě kubické spline funkce.

Při zápisu matematického výrazu je samozřejmě možné použít i dříve nadefinovanou spline funkci. Ve své podstatě se totiž jedná o běžnou funkci, která se například od goniometrických funkcí odlišuje pouze v tom, že pro zadaný vstup nevrací pouze reálné číslo, ale dvousložkový až pětisložkový vektor. Každá spline funkce, nezávisle na jejím typu, je totiž specifikována seznamem libovolného množství řídicích bodů, mezi kterými POV-Ray automaticky vypočítá interpolační křivku. Každý řídicí bod je zadán dvojicí hodnot: numerickou hodnotou parametru (reálné číslo určující pozici bodu v parametrickém prostoru) a vlastní souřadnicí řídicího bodu, přičemž vektor specifikující souřadnice bodu může mít dvě až pět složek – bod tedy může ležet v dvourozměrném až pětirozměrném prostoru. Pokud je spline funkce použita pro definici parametrické textury, záleží jen na nás, v kolikarozměrném prostoru budou řídicí body ležet, protože s vektorem, který spline funkce vrátí jako svůj výsledek, lze provádět jakékoli operace, například využít pouze jednu složku tohoto vektoru (pomocí operátorů .x, .y, .z či .t), libovolným způsobem složky zkombinovat, použít vektorové funkce typu vcross() či vnormalize() atd.

povray4802

Obrázek 2: Tato procedurální textura byla vytvořena na základě výrazu Spl_Pat(x).y+Spl_Pat(y­).z+sin(x-y), kde Spl_Pat je uživatelsky definovaná spline funkce, jejíž body leží v trojrozměrném prostoru. Všimněte si, že z vektoru vráceného spline funkcí je použita pouze y-ová a z-ová složka.

2. První demonstrační příklad – procedurální textura využívající spline funkci

V dnešním prvním demonstračním příkladu je ukázán jeden z možných způsobů definice procedurální textury využívající spline funkci. Nejprve je zadefinována samotná spline funkce pojmenovaná identifikátorem Spl_Pat. Jedná se o kubickou spline, jejíž body leží v trojrozměrném prostoru. Dále je vytvořena funkce P, která pro libovolný bod P=[x,y,z] vrátí jedno reálné číslo na základě vektorů vypočtených spline funkcí a popř. i dalších operandů matematického výrazu. Tato funkce je již použita pro pokrytí jediného tělesa ve scéně (kvádru) procedurální texturou. Výsledek funkce P je nejprve pomocí mapovací funkce triangle_wave upraven tak, aby výsledné hodnoty vždy ležely mezi nulou a jedničkou (toto mapování také zajistí, že nebude docházet ke skokovým změnám barev). Posléze se hodnota, která je vypočtena mapovací funkcí triangle_wave použije jako vstup do barvové mapy (color map), takže konečným výsledkem je skutečně barva (ve skutečnosti lze aplikaci triangle_wave a color_map vynechat, výsledkem by byla textura ve stupních šedi, ve které by docházelo ke skoku mezi čistě bílou barvou a barvou černou). Celý postup výpočtu barvy textury v bodu [x,y,z] je tedy následující:

výsledná_barva_v_bodě [x,y,z] = color_map(triangle_wave(P(x,y,z)))

kde:

P(x,y,z)=Spl_Pat(x).y+Spl_Pat(y).z
povray4803

Obrázek 3: Odlišný tvar spline funkce (přesněji řečeno změna poloh řídicích bodů) má za následek také změnu vzorku procedurální textury.

Zdrojový kód prvního demonstračního příkladu je následující:

// ------------------------------------------------------------
// První demonstrační příklad vykreslený s volbami:
// -w1024 -h1024 +a0.3 (šířka a výška obrázku by měla být stejná)
//
// Ukázka použití spline funkce pro vytvoření procedurální
// textury. Volně založeno na zdrojovém kódu, jehož autorem je
// Ingo Janssen
// ------------------------------------------------------------

#version 3.5;

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

// nastavení kamery (pozorovatele)
camera
{
    location <0.0, 0.0, -2.5>            // pozice kamery v prostoru
    look_at  <0.0, 0.0, 0.0>             // bod, na který kamera směřuje
    up       <0.0, 1.0, 0.0>             // poměr výšky a šířky obrázku bude 1:1
    right    <1.0, 0.0, 0.0>
    angle 40                             // zorný úhel
}

// deklarace funkce založené na kubické spline
#declare Spl_Pat = function
{
    spline
    {
        cubic_spline                     // typ spline
      -0.001, < 0   , 0  , 0.5>          // koncový bod tečného vektoru
       0.25,  < 0.25, 0.5, 0.1>          // první řídicí bod ležící na křivce
       0.5,   < 0.75, 0.1, 0.9>
       0.75,  < 0.50, 0.9,-1.0>          // poslední řídicí bod ležící na křivce
       1.001, < 1   , 0  , 0>            // koncový bod tečného vektoru
   }
}

// deklarace procedurální textury zadané spline funkcí
#declare P = function
{
    pigment
    {
        function
        {
            Spl_Pat(x).y+Spl_Pat(y).z    // vyčíslení na základě souřadnic bodu v prostoru
            +sin(x-y)
        }
    }
}

// jediné viditelné těleso ve scéně - kvádr
box
{
    <0,0,0>, <1,1,1>                     // protilehlé vrcholy kvádru
    pigment
    {
        function
        {
            P(x,y,z).gray                // procedurální textura - převod výsledku na úrovně šedi
        }
        triangle_wave                    // použité mapování
        color_map                        // barvová mapa
        {
            [ 0.0 color rgbf < 1.0, 1.0, 0.5, 0.0 > ]
            [ 0.2 color rgbf < 0.8, 0.5, 0.0, 0.0 > ]
            [ 0.7 color rgbf < 0.2, 0.0, 0.0, 0.0 > ]
            [ 1.0 color rgbf < 0.0, 0.0, 0.0, 0.0 > ]
        }
    }
    finish
    {
        ambient 1
    }
    translate <-0.5, -0.5, 0>            // posun kvádru do středu promítání
    scale 1.7
}

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

Zajímavá situace může nastat v případě, že tečné vektory na konci spline funkce jsou nastaveny tak, že výsledná spline křivka bude mít (po promítnutí do roviny x-y či x-z) velký sklon. Takový případ je ukázán na čtvrtém obrázku vytvořeném na základě kubické spline funkce obsahující pět řídicích bodů a dva koncové body tečných vektorů. Velký sklon spline křivky znamená, že se prudce mění hodnota funkce P, která je po mapování provedeném pomocí triangle_wave použita pro výběr barvy z barvové mapy.

povray4804

Obrázek 4: Procedurální textura vytvořená na základě spline funkce, jež má v některém místě svého definičního oboru velký sklon (po promítnutí do roviny x-y či x-z).

Čtvrtý obrázek byl vytvořen na základě upraveného prvního demonstračního příkladu:

// ------------------------------------------------------------
// Varianta prvního demonstračního příkladu, odlišný tvar spline
// funkce i hodnot v barvové mapě.
// -w1024 -h1024 +a0.3 (šířka a výška obrázku by měla být stejná)
//
// Ukázka použití spline funkce pro vytvoření procedurální
// textury. Volně založeno na zdrojovém kódu, jehož autorem je
// Ingo Janssen
// ------------------------------------------------------------

#version 3.5;

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

// nastavení kamery (pozorovatele)
camera
{
    location <0.0, 0.0, -2.5>            // pozice kamery v prostoru
    look_at  <0.0, 0.0, 0.0>             // bod, na který kamera směřuje
    up       <0.0, 1.0, 0.0>             // poměr výšky a šířky obrázku bude 1:1
    right    <1.0, 0.0, 0.0>
    angle 40                             // zorný úhel
}

// deklarace funkce založené na kubické spline
#declare Spl_Pat = function
{
    spline
    {
        cubic_spline                     // typ spline
      -0.001, < 0   , 0  , 0.5>          // koncový bod tečného vektoru
       0.0,   < 0.25, 0.5, 1.0>          // první řídicí bod ležící na křivce
       0.25,  < 0.25, 0.0, 0.1>          // první řídicí bod ležící na křivce
       0.5,   < 0.5,  1.0, 0.9>
       0.7,   < 0,    0.0, 1.0>
       1.0,   < 0.75, 0.9,-1.0>          // poslední řídicí bod ležící na křivce
       1.001, < 1   , 0  , 0>            // koncový bod tečného vektoru
   }
}

// deklarace procedurální textury zadané spline funkcí
#declare P = function
{
    pigment
    {
        function
        {
            Spl_Pat(x).y+Spl_Pat(y).z    // vyčíslení na základě souřadnic bodu v prostoru
        }
    }
}

// jediné viditelné těleso ve scéně - kvádr
box
{
    <0,0,0>, <1,1,1>                     // protilehlé vrcholy kvádru
    pigment
    {
        function
        {
            P(x,y,z).gray                // procedurální textura - převod výsledku na úrovně šedi
        }
        triangle_wave                    // použité mapování
        color_map                        // barvová mapa
        {
            [ 0.0 color rgbf < 1.0, 1.0, 0.5, 0.0 > ]
            [ 0.2 color rgbf < 0.5, 0.8, 0.0, 0.0 > ]
            [ 0.7 color rgbf < 0.0, 0.2, 0.0, 0.0 > ]
            [ 1.0 color rgbf < 0.0, 0.0, 0.0, 0.0 > ]
        }
    }
    finish
    {
        ambient 1
    }
    translate <-0.5, -0.5, 0>            // posun kvádru do středu promítání
    scale 1.8
}

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray4805

Obrázek 5: Detail procedurální textury z obrázku číslo 4.

3. Makro Spline_Trans

V předchozí části tohoto seriálu jsme si na demonstračním příkladu ukázali, jakým způsobem je možné použít spline funkce při animacích pohybu objektů. Spline funkcí lze sice relativně snadno popsat cestu, po které se objekt posunuje, ale většina objektů se také při pohybu natáčí a to jak ve směru pohybu (automobil, vlak), tak i okolo osy směřující ve směru pohybu (letadlo). Na této animaci vytvořené pomocí druhého demonstračního příkladu (viz další kapitola), je patrné, že pohyb objektu po zadané dráze bez jeho průběžného natáčení vypadá nepřirozeně (i z tohoto důvodu se v předchozí části seriálu pro animaci použila místo tvarově složitého objektu obyčejná žlutá kulička). Vraťme se však k možnostem natáčení objektů během jejich pohybu. Teoreticky je sice možné změnu orientace objektu v prostoru během jeho pohybu popsat další spline funkcí, jedná se však o zbytečnou komplikaci, protože zadávání orientace není příliš intuitivní a přesné. Místo toho je vhodnější použít velmi užitečné (a mezi POV-Rayovskou komunitou poměrně neznámé) makro Spline_Trans, jehož definice je uložena v souboru transforms.inc.

povray4806

Obrázek 6: Pohyb objektu, který se nenatáčí, nevypadá příliš přirozeně. První snímek animace.

Princip tohoto makra je poměrně jednoduchý – v některém místě křivky zadané spline funkcí se numericky vypočte tečný vektor představující úhel, o který se má pohybující se předmět otočit. Dále se na základě vypočteného vektoru a vektoru Sky (viz část věnovaná nastavení kamery) získá lokální souřadný systém pohybujícího se objektu. Tento souřadný systém se posléze natočí okolo jedné ze souřadných os, jejíž orientace odpovídá směru pohybu. Touto operací se simuluje náklon objektu (typicky letadla) při zatáčení. Makro Spline_Trans je nutné volat s pěti parametry. První parametrem je identifikátor spline funkce, pro kterou se má výpočet provádět. Druhým parametrem je reálné číslo určující pozici na spline křivce (viz první kapitola). Do třetího parametru se zapisuje vektor Sky, jehož význam jsme si již vysvětlili (používá se pro konstrukci lokálního souřadného systému objektu). Čtvrtý parametr je použit pro určení, jak přesně se má úhel natočení vypočítat (čím menší je zde uložené číslo, tím přesněji se spočítá tečný vektor v daném bodě spline křivky). Poslední parametr slouží ke specifikaci míry náklonu objektu při změně směru pohybu. Konkrétní význam posledních dvou parametrů bude ukázán v páté kapitole.

povray4807

Obrázek 7: Další snímek animace objektu, jenž se při svém pohybu nenatáčí.

povray4808

Obrázek 8: Třetí snímek animace objektu, který se při svém pohybu nenatáčí.

4. Druhý demonstrační příklad – pohyb objektu ve scéně bez a s použitím makra Spline_Trans

V dnešním druhém demonstračním příkladu je ukázáno, jak lze využít výše popsané makro Spline_Trans při vytváření animace pohybujícího se objektu. Při volání tohoto makra byla míra naklánění objektu nastavena na nulovou hodnotu (k náklonům tedy nedocházelo) a koeficient výpočtu tečného vektoru byl nastaven na hodnotu 0,01, což znamená velmi přesné určení úhlu otočení na základě numericky vypočteného tečného vektoru bez „sklouzávání“ (viz následující kapitola). Nastavením proměnné USE_SPLINE_TRANS na pravdivostní hodnotu true či false lze určit, zda se má při výpočtech skutečně použít makro Spline_Trans (viz obrázky 9 až 12) nebo je objekt pouze posunut běžnou lineární transformací (obrázky 6 až 8 uvedené v předchozí kapitole). Povšimněte si, že před voláním makra Spline_Trans je nutné načíst i soubor transforms.inc, který obsahuje jeho definici. Následuje výpis zdrojového kódu druhého demonstračního příkladu:

// ------------------------------------------------------------
// Druhý demonstrační příklad - použití spline funkce pro
// tvorbu cest použitých při animaci a využití makra
// Spline_Trans.
//
// rendering lze spustit příkazem:
//     povray +W320 +H240 +B100 +FN +D +KFF200 +A -J +Ispline2.pov +Ospline2.png
// ------------------------------------------------------------

// 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 "math.inc"
#include "transforms.inc"

#declare USE_SPLINE_TRANS = false;        // povolení či zákaz použití makra Spline_Trans

// nastavení kamery (pozorovatele)
camera
{
    orthographic
    location  <0, 35, 0>                 // pozice kamery
    look_at   <0, 0, 0>                  // bod, na který kamera směřuje
}

// tři světelné zdroje
light_source
{
    <-30, 50,  20>                       // pozice prvního světelného zdroje
    color White                          // barva světla
}

light_source
{
    < 31, 50, -20>                       // pozice druhého světelného zdroje
    color White                          // barva světla
}

light_source
{
    < 32, 50, 20>                        // pozice třetího světelného zdroje
    color LightGray                      // barva světla
}

// podkladová rovina
plane
{
    y, -8
    texture
    {                                    // textura - vlastnosti povrchu
        pigment
        {                                // šachovnicová textura
            checker                      // vyvedená ve stupních šedi
            color rgb <0.3, 0.3, 0.3>
            color rgb <0.5, 0.5, 0.5>
        }
        finish
        {                                // odlesky a odrazy na povrchu
            diffuse 0.7
            reflection 0.2
        }
        scale 3
    }
}

#declare SplineFunkce =                  // deklarace spline funkce
    spline
    {
        cubic_spline                     // typ použité spline funkce
       -0.125, <-15, 0,-15>              // první bod počátečního tečného vektoru
        0.000, <  0, 0, 15>              // první řídicí bod ležící na spline křivce
        0.125, < 15, 0,-15>
        0.250, <-15, 0,  0>
        0.375, < 15, 0, 15>
        0.500, <  0, 0,-15>
        0.625, <-15, 0, 15>
        0.750, < 15, 0,  0>
        0.875, <-15, 0,-15>
        1.000, <  0, 0, 15>              // poslední řídicí bod ležící na spline křivce
        1.125, < 15, 0,-15>              // druhý bod koncového tečného vektoru
    }

#declare alfa = clock;

// pohybující se objekt
union
{
    sphere                               // žlutá kulička
    {
        <0, 0, 0>, 1.5                   // souřadnice středu koule a její poloměr
        texture
        {
            pigment                      // barva povrchu
            {
                color Yellow
            }
            finish                       // odlesky na povrchu
            {
                phong 1.0
            }
        }
    }
    cone                                 // červený kužel
    {
        <0, 0, 0>, 1.5,                  // souřadnice středu podstavy kužele a její poloměr
        <0, 0, 3.5>, 0                   // souřadnice vrcholu kužele
        texture
        {
            pigment                      // barva povrchu
            {
                color Red
            }
            finish                       // odlesky na povrchu
            {
                phong 1.0
            }
        }
    }
    cylinder                             // modrá "křídla"
    {
        <-5/2, 0, 0>,                    // souřadnice středu první podstavy
        < 5/2, 0, 0>, 0.5                // souřadnice středu druhé podstavy
        texture
        {
            pigment                      // barva povrchu
            {
                color Blue
            }
            finish                       // odlesky na povrchu
            {
                phong 1.0
            }
        }
    }
    #if (USE_SPLINE_TRANS)               // posun objektu s jeho možným natočením
        Spline_Trans (SplineFunkce, alfa, y, 0.01, 0.000)
    #else
        translate SplineFunkce(alfa)
    #end
}

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray4809

Obrázek 9: Objekt se natáčí ve směru pohybu. Čas t=0,9

povray4810

Obrázek 10: Objekt se natáčí ve směru pohybu. Čas t=0,10

povray4811

Obrázek 11: Objekt se natáčí ve směru pohybu. Čas t=0,11

povray4812

Obrázek 12: Objekt se natáčí ve směru pohybu. Čas t=0,12

5. Třetí demonstrační příklad – změna parametrů makra Spline_Trans

V dnešním třetím a současně i posledním demonstračním příkladu je makro Spline_Trans voláno s různými hodnotami svých posledních dvou parametrů, které lze nastavit přes konstanty FORESIGHT a BANKING. Při tvorbě této (poměrně věrohodně působící) animace byl čtvrtý parametr nastaven na hodnotu 0,01, což znamená velmi přesný výpočet tečného vektoru a tím i natočení objektu, a pátý parametr na hodnotu 2,9, tj. velkou míru náklonu objektu při jeho zatáčení (mohlo by se zdát, že čím menší je hodnota čtvrtého parametru, tím přesnější bude výpočet, ale od určité meze naopak chyba poroste v důsledku zaokrouhlovacích chyb při násobení a podtékání výsledku). Naproti tomu v průběhu výpočtu druhé animace byla hodnota čtvrtého parametru zvýšena na 0,31 (objekt pomalu „klouzal“ místo přesné změny natočení v zatáčkách) a míra náklonu se zmenšila na hodnotu 0,5 – z toho důvodu, že skutečný náklon závisí na součinu hodnot čtvrtého a pátého parametru (proč tomu tak je můžeme zjistit při pohledu na definici makra). Zdrojový kód třetího demonstračního příkladu se v mnohém podobá demonstračnímu příkladu druhému, pouze se liší způsob volání makra Spline_Trans:

// ------------------------------------------------------------
// Třetí demonstrační příklad - použití spline funkce pro
// tvorbu cest použitých při animaci a využití makra
// Spline_Trans spolu s nastavením jeho parametrů.
//
// rendering lze spustit příkazem:
//     povray +W320 +H240 +B100 +FN +D +KFF200 +A -J +Ispline3.pov +Ospline3.png
// ------------------------------------------------------------

// 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 "math.inc"
#include "transforms.inc"

#declare USE_SPLINE_TRANS = true;        // povolení či zákaz použití makra Spline_Trans
#declare FORESIGHT = 0.31;
#declare BANKING = 0.5;

// nastavení kamery (pozorovatele)
camera
{
    orthographic
    location  <0, 35, 0>                 // pozice kamery
    look_at   <0, 0, 0>                  // bod, na který kamera směřuje
}

// tři světelné zdroje
light_source
{
    <-30, 50,  20>                       // pozice prvního světelného zdroje
    color White                          // barva světla
}

light_source
{
    < 31, 50, -20>                       // pozice druhého světelného zdroje
    color White                          // barva světla
}

light_source
{
    < 32, 50, 20>                        // pozice třetího světelného zdroje
    color LightGray                      // barva světla
}

// podkladová rovina
plane
{
    y, -8
    texture
    {                                    // textura - vlastnosti povrchu
        pigment
        {                                // šachovnicová textura
            checker                      // vyvedená ve stupních šedi
            color rgb <0.3, 0.3, 0.3>
            color rgb <0.5, 0.5, 0.5>
        }
        finish
        {                                // odlesky a odrazy na povrchu
            diffuse 0.7
            reflection 0.2
        }
        scale 3
    }
}

#declare SplineFunkce =                  // deklarace spline funkce
    spline
    {
        cubic_spline                     // typ použité spline funkce
       -0.125, <-15, 0,-15>              // první bod počátečního tečného vektoru
        0.000, <  0, 0, 15>              // první řídicí bod ležící na spline křivce
        0.125, < 15, 0,-15>
        0.250, <-15, 0,  0>
        0.375, < 15, 0, 15>
        0.500, <  0, 0,-15>
        0.625, <-15, 0, 15>
        0.750, < 15, 0,  0>
        0.875, <-15, 0,-15>
        1.000, <  0, 0, 15>              // poslední řídicí bod ležící na spline křivce
        1.125, < 15, 0,-15>              // druhý bod koncového tečného vektoru
    }

#declare alfa = clock;

// pohybující se objekt
union
{
    sphere                               // žlutá kulička
    {
        <0, 0, 0>, 1.5                   // souřadnice středu koule a její poloměr
        texture
        {
            pigment                      // barva povrchu
            {
                color Yellow
            }
            finish                       // odlesky na povrchu
            {
                phong 1.0
            }
        }
    }
    cone                                 // červený kužel
    {
        <0, 0, 0>, 1.5,                  // souřadnice středu podstavy kužele a její poloměr
        <0, 0, 3.5>, 0                   // souřadnice vrcholu kužele
        texture
        {
            pigment                      // barva povrchu
            {
                color Red
            }
            finish                       // odlesky na povrchu
            {
                phong 1.0
            }
        }
    }
    cylinder                             // modrá "křídla"
    {
        <-5/2, 0, 0>,                    // souřadnice středu první podstavy
        < 5/2, 0, 0>, 0.5                // souřadnice středu druhé podstavy
        texture
        {
            pigment                      // barva povrchu
            {
                color Blue
            }
            finish                       // odlesky na povrchu
            {
                phong 1.0
            }
        }
    }
    #if (USE_SPLINE_TRANS)               // posun objektu s jeho možným natočením
        Spline_Trans (SplineFunkce, alfa, y, FORESIGHT, BANKING)
    #else
        translate SplineFunkce(alfa)
    #end
}

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray4813

Obrázek 13: Objekt se natáčí ve směru pohybu a provádí i náklon podle změny směru pohybu.

povray4814

Obrázek 14: Objekt v této části animace nemění směr, takže není ani nakloněný.

povray4815

Obrázek 15: dtto

povray4816

Obrázek 16: Při zatáčení dochází k náklonu objektu.

CS24_early

6. Literatura a odkazy na Internetu

  1. Animations with POV-Ray:
    http://www.f-lohmueller.de/pov_tut/­animate/pov_a­nie.htm
  2. Spilin editor:
    http://www.flashnet­.it/users/fn027571/s­pil/main.html
  3. Foley J., Dam van A., Feiner S., Hughes J.: Computer Graphics – Principles and Practice (Second Edition)
    Addison-Wesley, Reading, Massachusetts, 1990, ISBN 0–201–12110–7
  4. Žára J., Beneš B., Felkel P.: Moderní počítačová grafika
    Computer Press, Praha, 1998, ISBN 80–7226–049–9
  5. Žára J., Limpouch A., Beneš B., Werner T.: Počítačová grafika – principy a algoritmy
    Grada, Praha, 1992, ISBN 80–85623–00–5
povray4817
povray4818
povray4819
povray4820

Obrázky 17–20: „Skluz“ objektu – objekt se natáčí ještě před změnou svého směru ve chvíli, kdy se pohybuje po přímé dráze.

7. Odkazy na vytvořené animace

  1. (200 snímků, rozlišení 320×240 pixelů) objekt, který se při svém pohybu nenatáčí
  2. (200 snímků, rozlišení 320×240 pixelů) otáčení objektu při svém pohybu
  3. (200 snímků, rozlišení 320×240 pixelů) otáčení i naklápění objektu při svém pohybu
  4. (200 snímků, rozlišení 320×240 pixelů) změna míry otáčení i naklápění („skluz“)

Byl pro vás článek přínosný?

Autor článku

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