Hlavní navigace

Nastavení kamery v POV-Rayi

6. 1. 2009
Doba čtení: 18 minut

Sdílet

Ve čtyřicáté druhé části seriálu o raytraceru POV-Ray si ukážeme, jakým způsobem je možné specifikovat základní vlastnosti kamery. Změnou parametrů kamery lze levotočivý souřadnicový systém zaměnit za systém pravotočivý, ovlivnit způsob promítání (perspektivní, ortografické, rybí oko), natáčet celou scénou atd.

Obsah

1. Nastavení kamery v POV-Rayi
2. Specifikace pozice kamery v prostoru
3. Orientace a natočení kamery
4. První demonstrační příklad – perspektivní projekce s natočením kamery
5. Nastavení vektorů up a right – změna poměru výška:šířka
6. Druhý demonstrační příklad – ortografická projekce se změnou poměru výška:šířka
7. Obsah další části seriálu

1. Nastavení kamery v POV-Rayi

V předchozích částech tohoto seriálu jsme si ukázali poměrně velké množství demonstračních příkladů. Ve všech vykreslovaných scénách se přitom vždy vyskytovala kamera (pozorovatel), jejíž význam a vlastnosti jsme si blíže nepopsali. Prozatím jsme si v prakticky všech demonstračních příkladech vystačili s umístěním kamery do určitého bodu v prostoru a natočením kamery do požadovaného směru, přičemž byla použita buď perspektivní projekce nebo projekce ortografická (pravoúhlá) a většina zbývajících parametrů kamery byla ponechána na implicitních hodnotách. V dnešní části si podrobněji jednotlivé vlastnosti kamery popíšeme, protože v některých případech je nutné přesně porozumět tomu, jakým způsobem POV-Ray s kamerou pracuje, tj. jak se provádí její umístění a natočení v prostoru, projekce objektů do projekční roviny atd. Že se nejedná o zcela triviální záležitost poznáme ve chvíli, kdy budeme měnit zorný úhel objektivu, typ použité projekce (například je možné vytvářet scény snímané objektivem typu „rybí oko“, vytvářet panoramatické pohledy atd.) nebo způsob rozostření příliš blízkých či naopak vzdálených objektů.

povray4201

Obrázek 1: Typická scéna vykreslená raytracerem. Tato scéna se od reálného snímku odlišuje především v tom, že všechny objekty jsou perfektně ostré. Mnoho raytracerů (ale i programů založených na vykreslování polygonů pomocí knihoven OpenGL či Direct 3D) nedokáže blízké či vzdálené objekty uspokojivým způsobem rozostřit.

Jaké parametry kamery je tedy možné v POV-Rayi měnit? Především se jedná o změnu pozice kamery v prostoru a modifikaci její orientace, tj. určení směru, do kterého bodu se kamera dívá, a v neposlední řadě také natočení kamery okolo vektoru představujícího směr pohledu. Dále lze změnit typ projekce – kromě klasické a nejčastěji používané projekce perspektivní lze použít projekci ortografickou (využijí ji zejména technici při tvorbě výkresové dokumentace), projekci typu „rybí oko“ (výsledné snímky mohou mít buď kruhový nebo obdélníkový tvar), projekci vhodnou pro tvorbu snímků určených pro kina Omnimax (též IMAX, jedná se o kina, ve kterých se snímky promítají na polokouli), panoramatickou projekci (ta byla využita v některých počítačových hrách i „3D“ prezentacích) a dále projekci na válec či kouli. V neposlední řadě lze také změnit zorný úhel (konkrétní chování závisí na zvoleném typu projekce) či rozostřit ty objekty, které se nachází v přílišné blízkosti či naopak vzdálenosti od objektivu, čímž se simuluje chování reálného oka, kamery či fotoaparátu.

povray4202

Obrázek 2: V POV-Rayi je možné, ovšem za cenu citelného zpomalení výpočtu, provést rozostření objektů v závislosti na jejich vzdálenosti od kamery a na nastavení jejich optických parametrů. Vykreslení této scény na Amize 500 ve standardním rozlišení (640×512 pixelů) by trvalo přes 40 hodin! (Mimochodem, historie POV-Raye začala právě na Amize, protože POV-Ray vychází ze staršího raytraceru nazvaného DKBTrace vyvíjeného právě pro tento legendární stroj.)

