Hlavní navigace

Panoramatické snímky a další kouzla s kamerou

Pavel Tišnovský

V dnešní části seriálu o POV-Rayi si ukážeme rendering panoramatických snímků s využitím cylindrického promítání. Také si popíšeme způsob rozostření objektů v závislosti na jejich vzdálenosti od kamery (pozorovatele) a také změny směru paprsků vycházejících z kamery pomocí procedurálních vzorků.

Obsah

1. Cylindrické promítání a tvorba panoramatických snímků
2. První demonstrační příklad – panoramatický snímek
3. Rozostření příliš blízkých či vzdálených objektů
4. Druhý demonstrační příklad – nastavení rozostření objektů
5. Třetí demonstrační příklad – postupná změna polohy bodu, na který je kamera zaostřena
6. Změna směru paprsků vycházejících z kamery
7. Čtvrtý demonstrační příklad – ovlivnění paprsků procedurálním vzorkem
8. Snímky získané renderingem čtvrtého demonstračního příkladu

1. Cylindrické promítání a tvorba panoramatických snímků

V předchozích dvou částech tohoto seriálu jsme si popsali základní způsoby promítání, které POV-Ray podporuje. Jednalo se především o nejčastěji používanou perspektivní projekci, projekci ortografickou a projekci typu „rybí oko“. Tento raytracer však obsahuje podporu i pro další typy projekcí, z nichž největší praktické uplatnění má především projekce cylindrická. Princip této projekce spočívá v tom, že se místo projekční roviny (použité v perspektivní projekci a projekci ortografické) či koule („rybí oko“) používá válec, na jehož plášť je přenesen obraz okolního prostoru. Tento typ projekce má velkou přednost v tom, že je možné jednoduše tvořit panoramatické snímky, které obsáhnou celý horizont, tj. zorný úhel může dosahovat až hodnoty 360°. Zatímco u digitální fotografie jsou panoramatické snímky vytvářeny spojením navzájem překrytých a nelineárně zkreslených plošných fotografií (to ve své podstatě odpovídá perspektivnímu promítání) jsou při použití cylindrické projekce všechny části snímku vykresleny zcela přesně bez nežádoucích vertikálních nelinearit.

povray4401

Obrázek 1: Testovací scéna vykreslená s využitím běžné perspektivní projekce.

Snímek, který vznikne při renderingu s využitím cylindrického promítání, má obdélníkový tvar, na rozdíl od minule popsané projekce typu „rybí oko“, při níž vzniká kruhový obraz. Pokud si výsledný snímek prohlédneme v běžném prohlížeči obrázků (viz snímek zobrazený v následující kapitole), zjistíme, že původně rovné hrany, které nemají přesně vertikální směr, jsou nyní zakřiveny. Je to způsobeno tím, že se vlastně díváme na roztažený plášť válce bez aplikace příslušné transformace z válce na plochu. Vzniklé snímky jsou totiž určeny pro specializované prohlížecí programy, například QuickTime VR, ve kterých se zobrazí vždy jen (správně mapovaná) část snímku, přičemž je možné se ve vykreslené scéně otáčet o celých 360°, popř. si některé zajímavé prvky scény přiblížit. Takto vytvořené snímky byly použity pro tvorbu několika počítačových her i „virtuálních muzeí“. Předností je malá datová náročnost těchto pseudo-3D scén (neukládají se celé trojrozměrné modely ale jen jeden rastrový obraz) a také rychlé vykreslení i na slabších počítačích.

2. První demonstrační příklad – panoramatický snímek