2. Specifikace pozice kamery v prostoru

Nejběžnější úlohou, se kterou se setkáme při tvorbě prakticky všech scén, je umístění kamery do vhodného místa v prostoru a natočení kamery tak, aby snímala požadovanou část scény. Kamera (někdy se též nazývá pozorovatel) je v POV-Rayi specifikovaná svou pozicí v prostoru, směrem pohledu, natočením, zorným úhlem, typem projekce a několika dalšími nepovinnými parametry. Ve scéně se může nacházet pouze jediná kamera představovaná uzlem camera, což je poměrně velká výjimka, protože POV-Ray většinou neomezuje maximální počet objektů nějakého typu. Geometrický význam některých parametrů kamery se liší podle toho, jaká projekce byla vybrána. V této kapitole tedy budu pro jednoduchost předpokládat, že se používá perspektivní projekce, která je v praxi využívána zdaleka nejčastěji. Již v úvodních částech tohoto seriálu jsme si řekli, že při vykreslování scény pracují raytracery tak, že vrhají z pozice kamery do scény paprsky (polopřímky) a na základě průsečíků paprsků s tělesy či přímo světelnými zdroji je vypočtena barva pixelu v místě, kde vrhaný paprsek protíná projekční plochu (představovanou cílovým rastrovým obrázkem).

povray4203

Obrázek 3: Význam základních parametrů kamery (pozorovatele) při volbě perspektivní projekce.

Základním principem raycastinguraytracingu je vyslat jeden paprsek každým pixelem displeje, čímž je automaticky určen směr vrhaného paprsku. Vzhledem k tomu, že kamera je při volbě perspektivního zobrazení představována bezrozměrným bodem, má prostor, do nějž jsou paprsky přes projekční plochu vrhány, tvar jehlanu, jehož vrchol leží v pozici kamery a tvar jehlanu (úhly svírané protilehlými stěnami a vzdálenost podstavy) i jeho orientace v prostoru je určena na základě parametrů kamery. Význam těchto parametrů je ukázán na třetím obrázku. Způsob (a také pořadí!) jejich zápisu v uzlu camera je následující:

camera
{
   typ projekce
   location  <loc>              // pozice kamery
   sky       <sky vector>       // natočení kamery
   up        <up vector>        // parametry projekční plochy
   right     <right vector>
   direction <direction vector> // orientace kamery
   angle     zorný úhel
   look_at   <target>           // bod, na který je kamera namířena
/* lineární transformace - posun, rotace, změna měřítka */
} 

Ze třetího obrázku je patrné, že některé parametry se přímo týkají vlastností kamery (poloha – location, orientace – look_at, direction), další pak velikosti a tvaru projekční plochy (vektory up a right, částečně také hodnota parametru angle). Nejdůležitějším parametrem, který zásadním způsobem ovlivňuje výslednou scénu, je pozice kamery v prostoru určená hodnotou atributu nazvaného příhodně location. Mělo by se jednat o první atribut uzlu camera, protože POV-Ray na základě tohoto a některých dalších parametrů provádí automatické výpočty při vytváření lokálního souřadného systému kamery i příslušné transformační matice. Hodnotou atributu location je trojice souřadnic x, y, z uzavřená, jak je v POV-Rayi zvykem, do úhlových závorek (v syntaxi POV-Raye se nerozlišují body od vektorů, i když se z hlediska matematiky jedná o odlišné elementy), popřípadě je možné použít výraz využívající předdefinované jednotkové vektory x, y a z.

povray4204

Obrázek 4: Atribut location určuje souřadnice v prostoru, na nichž se kamera nachází. V případě, že tento atribut není v uzlu camera zapsán, použije se implicitní hodnota představovaná bodem [0, 0, 0].

V případě, že atribut location není v uzlucamera zapsán, je použita implicitní hodnota představovaná bodem [0, 0, 0], což v mnoha případech může vést k tomu, že kamera bude snímat prostor mimo modelovanou scénu! Ve chvíli, kdy se místo vykreslované scény objeví pouze černé pozadí (popř. barva nastavená atributem background), je vhodné na prvním místě zkontrolovat, zda je korektně nastavená pozice a orientace kamery a teprve poté zjistit, zda se kamera nenachází uvnitř nějakého tělesa či zda jsou správně rozmístěny světelné zdroje. Kameru je možné, ostatně jako každý jiný geometrický objekt, přesunout i pomocí lineární transformace translate. Rozdíl mezi určením pozice kamery atributem location a posunem kamery pomocí translate spočívá v tom, že při posunu se nemění orientace ani natočení kamery, zatímco při každé změně atributu location je proveden přepočet orientace kamery v závislosti na hodnotě dále popsaného atributu look_at.

3. Orientace a natočení kamery

Po umístění kamery do zvoleného bodu v prostoru je nutné určit její prostorovou orientaci a také natočení. Interně je prostorová orientace a natočení kamery reprezentována trojicí na sebe kolmých vektorů, které tvoří lokální souřadný systém, jenž je možné proti globálnímu souřadnému systému různým způsobem natáčet. V praxi se však v naprosté většině případů nespecifikují přímo složky těchto vektorů, protože je to nepraktické a především neintuitivní (kromě toho lze třetí vektor vypočítat ze znalosti dvou dalších vektorů). Orientace kamery se místo toho zadává pomocí bodu, na který je kamera namířena – jedná se o atribut look_at (tento atribut MUSÍ být umístěn na posledním místě, zejména při specifikaci vektorů sky, up a right – viz další text). Vzhledem k tomu, že je zadaná jak pozice kamery (location), tak i bod, na který se kamera dívá (look_at), lze jednoduše vypočítat orientaci kamery v prostoru. Nejprve se provádí rotace kamery (doprava či doleva) okolo y-ové osy, posléze se kamera otáčí nahoru a dolů tak dlouho, až je kamera skutečně namířena do bodu look_at, tj. paprsek vržený pixelem uprostřed projekční plochy bude tímto bodem procházet. Výsledkem výpočtu je hodnota vektoru direction.

povray4205

Obrázek 5: Určení orientace a natočení kamery v prostoru.

Na první pohled by se mohlo zdát, že zadáním dvou bodů – location a look_at – je jednoznačně určen i lokální souřadný systém kamery. Ve skutečnosti tomu tak není, protože ze dvou bodů lze vypočítat pouze jeden vektor a pro jednoznačně specifikovaný lokální souřadný systém potřebujeme znát vektory minimálně dva (třetí vektor se jednoduše dopočítá vektorovým součinem). Pomůckou, která nám při zadávání lokálního souřadného systému kamery v tomto případě pomůže, je atribut sky, jehož hodnotou je vektor určující, jakým způsobem je kamera natočena okolo vektoru direction (jedná se o spojnici bodů location a look_at, viz předchozí odstavec). Implicitní hodnotou tohoto atributu je vektor (0,1,0), což plně koresponduje s levotočivým souřadným systémem, který je v POV-Rayi použit (v takto pojatém souřadném systému míří nahoru souřadná osa y – viz šestý obrázek uvedený v další kapitole). Většinou není zapotřebí hodnotu tohoto vektoru měnit, avšak v případě potřeby je možné kameru natočit o jakýkoli úhel a simulovat tak například průlet nad modelovanou scénou letadlem, které je při zatáčení nakloněno.

Orientaci kamery a její natočení lze měnit i pomocí lineární transformace rotate, což je však v mnoha případech zbytečně komplikované – jednodušší bývá nastavení dvou bodů location a look_at, popřípadě doplněných o vektor sky. Je však vhodné vědět, že i lineární transformaci rotate je možné při specifikaci parametrů kamery použít, čehož lze využít v některých animacích.

4. První demonstrační příklad – perspektivní projekce s natočením kamery