V dnešním prvním demonstračním příkladu je ukázáno, jakým způsobem je možné vytvořit panoramatický snímek s využitím cylindrického mapování. Nejprve je nutné správně nastavit kameru uvedením atributu cylinder s parametrem 1. Tímto parametrem se volí způsob natočení válce, na nějž je scéna promítnuta – zde se jedná o nastavení vertikálně postaveného válce. Posléze je nastaven zorný úhel kamery na 360°, tj. je využita celá plocha pláště válce. Teoreticky je možné nastavit i menší zorný úhel, ale v praxi má největší význam právě celý panoramatický snímek, kde na sebe oba jeho konce plynule navazují. Při použití cylindrického mapování se kamera umísťuje do prostoru běžným způsobem, tj. uvedením vektorů location a look_at (viz předchozí dvě části tohoto seriálu). V našem příkladu je navíc přidán příkaz rotate (lineární transformace), který celou scénu natočí. Důležité je, aby horizontální rozlišení panoramatického snímku bylo zhruba čtyřikrát větší, než původní rozlišení. Místo snímku s rozlišením 320×240 pixelů je tedy nutné zvolit rozlišení 1280×240 pixelů atd. Jen tak je zajištěno, že panoramatický snímek nebude v horizontálním směru natažen ani stlačen.

povray4402

Obrázek 2: Snímek, který vznikl zpracováním prvního demonstračního příkladu. Povšimněte si, že původně rovné hrany, které nejsou přesně vertikální, jsou při použití cylindrického mapování zkreslené.

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

// ------------------------------------------------------------
// První demonstrační příklad - vykreslení souřadných os,
// podkladové roviny a implicitní plochy. Nastavení
// cylindrického promítání - tvorba panoramatického snímku.
//
// rendering lze spustit příkazem:
// povray +W3200 +H600 +B100 +FN +D +Icamera1.pov
//
// Pozor - horizontální rozlišení je nutné nastavit na
//         čtyřnásobek původní hodnoty, tedy například
//         1280x240 pixelů namísto 320x240 pixelů atd.
// ------------------------------------------------------------

// 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 "stones.inc"
#include "glass.inc"

// nastavení kamery (pozorovatele)
camera
{
    cylinder 1                           // cylindrické promítání
    angle 360                            // zorný úhel 360 stupňů
    sky +y                               // natočení kamery ve směru osy y
    location  <0.0, 15.0, -40.0>         // pozice kamery v prostoru
    look_at   <0.0, 15.0, 0.0>           // pohled kamery - střed obrázku
    rotate    <0, -30, 0>                // rotace kamery - v tomto případě
}                                        // se jedná o jednodušší řešení
                                         // než změna bodů location a look_at

// 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, -15
    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 10
    }
}

// X-ová osa
union
{
    // šipka
    cone
    {
        <0,0,0>,1,
        <25,0,0>,1
    }
    cone
    {
        <25,0,0>,1,
        <27,0,0>,5
    }
    cone
    {
        <27,0,0>,5,
        <35,0,0>,0
    }
    // X
    sphere
    {
        <35,5,0>, 1
    }
    sphere
    {
        <42,5,0>, 1
    }
    sphere
    {
        <35,5,10>, 1
    }
    sphere
    {
        <42,5,10>, 1
    }
    cone
    {
        <35,5,0>,1,
        <42,5,10>,1
    }
    cone
    {
        <35,5,10>,1,
        <42,5,0>,1
    }
    texture
    {
        pigment                          // barva povrchu
        {
            color red 1.0
        }
        finish
        {                                // odlesky a odrazy na povrchu
            diffuse 0.7
            phong 1                      // velikost a síla odlesků
            phong_size 30
            reflection 0.0
        }
    }
}

// Y-ová osa
union
{
    // šipka
    cone
    {
        <0,0,0>, 1,
        <0,25,0>, 1
    }
    cone
    {
        <0,25,0>, 1,
        <0,27,0>, 5
    }
    cone
    {
        <0,27,0>, 5,
        <0,35,0>, 0
    }
    // Y
    sphere
    {
        <5,35,10>, 1
    }
    sphere
    {
        <12,35,10>, 1
    }
    sphere
    {
        <8.5,35,0>, 1
    }
    cone
    {
        <8.5,35,5>, 1,
        <5,35,10>, 1
    }
    cone
    {
        <8.5,35,5>, 1,
        <12,35,10>, 1
    }
    cone
    {
        <8.5,35,5>, 1,
        <8.5,35,0>, 1
    }
    texture
    {
        pigment                          // barva povrchu
        {
            color green 1.0
        }
        finish
        {                                // odlesky a odrazy na povrchu
            diffuse 0.7
            phong 1                      // velikost a síla odlesků
            phong_size 30
            reflection 0.0
        }
    }
}

// Z-ová osa
union
{
    // šipka
    cone
    {
        <0,0,0>, 1,
        <0,0,25>, 1
    }
    cone
    {
        <0,0,25>, 1,
        <0,0,27>, 5
    }
    cone
    {
        <0,0,27>, 5,
        <0,0,35>, 0
    }
    // Z
    sphere
    {
        < 12,-5, 25>, 1
    }
    sphere
    {
        < 5, -5, 25>, 1
    }
    sphere
    {
        < 12, -5, 35>, 1
    }
    sphere
    {
        < 5, -5, 35>, 1
    }
    cone
    {
        <12,-5,35>, 1,
        <5,-5,25>, 1
    }
    cone
    {
        <12,-5,35>, 1,
        <5,-5,35>, 1
    }
    cone
    {
        <12,-5,25>, 1,
        <5,-5,25>, 1
    }
    texture
    {
        pigment                          // barva povrchu
        {
            color blue 1.0
        }
        finish
        {                                // odlesky a odrazy na povrchu
            diffuse 0.7
            phong 1                      // velikost a síla odlesků
            phong_size 30
            reflection 0.0
        }
    }
}

blob
{                                        // definice implicitní plochy s využitím původní syntaxe
    threshold 0.6                        // hraniční hodnota
    component 1.0, 1.0, < 0.750,  0, 0>       // prvek kostry: síla, poloměr, souřadnice v prostoru
    component 1.0, 1.0, <-0.375,  0.64952, 0> // druhý prvek kostry
    component 1.0, 1.0, <-0.375, -0.64952, 0> // třetí prvek kostry

    texture
    {
        pigment
        {
            color red 1 green 1 blue 0   // barva materiálu povrchu implicitní plochy
        }
        finish
        {                                // optické vlastnosti materiálu povrchu
            ambient  0.2
            diffuse  0.4
            specular 0.6
            phong    0.6
            phong_size 60
            reflection 0
        }
    }
    scale 10
    translate <20, 20, 20>
}

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

3. Rozostření příliš blízkých či vzdálených objektů

První snímky, které byly před zhruba třiceti lety vytvořeny pomocí raytracerů, udivovaly veřejnost především přesným zpracováním odrazů paprsků (zrcadlové plochy) a v neposlední řadě také dokonalou ostrostí všech vykreslených objektů. Co na jednu stranu působí technicky dokonale však může působit nepřirozeně, protože snímky pořízené jakýmkoli reálným fotoaparátem, jsou vždy zaostřeny pouze na určitou vzdálenost, přičemž bližší a vzdálenější předměty jsou více či méně rozmazány. Paradoxní je, že právě rozostření – které lze považovat za určitou nedokonalost reálných optických snímačů – dokáží raytracery simulovat poměrně složitě a s mnohem většími výpočetními nároky (čas renderingu se zvyšuje, mnohdy i řádově). Přesto však POV-Ray dokáže rozostření simulovat. Princip spočívá v tom, že jedním pixelem v projekční ploše prochází více primárních paprsků, přičemž každý paprsek má poněkud jiný směr. Paprsky se střetávají v rovině nastavené uživatelem, což znamená, že jen ty předměty, které se nachází v této rovině, jsou zcela ostré. Barva vzdálenějších či bližších předmětů je (díky tomu, že na ně dopadá více primárních paprsků) rozprostřena do více pixelů výsledného obrázku, čímž dojde k žádoucímu rozostření.

povray4403

Obrázek 3: Typický snímek vykreslený raytracerem. Všechny objekty jsou ostré, jakoby měla kamera objektiv, který je v jednu chvíli zaostřen do všech vzdáleností.

4. Druhý demonstrační příklad – nastavení rozostření objektů