Dnešní první demonstrační příklad je velmi jednoduchý. Ve vykreslované scéně se nachází objekt představující tři osy souřadného systému spolu s jejich popisem a také podkladová rovina. Jedná se o model vzniklý konverzí ze zdrojového kódu scény určené pro jiný raytracer – Vivid (tento raytracer používá poněkud jinou syntaxi než POV-Ray a taktéž pravotočivý souřadný systém, přesto však byla konverze poměrně snadná). Ve scéně je kromě samotných geometrických těles vytvořeno několik světelných zdrojů a také kamera (pozorovatel). Ta je umístěna do bodu [30, 55, –30], pohled kamery směřuje na bod [15, 5, 15]. Na dvacátém osmém řádku je možné změnit hodnotu vektoru sky, jenž určuje natočení kamery okolo osy představované vektorem direction. Ten je vypočten, jak jsme si již řekli v předchozí kapitole, na základě pozice kamery a bodu, na nějž je kamera namířena; v tomto příkladu se tedy jedná o vektor [15, 5, 15] – [30, 55, –30] = (-15, –50, 45). V případě, že je dvacátý osmý řádek zakomentován, je výsledkem renderingu obrázek číslo šest; pokud je naopak hodnota vektoru sky skutečně změněna, vznikne po vykreslení tohoto příkladu POV-Rayem obrázek číslo sedm.

povray4206

Obrázek 6: Levotočivý souřadný systém použitý v POV-Rayi. Obrázek byl vytvořen pomocí prvního demonstračního příkladu.

Zdrojový kód tohoto demonstračního příkladu má tvar:

// ------------------------------------------------------------
// První demonstrační příklad - vykreslení souřadných os
// a podkladové roviny. Nastavení perspektivního promítání se
// změnou vektoru "sky" - viz řádek číslo 28.
//
// rendering lze spustit příkazem:
//     povray +W800 +H600 +B100 +FN +D +Icamera1.pov +Ocamera1.png
//
// (pro náhled postačí zadat povray camera1.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
{
    location  <30, 55, -30>              // pozice kamery
    sky       <1, 1, 1>                  // natočení kamery
    look_at   <15, 5, 15>                // 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, -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
        }
    }
}

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray4207

Obrázek 7: Natočení kamery pomocí změny hodnoty vektoru „sky“.

5. Nastavení vektorů up a right – změna poměru výška:šířka

Kromě parametrů, které ovlivňují pozici a orientaci kamery, je možné nastavit i další hodnoty použité při promítání. Důležitou dvojici parametrů představují hodnoty vektorů up a right. Na osmém obrázku jsou oba vektory zvýrazněny. Z obrázku (který je samozřejmě platný pouze při volbě perspektivní projekce) je patrné, že na základě délek těchto vektorů se určuje, jaký tvar bude mít jehlan omezující prostor, který je pro danou konfiguraci kamery viditelný. Čím delší jsou tyto vektory, tím větší prostor se musí na projekční plochu, představující výsledný obrázek, vejít. Důležité přitom je, že je možné oba vektory nastavovat nezávisle na sobě a tím pádemměnit poměr šířky a výšky výsledného obrázku. Tato technika se velmi často používala především v minulosti, protože mnoho v té době používaných grafických režimů (například slavný mód 13h na kartě VGA, mód Y na téže grafické kartě či některé grafické režimy Amigy) nemělo čtvercové pixely. Změnou poměru délek vektorů up a right bylo možné i při použití těchto grafických režimů vykreslit scénu tak, aby například původní čtverec zůstal i po vykreslení čtvercem, i když počet pixelů podél jeho vertikální a horizontální hrany byl odlišný.

povray4208

Obrázek 8: Význam vektorů „up“ a „right“ při nastavování parametrů kamery i promítací roviny.

Implicitní hodnota vektoru up je (0,1,0), vektor je tedy orientován ve směru osy y a má jednotkovou délku. Hodnota vektoru right je (4/3,0,0), tj. vektor je orientován ve směru osy x. Poměr délek obou vektorů, tj. hodnota 4/3, je odvozena od typického poměru délek stran nejčastěji používaných grafických režimů se čtvercovými pixely – 256×192, 320×240, 640×480, 800×600, 1024×768, 1280×960 či 1600×1200. Důležité je, aby každé dva vektory z trojice vektorů up, right a direction byly na sebe kolmé; pokud by tato podmínka nebyla splněna, byl by obrázek zkosený (v některých případech dokonce POV-Ray zahlásí chybu při výpočtu inverzní transformační matice). U většiny scén se přímo nastavují pouze vektory up a right, které jsou navíc transformovány na základě atributu look_at, takže zajištění kolmosti je ponecháno na samotném POV-Rayi. Problémy by mohly nastat ve chvíli, kdy se atribut look_at neuvede nebo není umístěn na posledním místě v uzlu camera. Z tohoto důvodu je důležité, aby byl atribut look_at vždy zapsán až na konec uzlu camera a vektor direction nebyl přímo zadaný (většinou to nemá smysl, neboť POV-Ray si tento vektor dopočítá, jak již víme z předchozího textu, sám).