Způsob nastavení kamery (pozorovatele) tak, aby docházelo k rozostření objektů, je ukázán v dnešním druhém demonstračním příkladu. Rozostření je v současné verzi POV-Raye podporováno pouze pro perspektivní promítání, což nám však nevadí – jedná se o zdaleka nejpoužívanější způsob promítání vhodný pro tvorbu snímků určených pro prohlížení v běžných prohlížečích. Kamera je tedy nastavena běžným způsobem, tj. uvedením vektorů location a look_at, jejichž význam byl vysvětlen v předchozích částech tohoto seriálu. Navíc jsou však nastaveny i některé další atributy kamery popsané v dalším odstavci.

povray4404

Obrázek 4: Druhý demonstrační příklad – kamera je zaostřena na růžovou kouli v popředí.

Nejdůležitějším novým atributem je atribut focal_point, kterým se nastavuje bod, na který je kamera zaostřena. V závislosti na poloze tohoto bodu a hodnotě vektoru direction je vypočtena takzvaná rovina zaostření – ta je vždy kolmá na vektor direction a prochází bodem focal_point. Pouze předměty, které leží přímo v této rovině, jsou přesně zaostřeny. Dále je nastaven atribut aperture, kterým se udává míra rozostření. Čím větší je hodnota tohoto atributu tím více jsou předměty rozostřené, tento parametr tedy svým významem (nikoli však zadanou hodnotou) odpovídá nastavení clony u analogových fotoaparátů – menší otvor ve cloně vede – velmi zjednodušeně řečeno – k tvorbě více ostrých (a také kontrastních) snímků.

povray4405

Obrázek 5: Druhý demonstrační příklad – kamera je zaostřena na zelený kvádr uprostřed scény.

Posledním novým atributem je atribut blur_samples. Tímto parametrem se specifikuje počet primárních paprsků procházejících jedním pixelem. Čím větší je zde zadaná hodnota, tím přesnější je výpočet rozostření, ovšem na úkor celkové doby renderingu. Uvedená hodnota by se měla zvyšovat spolu s rostoucím rozlišením snímků, pro snímky běžných velikostí (1024×768 pixelů apod.) většinou dostačuje nastavit blur_samples na hodnotu od 20 do 40.

povray4406

Obrázek 6: Druhý demonstrační příklad – kamera je zaostřena na modrý válec v pozadí.

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

// ------------------------------------------------------------
// Druhý demonstrační příklad - rozmazání předmětů, které se
// nenachází v bodě zaostřeném kamerou.
//
// Založeno na zdrojovém kódu dodávaném spolu s POV-Rayem 3.0.
//
// rendering lze spustit příkazem:
// povray +W1024 +H768 +B100 +FN +D +Icamera2.pov
// ------------------------------------------------------------

// bod zaostření kamery
#declare FOCAL_POINT = <0,1,0>;//<1,1,-6>;
//  <-6, 1, 30>    // zaostření na válec
//  < 0, 1,  0>    // zaostření na hranol

// míra zaostření
// hodnota blízko nuly=malé rozostření
// 1,5=velké rozostření
#declare APERTURE = 0.4;

// kvalita rozostření, 1-malá, 20-velká
#declare BLUR_SAMPLES = 30;

// 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 "skies.inc"

// nastavení kamery (pozorovatele)
camera
{
    location <0.0, 1.0, -10.0>           // pozice kamery v prostoru
    look_at  <0.0, 1.0,  0.0>            // pohled kamery
    focal_point  FOCAL_POINT             // bod zaostření kamery
    aperture     APERTURE                // míra zaostření
    blur_samples BLUR_SAMPLES            // počet paprsků
}

// dva světelné zdroje
light_source
{
    <5, 30, -30>                         // pozice prvního světelného zdroje
    color White                          // barva světla
}

light_source
{
    <-5, 30, -30>                        // pozice prvního světelného zdroje
    color White                          // barva světla
}

// podkladová rovina
plane
{
    y, -1.0
    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
        }
    }
}

sky_sphere                               // použití objektu typu sky_sphere
{
    S_Cloud5
}

sphere                                   // objekt v popředí scény
{
    <1, 0, -6>, 0.5
    finish                               // odlesky a difúzní odraz
    {
        ambient 0.1
        diffuse 0.6
        phong 1.0
    }
    pigment                              // barva povrchu
    {
        NeonPink
    }
}