povray4209

Obrázek 9: U tohoto obrázku byla hodnota vektoru „up“ nastavena na (0,2,0) namísto původní hodnoty (0,1,0).

6. Druhý demonstrační příklad – ortografická projekce se změnou poměru výška:šířka

Ve druhém demonstračním příkladu je ukázán způsob postupné změny poměru výšky a šířky výsledného obrazu při použití ortografické projekce (tato projekce se od výše popsané perspektivní projekce liší v tom, že všechny primární paprsky jsou rovnoběžné, protože „objektiv“ kamery má v tomto případě tvar čtverce či obdélníku a nikoli bezrozměrného bodu). Ve vykreslované scéně se nachází devět kvádrů pokrytých procedurálními texturami, přičemž kamera je umístěna přesně nad střed horní čtvercové stěny prostředního kvádru; jedná se o souřadnice [0, 0, –1]. Směr pohledu kamery je totožný se souřadnou osou z, tj. kamera směřuje směrem k počátku souřadné soustavy (do bodu [0, 0, 0]). V případě, že výška a šířka výsledného obrázku je shodná, například 1024×1024 pixelů, a pixely jsou při zobrazení čtvercové, je možné změnou délek vektorů right a up měnit poměr výšky ku šířce. Shodné délky obou zmiňovaných vektorů budou mít za následek zobrazení horních stěn kvádrů ve tvaru čtverce, samozřejmě za předpokladu, že oba vektory budou na sebe kolmé. Odlišné délky vektorů se projeví na změně výšky a/nebo šířky (ze čtverců se stanou obdélníky), protože se změní velikost oblasti, která se musí promítnout do výsledného obrázku, jehož rozlišení se nemění.

povray4210

Obrázek 10: První snímek animace vytvořené pomocí druhého demonstračního příkladu.

Změna délek vektorů right a up je ovlivněna hodnotou již dříve popsané interní proměnné clock, kterou je možné automaticky zvyšovat při vytváření animací. Aby byla animace cyklická, není při změně délek obou zmíněných vektorů použita přímo hodnota proměnné clock, ale výsledek matematického výrazu sin(radians(180­.0*clock)), čímž je zaručeno, že při vykreslování počátečního i koncového snímku bude mít výraz nulovou hodnotu, při vykreslování prostředního snímku bude výraz nabývat hodnoty maximální (jedna) a změna hodnoty bude díky použití goniometrické funkce plynulá. Výslednou animaci ve formátu MPEG-1 v rozlišení 320×320 pixelů, která obsahuje celkem 200 snímků, je možné získat pod tímto odkazem. Povšimněte si, že ani při změně výšky a šířky zobrazované oblasti nejsou nikdy viditelné boční stěny kvádrů. V případě perspektivní projekce by tyto stěny mohly být viditelné (a odpovídajícím způsobem by se také zdeformoval tvar průmětů stěn horních), ovšem v projekci ortografické budou za daných podmínek viditelné vždy pouze stěny horní.

povray4211

Obrázek 11: Další snímek animace vytvořené pomocí druhého demonstračního příkladu. Zde je délka vektorů „up“ a „left“ shodná.

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

// ------------------------------------------------------------
// Druhý demonstrační příklad - ortografická projekce se změnou
// poměru výška : šířka.
//
// rendering lze spustit příkazem:
//     povray +W1024 +H1024 +B100 +FN +D +Icamera3.pov +Ocamera3.png
//
// !POZOR: scénu je nutné vykreslit se stejným horizontálním
//         i vertikálním rozlišením!
// ------------------------------------------------------------

#version 3.0
global_settings                // globální nastavení parametrů scény
{
    assumed_gamma 2.2
}

#include "colors.inc"
#include "functions.inc"       // v tomto souboru jsou uloženy odkazy
                               // na interní funkce POV-Raye

// výpočet hodnoty proměnné použité pro změnu výšky a šířky obrazu
#declare clk = sin(radians(180.0*clock));

camera                         // nastavení kamery
{
    orthographic               // bez perspektivy
    location <0, 0, -1>        // pozice kamery
    right 15*x*(0.5+clk)       // šířka a výška snímané části scény
    up 15*y*(1.5-clk)
    direction z                // směr pohledu kamery (k počátku)
}

light_source                   // světelný zdroj
{
    <200, 200, -500>           // pozice
    color White                // barva
}

#declare COL1=-4.5;            // posuny objektů ve vztahu
#declare COL2= 0.0;            // k pomyslné mřížce
#declare COL3= 4.5;            // o rozměrech 3x3
#declare ROW1= 4.5;
#declare ROW2= 0.0;
#declare ROW3=-4.5;
#declare Z=0.0;

#declare COLMAP1 = color_map   // náhrada původní barvové mapy
{
    [0.02 color rgb <0.65, 0.45, 0.25> ]
    [0.06 color rgb <0.55, 0.40, 0.20> ]
    [0.10 color rgb <0.15, 0.10, 0.05> ]
    [1.00 color rgb <0.75, 0.60, 0.40> ]
}

#declare COLMAP2 = color_map   // druhá barvová mapa
{
    [0.0  color Blue]          // hodnota 0 je dolní mezí, pro kterou lze specifikovat barvu
    [0.7  color White]
    [1.0  color Red]           // hodnota 1 je naopak horní mezí
}

#declare COLMAP3 = color_map   // třetí barvová mapa
{
    [0.0  color Yellow]        // hodnota 0 je dolní mezí, pro kterou lze specifikovat barvu
    [0.7  color Black]
    [1.0  color Red]           // hodnota 1 je naopak horní mezí
}

#declare OBJECT = box
{                              // testovací objekt - jednoduchý kvádr
    <-2,-2, 0>,
    < 2, 2, 1>
}

// funkce použité při deklaraci procedurálních textur
#declare FUNCTION1 = function
{
    (1.0+cos(5*x)+sin(6*y))
}

#declare FUNCTION3 = function
{
    0.5+sin(x)+y/2
}

#declare FUNCTION4 = function
{
    f_spiral2(cos(x),y,z)
}

#declare FUNCTION5 = function
{
    f_spiral1(x+sin(y), y+sin(x), z)
}

#declare FUNCTION6 = function
{
    f_spiral1(1.5*x,cos(3*y),z)
}

#declare FUNCTION7 = function
{
    0.5+0.5*sin(15*sqrt(x*x+y*y+z*z))
}

#declare FUNCTION8 = function
{
    0.5+0.5*sin(6*x)*cos(6*y)
}

// procedurální textura vytvořená na základě Mandelbrotovy množiny
#declare mandel_01 =
    pigment
    {
        mandel 300
        frequency 1.18039215686275
        phase 0
        color_map
        {
            [ 0 color rgbf < 0.8253968, 1, 0, 0 > ]
            [ 0.1490196 color rgbf < 0.03174603, 1, 0, 0 > ]
            [ 0.1529412 color rgbf < 0, 1, 0, 0 > ]
            [ 0.4 color rgbf < 0, 0, 0, 0 > ]
            [ 0.4039216 color rgbf < 0, 0, 0, 0 > ]
            [ 0.5254902 color rgbf < 0, 0.7936508, 0, 0 > ]
            [ 0.6509804 color rgbf < 0.7936508, 1, 0, 0 > ]
            [ 0.7764706 color rgbf < 1, 1, 1, 0 > ]
            [ 0.9607843 color rgbf < 1, 1, 0.03174603, 0 > ]
            [ 0.9647059 color rgbf < 1, 1, 0, 0 > ]
            [ 1 color rgbf < 0.8253968, 1, 0, 0 > ]
        }
        translate < 0.03966643105, -0.6835399935, 0 >
        scale < 7513.30888753061, 7507.92085650548, 1 >
    }