box
{
    <-1, -1, -1>, < 1,  1,  1>           // objekt uprostřed
    finish                               // odlesky a difúzní odraz
    {
        ambient 0.1
        diffuse 0.6
        phong 1.0
    }
    rotate <0, -20, 0>
    pigment                              // barva povrchu
    {
        Green
    }
}

cylinder                                 // objekt v pozadí scény
{
    <-6, 6, 30>, <-6, -1, 30>, 3
    finish                               // odlesky a difúzní odraz
    {
        ambient 0.1
        diffuse 0.6
        phong 1.0
    }
    pigment                              // barva povrchu
    {
        NeonBlue
    }
}

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

5. Třetí demonstrační příklad – postupná změna polohy bodu, na který je kamera zaostřena

Ve třetím demonstračním příkladu je zobrazena stejná scéna jako v příkladu druhém, ovšem změna bodu, na který se kamera zaměřuje, je prováděna postupně – v animaci. V prvním snímku animace je kamera zaměřena na bod zapsaný do proměnné FOCAL_POINT_FROM (jedná se o bod ležící v růžové kouli v popředí), ve snímku posledním pak na bod uložený v proměnné FOCAL_POINT_TO (modrý válec v pozadí). Aktuální bod platný pro právě renderovaný snímek se ukládá do proměnné FOCAL_POINT. Vlastní výpočet tohoto bodu je založený na lineární kombinaci bodu prvního a posledního, ovšem vzhledem k tomu, že kvůli perspektivě se vzdálenosti na výsledném obrázku nemění lineárně, je místo obvyklé hodnoty clock použita její druhá mocnina (bod zaměření se tedy od kamery vzdaluje proměnnou rychlostí). Výslednou animaci s celkem sto snímky v rozlišení 320×240 pixelů můžete získat pod tímto odkazem (jedná se, jak se již v tomto seriálu stalo zvykem, o animaci uloženou do formátu MPEG-1). Zdrojový kód třetího demonstračního příkladu má tvar:

// ------------------------------------------------------------
// Třetí demonstrační příklad - rozmazání předmětů, které se
// nenachází v bodě zaostřeném kamerou. Animace postupného
// přesunu bodu zaostření mezi třemi objekty ve scéně.
//
// Založeno na zdrojovém kódu dodávaném spolu s POV-Rayem 3.0.
//
// rendering lze spustit příkazem:
// povray +W320 +H240 +B100 +FN +D +KFF100 +Icamera3.pov
// ------------------------------------------------------------

// body zaostření kamery

// počáteční
#declare FOCAL_POINT_FROM = <1,1,-6>;

// koncový
#declare FOCAL_POINT_TO = <-6,1,30>;

// výpočet aktuálního bodu zaostření
// - bod se posunuje nelineárně
#declare FOCAL_POINT = (1-clock*clock)*FOCAL_POINT_FROM + clock*clock*FOCAL_POINT_TO;

// míra zaostření
// hodnota blízko nuly=malé rozostření
// 1,5=velké rozostření
#declare APERTURE = 0.4;

// kvalita rozostření, 1-malá, 20-velká
#declare BLUR_SAMPLES = 30;

// 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 "skies.inc"

// nastavení kamery (pozorovatele)
camera
{
    location <0.0, 1.0, -10.0>           // pozice kamery v prostoru
    look_at  <0.0, 1.0,  0.0>            // pohled kamery
    focal_point  FOCAL_POINT             // bod zaostření kamery
    aperture     APERTURE                // míra zaostření
    blur_samples BLUR_SAMPLES            // počet paprsků
}

// dva světelné zdroje
light_source
{
    <5, 30, -30>                         // pozice prvního světelného zdroje
    color White                          // barva světla
}

light_source
{
    <-5, 30, -30>                        // pozice prvního světelného zdroje
    color White                          // barva světla
}

// podkladová rovina
plane
{
    y, -1.0
    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
        }
    }
}

sky_sphere                               // použití objektu typu sky_sphere
{
    S_Cloud5
}

sphere                                   // objekt v popředí scény
{
    <1, 0, -6>, 0.5
    finish                               // odlesky a difúzní odraz
    {
        ambient 0.1
        diffuse 0.6
        phong 1.0
    }
    pigment                              // barva povrchu
    {
        NeonPink
    }
}

box
{
    <-1, -1, -1>, < 1,  1,  1>           // objekt uprostřed
    finish                               // odlesky a difúzní odraz
    {
        ambient 0.1
        diffuse 0.6
        phong 1.0
    }
    rotate <0, -20, 0>
    pigment                              // barva povrchu
    {
        Green
    }
}

cylinder                                 // objekt v pozadí scény
{
    <-6, 6, 30>, <-6, -1, 30>, 3
    finish                               // odlesky a difúzní odraz
    {
        ambient 0.1
        diffuse 0.6
        phong 1.0
    }
    pigment                              // barva povrchu
    {
        NeonBlue
    }
}

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

6. Změna směru paprsků vycházejících z kamery

Poslední vlastnost kamery, kterou je možné v POV-Rayi nastavit, je takzvaná perturbace čili ovlivnění směrů primárních paprsků, které vycházejí z kamery přes projekční plochu směrem do vykreslované scény. Při standardním nastavení raytraceru je každý paprsek poslán jedním pixelem projekční plochy, která tvoří výsledný rastrový obrázek. Ovšem směr těchto paprsků je možné ovlivnit nastavením atributu normal, podobně jako při modulaci normálových vektorů (bump mappingu). Pokud je atribut normal u kamery nastaven, prochází sice každým pixelem projekční plochy jeden paprsek (popř. více paprsků při využití antialiasingu), ovšem směr tohoto paprsku je změněn na základě aktuální hodnoty vypočtené z procedurálního vzorku či uživatelsky definované funkce specifikované v atributu normal. Takový primární paprsek pak ve skutečnosti nevychází přímo z kamery, ale jiného místa prostoru. Výsledkem je snímek, který byl jakoby vyfocen přes hrbolatý skleněný povrch. Požitím některých procedurálních vzorků, například spiral1 či crackle, dojde k úplnému „rozbití“ celé scény – viz snímky zobrazené v osmé kapitole.

7. Čtvrtý demonstrační příklad – ovlivnění paprsků procedurálním vzorkem

V dnešním čtvrtém a současně i posledním demonstračním příkladu je ukázána změna primárních paprsků vycházejících z kamery nastavené na perspektivní projekci. Primární paprsky jsou ovlivněny na základě procedurálních vzorků běžně používaných při vytváření procedurálních textur a/nebo modulaci normálových vektorů (bump mapping). Jedná se tedy o vzorky vypočítané na základě interních funkcí POV-Raye, i když je samozřejmě možné použít i uživatelsky definované funkce či dokonce externí rastrové obrázky (viz předchozí části seriálu, ve kterých jsme se zabývali texturováním). Pro ilustraci je použito sedm vzájemně odlišných vzorků, které se mění podle čísla snímku, který je právě renderován – vytvářená „animace“ (ve skutečnosti však jen sekvence na sebe nenavazujících rastrových obrázků) by tedy měla obsahovat přesně sedm snímků, čehož lze dosáhnout volbou +KFF 7. Následuje výpis zdrojového kódu čtvrtého demonstračního příkladu:

// ------------------------------------------------------------
// Čtvrtý demonstrační příklad - vykreslení souřadných os,
// podkladové roviny a implicitní plochy. Nastavení
// perspektivního promítání se změnou paprsků vycházejících
// z kamery na základě procedurální textury.
//
// rendering lze spustit příkazem:
// povray +W1024 +H768 +B100 +FN +D +KFF 7 +Icamera4.pov
// ------------------------------------------------------------

// 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 "stones.inc"
#include "glass.inc"