// další procedurální textura vytvořená na základě Mandelbrotovy množiny
#declare mandel_02 =
    pigment
    {
        mandel 1000
        frequency 3.92549019607843
        phase 0
        color_map
        {
            [ 0 color rgbf < 1, 1, 0.5079365, 0 > ]
            [ 0.2156863 color rgbf < 0.7936508, 0.5555556, 0, 0 > ]
            [ 0.7686275 color rgbf < 0.2222222, 0, 0, 0 > ]
            [ 0.9960784 color rgbf < 0, 0, 0, 0 > ]
            [ 1 color rgbf < 1, 1, 0.5079365, 0 > ]
        }
        translate < 0.2183997769606, -0.6857989345303, 0 >
        scale < 478316.318905076, 478316.326528373, 1 >
    }

// devět objektů potažených texturou
object
{
    OBJECT
    texture
    {
        pigment
        {
            function
            {
                FUNCTION1(x,y,z)
            }
            color_map
            {
                COLMAP1
            }
        }
    }
    translate <COL1, ROW1, Z>
}


object
{
    OBJECT
    texture
    {
        pigment
        {
            function
            {
                FUNCTION3(x,y,z)
            }
            color_map
            {
                COLMAP1
            }
        }
    }
    translate <COL2, ROW1, Z>
}

object
{
    OBJECT
    texture
    {
        pigment
        {
            mandel_02
        }
    }
    translate <COL3, ROW1, Z>
}

object
{
    OBJECT
    texture
    {
        pigment
        {
            function
            {
                FUNCTION4(x,y,z)
            }
            color_map
            {
                COLMAP2
            }
        }
    }
    translate <COL1, ROW2, Z>
}


object
{
    OBJECT
    texture
    {
        pigment
        {
            function
            {
                FUNCTION5(x,y,z)
            }
            color_map
            {
                COLMAP2
            }
        }
    }
    translate <COL2, ROW2, Z>
}

object
{
    OBJECT
    texture
    {
        pigment
        {
            function
            {
                FUNCTION6(x,y,z)
            }
            color_map
            {
                COLMAP2
            }
        }
    }
    translate <COL3, ROW2, Z>
}

object
{
    OBJECT
    texture
    {
        pigment
        {
            function
            {
                FUNCTION7(x,y,z)
            }
            color_map
            {
                COLMAP3
            }
        }
    }
    translate <COL1, ROW3, Z>
}


object
{
    OBJECT
    texture
    {
        pigment
        {
            function
            {
                FUNCTION8(x,y,z)
            }
            color_map
            {
                COLMAP3
            }
        }
    }
    translate <COL2, ROW3, Z>
}

object
{
    OBJECT
    texture
    {
        pigment
        {
            mandel_01
            frequency 1.5                // změna parametrů procedurální textury
        }
    }
    translate <COL3, ROW3, Z>
}



// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray4212

Obrázek 12: Prostřední snímek animace vytvořené pomocí druhého demonstračního příkladu. Zde je vertikální natažení obrázku největší, protože hodnota vektoru „right“ dosáhla maxima a naopak vektor „up“ má minimální délku.

7. Obsah další části seriálu

V následující části tohoto seriálu se budeme dále zabývat některými možnostmi, které nám POV-Ray nabízí při práci s kamerou. Ukážeme si, jakým způsobem je možné měnit zorný úhel kamery, jak lze použít další typy projekcí (panoramatická, „rybí oko“, projekce na válec či kouli apod.) a také simulaci rozostření objektů, které se nachází příliš blízko či naopak příliš daleko od kamery. Na dalších třech obrázcích jsou ukázány některé možnosti POV-Raye, které si popíšeme v další části tohoto seriálu.

povray4213

Obrázek 13: Vložení průhledné zvlněné plochy, která láme světelné paprsky, před kameru má velký vliv na výsledný dojem z vykreslené scény. Zvlnění plochy je řízeno – jak je ostatně v POV-Rayi zvykem – pomocí vestavěné funkce, původně určené pro tvorbu procedurálních textur.

UX DAy - tip 2

povray4214

Obrázek 14: Panoramatický pohled na demonstrační scé­nu.

povray4215

Obrázek 15: Pohled na demonstrační scénu objektivem typu „rybí oko“ při nastavení zorného úhlu 180°.

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.