// nastavení kamery (pozorovatele)
camera
{
    perspective
    sky +y                               // natočení kamery ve směru osy y
    location  <30.0, 55.0, -30.0>        // pozice kamery v prostoru
    look_at   <15.0, 5.0, 15.0>          // pohled kamery - střed obrázku
    normal                               // ovlivnění směru paprsků
    {                                    // které vychází z kamery
        #if(frame_number=1)              // na základě čísla snímku
            waves frequency 0.2
        #end
        #if(frame_number=2)
            dents
        #end
        #if(frame_number=3)
            bozo
            turbulence 0.5
        #end
        #if(frame_number=4)
            spiral1 2
        #end
        #if(frame_number=5)
            waves
        #end
        #if(frame_number=6)
            crackle 0.15
        #end
        #if(frame_number=7)
            bumps 0.15
        #end
        scale 0.3
    }
}

// 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, -15
    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 10
    }
}

// X-ová osa
union
{
    // šipka
    cone
    {
        <0,0,0>,1,
        <25,0,0>,1
    }
    cone
    {
        <25,0,0>,1,
        <27,0,0>,5
    }
    cone
    {
        <27,0,0>,5,
        <35,0,0>,0
    }
    // X
    sphere
    {
        <35,5,0>, 1
    }
    sphere
    {
        <42,5,0>, 1
    }
    sphere
    {
        <35,5,10>, 1
    }
    sphere
    {
        <42,5,10>, 1
    }
    cone
    {
        <35,5,0>,1,
        <42,5,10>,1
    }
    cone
    {
        <35,5,10>,1,
        <42,5,0>,1
    }
    texture
    {
        pigment                          // barva povrchu
        {
            color red 1.0
        }
        finish
        {                                // odlesky a odrazy na povrchu
            diffuse 0.7
            phong 1                      // velikost a síla odlesků
            phong_size 30
            reflection 0.0
        }
    }
}

// Y-ová osa
union
{
    // šipka
    cone
    {
        <0,0,0>, 1,
        <0,25,0>, 1
    }
    cone
    {
        <0,25,0>, 1,
        <0,27,0>, 5
    }
    cone
    {
        <0,27,0>, 5,
        <0,35,0>, 0
    }
    // Y
    sphere
    {
        <5,35,10>, 1
    }
    sphere
    {
        <12,35,10>, 1
    }
    sphere
    {
        <8.5,35,0>, 1
    }
    cone
    {
        <8.5,35,5>, 1,
        <5,35,10>, 1
    }
    cone
    {
        <8.5,35,5>, 1,
        <12,35,10>, 1
    }
    cone
    {
        <8.5,35,5>, 1,
        <8.5,35,0>, 1
    }
    texture
    {
        pigment                          // barva povrchu
        {
            color green 1.0
        }
        finish
        {                                // odlesky a odrazy na povrchu
            diffuse 0.7
            phong 1                      // velikost a síla odlesků
            phong_size 30
            reflection 0.0
        }
    }
}

// Z-ová osa
union
{
    // šipka
    cone
    {
        <0,0,0>, 1,
        <0,0,25>, 1
    }
    cone
    {
        <0,0,25>, 1,
        <0,0,27>, 5
    }
    cone
    {
        <0,0,27>, 5,
        <0,0,35>, 0
    }
    // Z
    sphere
    {
        < 12,-5, 25>, 1
    }
    sphere
    {
        < 5, -5, 25>, 1
    }
    sphere
    {
        < 12, -5, 35>, 1
    }
    sphere
    {
        < 5, -5, 35>, 1
    }
    cone
    {
        <12,-5,35>, 1,
        <5,-5,25>, 1
    }
    cone
    {
        <12,-5,35>, 1,
        <5,-5,35>, 1
    }
    cone
    {
        <12,-5,25>, 1,
        <5,-5,25>, 1
    }
    texture
    {
        pigment                          // barva povrchu
        {
            color blue 1.0
        }
        finish
        {                                // odlesky a odrazy na povrchu
            diffuse 0.7
            phong 1                      // velikost a síla odlesků
            phong_size 30
            reflection 0.0
        }
    }
}

blob
{                                        // definice implicitní plochy s využitím původní syntaxe
    threshold 0.6                        // hraniční hodnota
    component 1.0, 1.0, < 0.750,  0, 0>       // prvek kostry: síla, poloměr, souřadnice v prostoru
    component 1.0, 1.0, <-0.375,  0.64952, 0> // druhý prvek kostry
    component 1.0, 1.0, <-0.375, -0.64952, 0> // třetí prvek kostry

    texture
    {
        pigment
        {
            color red 1 green 1 blue 0   // barva materiálu povrchu implicitní plochy
        }
        finish
        {                                // optické vlastnosti materiálu povrchu
            ambient  0.2
            diffuse  0.4
            specular 0.6
            phong    0.6
            phong_size 60
            reflection 0
        }
    }
    scale 10
    translate <20, 20, 20>
}

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

8. Snímky získané renderingem čtvrtého demonstračního příkladu

povray4407

Obrázek 7: Ovlivnění primárních paprsků procedurálním vzorkem „waves“ se změněnou frekvencí.

povray4408

Obrázek 8: Ovlivnění primárních paprsků procedurálním vzorkem „dents“.

povray4409

Obrázek 9: Ovlivnění primárních paprsků procedurálním vzorkem „bozo“.

povray4410

Obrázek 10: Ovlivnění primárních paprsků procedurálním vzorkem „spiral1“.

povray4411

Obrázek 11: Ovlivnění primárních paprsků procedurálním vzorkem „waves“.

povray4412

Obrázek 12: Ovlivnění primárních paprsků procedurálním vzorkem „crackle“.

povray4413

Obrázek 13: Ovlivnění primárních paprsků procedurálním vzorkem „bumps“.

povray4414

Obrázek 14: Ovlivnění primárních paprsků procedurálním vzorkem „waves“ se změněnou fází.

Našli jste v článku chybu?

20. 1. 2009 9:06

Ano, v POV-Rayi se nezapisuje clonové číslo (jak ho známe z fotoaparátů), ale hodnota odpovídající průměru jejího otvoru (ovšem jednotka nesedí, je to jen přímo úměrné reálnému průměru). Zaclonění vlastně znamená, že se z poměrně velkého kulového vrchlíku čočky využije pouze malá plocha.

20. 1. 2009 6:54

pht (neregistrovaný)
Myslím, že u toho zaostření nejde ani tak o to, že kamera je zaostřena na všechny vzdálenosti současně, ale že má nekonečně velkou clonu (aperture - což není míra zaostření ale právě ta clona). Pokud bude mít kamera konečně velkou clonu, pak podle její velikosti budou objekty mimo bod zaostření více či méně rozmazané. (Jak koukám na ten příklad, tak povray tam má asi převrácenou hodnotu clony.)
Vitalia.cz: Taky věříte na pravidlo 5 sekund?

Taky věříte na pravidlo 5 sekund?

Vitalia.cz: Jmenuje se Janina a žije bez cukru

Jmenuje se Janina a žije bez cukru

Podnikatel.cz: Změny v cestovních náhradách 2017

Změny v cestovních náhradách 2017

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

DigiZone.cz: TV Philips a Android verze 6.0

TV Philips a Android verze 6.0

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Root.cz: Certifikáty zadarmo jsou horší než za peníze?

Certifikáty zadarmo jsou horší než za peníze?

Vitalia.cz: Potvrzeno: Pobyt v lese je skvělý na imunitu

Potvrzeno: Pobyt v lese je skvělý na imunitu

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

120na80.cz: Na ucho teplý, nebo studený obklad?

Na ucho teplý, nebo studený obklad?

Vitalia.cz: Spor o mortadelu: podle Lidlu falšovaná nebyla

Spor o mortadelu: podle Lidlu falšovaná nebyla

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

DigiZone.cz: Rádio Šlágr má licenci pro digi vysílání

Rádio Šlágr má licenci pro digi vysílání

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

Měšec.cz: Jak levně odeslat balík přímo z domu?

Jak levně odeslat balík přímo z domu?

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

120na80.cz: Horní cesty dýchací. Zkuste fytofarmaka

Horní cesty dýchací. Zkuste fytofarmaka