Hlavní navigace

Pokročilá práce s kamerou v POV-Rayi

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

Sdílet

V dnešní části seriálu o POV-Rayi si ukážeme další možnosti, které nám tento raytracer nabízí při nastavování typu a parametrů kamery (pozorovatele). Ukážeme si například, jaký vliv má změna zorného úhlu objektivu, či jak lze využít cylindrickou a axonometrickou projekci nebo projekci typu rybí oko.

Obsah

1. Tvorba technických výkresů – nárys, půdorys, bokorys a axonometrická projekce
2. První demonstrační příklad: zobrazení nárysu, půdorysu, bokorysu a axonometrické projekce modelu
3. Změna zorného úhlu objektivu při perspektivním promítání
4. Druhý demonstrační příklad: změna zorného úhlu objektivu v rozsahu 45° až 180°
5. Projekce typu „rybí oko“
6. Třetí demonstrační příklad: změna zorného úhlu objektivu při promítání typu „rybí oko“
7. Obsah následující části seriálu

1. Tvorba technických výkresů – nárys, půdorys, bokorys a axonometrická projekce

V předchozí části seriálu o raytraceru POV-Ray jsme si popsali některé základní parametry kamery (pozorovatele), které je možné měnit, což má velký vliv na způsob vykreslení celé trojrozměrné scény. Mezi základní parametry patří pozice kamery v prostoru a také její orientace, tj. směr kamery určující, do kterého bodu se kamera dívá. S orientací kamery souvisí také její natočení okolo vektoru představujícího směr pohledu. Dále je možné 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.

povray4301

Obrázek 1: Kombinace nárysu, půdorysu, bokorysu a axonometrického náhledu (popř. náhledu v perspektivě) se používá v mnoha modelovacích programech i CAD systémech. Na prvním obrázku je screenshot známého modelovacího programu Moray určeného primárně právě pro tvorbu zdrojových scén pro raytracer POV-Ray.

POV-Ray se většinou využívá pro tvorbu fotorealistických snímků, přičemž je kamera nakonfigurována tak, že používá perspektivní promítání. Při tomto způsobu promítání jsou paprsky vysílány z jediného bodu představujícího pozici kamery (resp. jejího objektivu) v prostoru. Pokud je korektně nastavený zorný úhel objektivu (viz navazující kapitoly), působí výsledný snímek přirozeným dojmem. Ovšem některé vlastnosti perspektivní projekce, zejména to, že se mění úhly a délky vykreslených hran, mohou být na obtíž, především při tvorbě výkresové dokumentace. Při ní se většinou namísto perspektivní projekce používá projekce ortografická, zejména její tři „základní“ varianty – nárys, půdorys a bokorys. Mnohdy se k těmto třem pohledům na model přidává ještě axonometrický (isometrický) pohled, u nějž sice dochází ke změnám úhlů, ale nikoli již ke změnám délek hran (navíc je zachována rovnoběžnost původně rovnoběžných hran). Axonometrická (isometrická) projekce se kromě výkresové dokumentace používá i v některých hrách, například strategiích a RPG (ale i stará automatová „střílečka“ Zaxxon tuto projekci používala, ostatně je součástí samotného názvu této hry).

povray4302

Obrázek 2: Světoznámá Newellova čajová konvice (Utah teapot) naimportovaná do modelovacího programu KPovModeler, který taktéž v základním nastavení využívá čtyř pohledů na vytvářenou trojrozměrnou­ scénu.

Vykreslení nárysu, půdorysu, bokorysu i axonometrického pohledu na model je velmi snadné, když si uvědomíme, že se ve své podstatě používá stále stejný typ kamery – kamera ortografická (objektiv kamery není v tomto případě představován bezrozměrným bodem, ale plochou odpovídající tvarem i velikostí výslednému obrázku). Liší se pouze pozice kamery v prostoru a popř. i směr pohledu kamery. V praxi většinou postačuje nastavení pouhých tří parametrů kamery. Typ kamery se v tomto případě specifikuje klíčovým slovem orthographic, pozice kamery pomocí atributu location a směr pohledu kamery nastavením bodu pohledu atributem look_at. Z předchozí části také víme, že je možné (i když většinou ne nutné) měnit poměr výšky a šířky výsledného obrázku specifikací vektorů up a right. Volba mezi jednotlivými pohledy závisí především na spojnici mezi body location a look_at, což je základ dnešního prvního demonstračního příkladu popsaného a ukázaného v následující kapitole.

povray4303

Obrázek 3: Ve všech dnešních demonstračních příkladech bude použita tato jednoduchá scéna, která se skládá z podkladové nekonečné plochy, tří šipek představujících souřadné osy a implicitní plochy složené ze tří bodových prvků kostry. Scéna je osvětlena několika bodovými světelnými zdroji.

2. První demonstrační příklad: zobrazení nárysu, půdorysu, bokorysu a axonometrické projekce modelu

V dnešním prvním demonstračním příkladu je ukázáno, jak je možné velmi jednoduchým způsobem vykreslit nárys, půdorys, bokorys a axonometrický pohled na jednoduchý model. Pro všechny čtyři pohledy je možné využít ortografické promítání, tj. při specifikaci parametrů kamery se uvede klíčové slovo orthographic. U všech čtyř pohledů je použita kamera, která směřuje k počátku souřadného systému, tj. k bodu [0, 0, 0]; liší se pouze umístění kamery v prostoru. Vzhledem k tomu, že POV-Ray používá levotočivý souřadný systém a ne systém pravotočivý, je u bokorysu kamera umístěna na zápornou poloosu x, půdorys je vytvořen tak, že je kamera umístěna na kladnou poloosu y a konečně v případě nárysu se kamera nachází na záporné poloose z. Axonometrický pohled používá kameru umístěnou do bodu [40, 40, 40]. Ve všech čtyřech případech mají vektory sky, up a right ponechány implicitní hodnoty, jelikož se předpokládá, že poměr šířky ku výšce výsledného rastrového obrázku bude 4:3.

povray4304

Obrázek 4: První demonstrační příklad – bokorys

Volba konkrétního typu projekce se provádí změnou nastavení hodnoty interní proměnné clock. Již v předchozích částech tohoto seriálu, ve kterých jsme se zabývali tvorbou animací, jsme si řekli, že hodnotu této proměnné lze pro jednotlivé snímky nastavit pomocí několika voleb, především +KFIn (první snímek animace), +KFFn (poslední snímek animace), +KIn (hodnota proměnné clock v prvním snímku animace) a +KFn (hodnota proměnné clock v posledním snímku animace). V tomto demonstračním příkladu se rozlišují pouze čtyři intervaly hodnoty proměnné clock. V případě, že je nastavena hodnota v rozsahu 0,00 až 0,25, vykreslí se bokorys, pokud je v rozsahu 0,25 až 0,50, dojde k vykreslení půdorysu, nárys lze vyrendrovat nastavením hodnoty v rozsahu 0,50 až 0,75; poslední interval (až do koncové hodnoty 1,00) je určen pro vykreslení modelu v axonometrickém promítání. Vzhledem k tomu, že se rozlišují pouze čtyři intervaly proměnné clock a ne její konkrétní hodnota (jedná se o racionální číslo), má smysl vykreslit pouze čtyři snímky, tj. při spuštění POV-Raye zadat volbu +KFF4.

povray4305

Obrázek 5: První demonstrační příklad – půdorys

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

// ------------------------------------------------------------
// První demonstrační příklad - vykreslení souřadných os,
// podkladové roviny a implicitní plochy.
// Nastavení ortografické projekce:
// 1) nárysu
// 2) půdorysu
// 3) bokorysu
// 4) axonometrického promítání
//
// Volba konkrétního typu projekce se provádí nastavením hodnoty
// interní proměnné "clock". Nejjednodušší je zadat volbu
// +KFF4 - vznikne čtveřice obrázků, přičemž na každém obrázku
// je použito jiné nastavení ortografické projekce.
//
// rendering lze spustit příkazem:
// povray +W800 +H600 +B100 +FN +D +KFF4 +Icamera1.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"

// podle hodnoty proměnné clock se nastaví pozice kamery v prostoru
#switch (clock*4.0)
    #range (0.0, 1.0)
        #declare Location=<-80, 0, 0>;    // bokorys
    #break
    #range (1.0, 2.0)
        #declare Location=<0, 80, 0>;    // půdorys
    #break
    #range (2.0, 3.0)
        #declare Location=<0, 0, -80>;    // nárys
    #break
    #else
        #declare Location=<40, 40, 40>;  // axonometrické promítání
    #break
#end

// nastavení kamery (pozorovatele)
camera
{
    orthographic
    location  Location                   // 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, -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
// ------------------------------------------------------------ 
povray4306

Obrázek 6: První demonstrační příklad – nárys

povray4307

Obrázek 7: První demonstrační příklad – axonometrické promítání

3. Změna zorného úhlu objektivu při perspektivním promítání

V předchozí části tohoto seriálu jsme si vysvětlili principy perspektivního promítání. Základem 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í (promítání) 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 osmém obrázku. Většinu parametrů již umíme nastavovat a také známe jejich význam. Po zadání bodů location a look_at je vypočten směr vektoru direction, zadáním vektoru sky se pak určí, jakým způsobem bude natočena promítací plocha, která představuje výsledný rastrový obrázek. Když se však zamyslíme nad tím, jak je určena délka vektoru direction (jinými slovy, jak je promítací plocha vzdálena od kamery), zjistíme, že je zapotřebí zadat ještě jeden parametr (samozřejmě existuje možnost zadat směr i délku tohoto vektoru přímo, v praxi se to však neprovádí, protože je to méně intuitivní než alternativní způsob popsaný níže).

povray4308

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

Chybějícím parametrem je zorný úhel kamery představovaný atributem angle. Čím větší je hodnota tohoto úhlu, tím blíže je umístěna promítací plocha ke kameře (délka vektoru direction se zmenšuje) a naopak, menší zorný úhel má za následek oddálení promítací plochy od kamery. Z obrázku je taktéž zřejmé, že zorný úhel musí být menší než 180°; pokud by úhel dosáhl přesně této hodnoty, byla by délka vektoru direction nulová a kamera by vlastně snímala pouze body ležící přímo na promítací ploše (poloúsečky paprsků by tvořily trs ležící v jedné rovině). V praxi tedy POV-Ray umožňuje, aby zorný úhel angle nabýval při volbě perspektivního promítání pouze hodnot od 0° do 180° (kromě obou krajních mezí). Vztah pro výpočet délky vektoru direction vychází z hodnoty zorného úhlu objektivu angle a délky vektoru right. Vzhledem k posloupnosti operací, které POV-Ray při konfiguraci kamery provádí, je tedy nutné specifikovat zorný úhel až po zadání vektoru right, samozřejmě za předpokladu, že je nutné použít odlišnou hodnotu vektoru right, než je jeho implicitní hodnota (4/3, 0, 0). Ze vztahu je také zřejmé, proč není možné nastavit angle přesně na hodnotu 180° – při výpočtu by se používala nekonečná hodnota, protože tan(180°/2)=∞:

|direction| = 1/2 × |right| / tan(angle / 2)

povray4309

Obrázek 9: Druhý demonstrační příklad – perspektivní promítání, zorný úhel objektivu je nastaven na 45° (méně, než má lidský zrak, odpovídá některým teleobjektivům).

4. Druhý demonstrační příklad: změna zorného úhlu objektivu v rozsahu 45° až 180°

Ve druhém demonstračním příkladu je ukázán způsob změny zorného úhlu objektivu kamery. V závislosti na hodnotě interní proměnné clock je zorný úhel měněn v rozsahu 45° až 180° (této krajní hodnoty však nikdy nedosáhne, neboť by došlo k interní chybě POV-Raye při výpočtu transformační matice kamery, což si ostatně můžete jednoduše vyzkoušet). Na přiložených obrázcích si povšimněte, jakým způsobem zorný úhel ovlivňuje míru perspektivy, především změnu délek hran v závislosti na jejich vzdálenosti a sbíhavost původně rovnoběžných hran šachovnicové podlahy. Již u zorného úhlu, jehož hodnota je větší než 90°, dochází ke zkreslení, které nepůsobí přirozeně – je to patrné především na nejblíže položených šachovnicových polích podlahy. U zorného úhlu, jenž dosahuje hodnoty téměř 180° je zkreslení největší; na vykresleném obrázku jsou vidět pouze první šachovnicová pole roztažená až na obzor. Samotný trojrozměrný model se přeměnil na jediný (neviditelný) bod namapovaný na prostřední čtveřici pixelů výsledného obrázku.

povray4310

Obrázek 10: Druhý demonstrační příklad – perspektivní promítání, zorný úhel objektivu je nastaven na 67,5°, což zhruba odpovídá lidskému zraku.

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

// ------------------------------------------------------------
// Druhý demonstrační příklad - vykreslení souřadných os,
// podkladové roviny a implicitní plochy.
// Nastavení perspektivního promítání s různou hodnotou zorného
// úhlu objektivu.
//
// Při použití volby +KFF7 se vytvoří sedm obrázků, přičemž
// zorné úhly kamery mají tyto hodnoty:
// 45.0, 67.5, 90.0, 112.5, 135.0, 157.5 a 179.9 stupňů.
//
// rendering lze spustit příkazem:
// povray +W800 +H600 +B100 +FN +D +KFF8 +Icamera2.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"

// výpočet zorného úhlu kamery
#declare cameraAngle = 45+clock*45*3;

// zorný úhel kamery musí být pro perspektivní promítání menší než 180 stupňů
// -> úprava poslední hodnoty
#if ( cameraAngle >= 180 )
    #declare cameraAngle = 179.9;
#end

// nastavení kamery (pozorovatele)
camera
{
    location  <30, 55, -30>              // pozice kamery
    up        <0.0, 1.0, 0.0>            // vektor směřující vzhůru
    right     <4/3, 0.0, 0.0>            // vektor směřující doprava
    angle cameraAngle                    // nastavení zorného úhlu
    look_at   <15, 5.0, 15.0>            // bod, na který kamera směřuje
}

// výpis nastaveného úhlu na standardní výstup (popř. do GUI rozhraní u POV-Raye pro Windows)
#debug str(cameraAngle, 0, 3)
#debug ", "

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

Obrázek 11: Druhý demonstrační příklad – perspektivní promítání, zorný úhel objektivu je nastaven na 90,0°. Tento zorný úhel mají objektivy některých digitálních fotoaparátů.

povray4312

Obrázek 12: Druhý demonstrační příklad, zorný úhel je nastaven na hodnotu 112,5°

povray4313

Obrázek 13: Druhý demonstrační příklad, zorný úhel je nastaven na hodnotu 135,0°

povray4314

Obrázek 14: Druhý demonstrační příklad, zorný úhel je nastaven na hodnotu 157,5°

povray4315

Obrázek 15: Druhý demonstrační příklad, zorný úhel je nastaven na hodnotu 179,9°. Dochází ke značnému zkreslení celé scény, trojrozměrný model se transformoval do jediného bodu namapovaného do středu výsledného obrázku.

5. Projekce typu „rybí oko“

POV-Ray dokáže kromě perspektivní a ortografické projekce použít i několik dalších způsobů, jakými je možné kameru a projekční plochu nakonfigurovat. Majitelé fotoaparátů i dveřních kukátek se jistě setkali s pojmem „rybí oko“ (klíčové slovo fisheye). Tímto poměrně přiléhavým názvem se označují objektivy s velkým zorným úhlem, který u běžných výrobků může dosahovat až limitu 180°. V praxi sice není možné vytvořit objektiv, který by snímal celý prostor, tj. 360° (minimálně již z toho důvodu, že samotné těleso objektivu a kamery/fotoaparátu část prostoru zakryje), ovšem POV-Ray dokáže nasimulovat i takové objektivy typu „rybí oko“, jejichž zorný úhel dosahuje celých 360° (jedná se o jediný typ projekce, který zachytí celý 3D prostor). Ve skutečnosti se totiž jedná o sférickou projekci, která se kromě nelineárního zkreslení všech hran vyznačuje tím, že je výsledný snímek (přesněji řečeno tvar tvořený pixely, které skutečně patří k vykreslované scéně) kulatý či elipsovitý. Velmi podobná projekce (v POV-Rayi volená klíčovým slovem omnimax) se používá i pro tvorbu 3D filmů promítaných na plátno ve tvaru polokoule (podle konstrukce kina se na plátno dívá buď shora nebo naopak zespoda).

povray4316

Obrázek 16: Třetí demonstrační příklad. Zorný úhel „rybího oka“ je nastavený na hodnotu 90°

6. Třetí demonstrační příklad: změna zorného úhlu objektivu při promítání typu „rybí oko“

V dnešním třetím demonstračním příkladu je ukázáno použití projekce typu „rybí oko“. Z obrázků 16 až 19 můžeme vidět, že zorný úhel objektivu je možné nastavit na libovolný úhel, včetně celých 360°. I když se jedná o sférickou projekci, při které se paprsky z kamery rozbíhají do všech směrů, záleží i zde na pozici kamery a směru jejího pohledu, protože ten určuje, která část celého prostoru bude umístěna blízko středu obrázku (zde je zkreslení nejmenší). Povšimněte si, že i v případě, kdy byl nastavený malý zorný úhel, dochází k nelineárnímu zkreslení původně rovných hran, především u okraje obrázku. Jedině ty hrany, které prochází přímo středem obrázku, nejsou nelineárně zkresleny (přesněji řečeno je zkreslena jejich délka, ale nikoli tvar). Zdrojový kód třetího demonstračního příkladu má tvar:

// ------------------------------------------------------------
// Třetí demonstrační příklad - vykreslení souřadných os,
// podkladové rovina a implicitní plochy.
// Nastavení promítání typu "rybí oko" s různým zorným úhlem
// objektivu.
//
// Při použití volby +KFF8 se vytvoří osm obrázků, přičemž
// zorné úhly kamery mají tyto hodnoty:
// 45, 90, 135, 180, 225, 270, 315 a 360 stupňů.
//
// rendering lze spustit příkazem:
// povray +W800 +H600 +B100 +FN +D +KFF8 +Icamera3.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"

// výpočet zorného úhlu kamery
#declare cameraAngle = 45+clock*45*7;

// nastavení kamery (pozorovatele)
camera
{
    fisheye                              // nastavení projekce typu "rybí oko"
    angle cameraAngle                    // nastavení zorného úhlu
    location  <30, 55, -30>              // pozice kamery
    up        <0.0, 1.0, 0.0>            // vektor směřující vzhůru
    right     <4/3, 0.0, 0.0>            // vektor směřující doprava
    look_at   <15, 5.0, 15.0>            // bod, na který kamera směřuje
}

// výpis nastaveného úhlu na standardní výstup (popř. do GUI rozhraní u POV-Raye pro Windows)
#debug str(cameraAngle, 0, 3)
#debug ", "

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

Obrázek 17: Třetí demonstrační příklad. Zorný úhel „rybího oka“ je nastavený na hodnotu 180°

povray4318

Obrázek 18: Třetí demonstrační příklad. Zorný úhel „rybího oka“ je nastavený na hodnotu 270°

povray4319

Obrázek 19: Třetí demonstrační příklad. Zorný úhel „rybího oka“ je nastavený na hodnotu 360°, zobrazený je tedy celý prostor.

UX DAy - tip 2

7. Obsah následující části seriálu

V následující části seriálu o raytraceru POV-Ray si ukážeme rendering panoramatických snímků pomocí cylindrického promítání použitelného například pro tvorbu „panoramatických“ filmů s technologií QuickTime VR (viz dvacátý obrázek) a také již minule zmiňovanou simulaci rozostření objektů, které se nachází příliš blízko či naopak příliš daleko od kamery. Také začneme s popisem již téměř poslední nepopsané vlastnosti POV-Raye – využití zabudovaného matematického aparátu určeného pro práci se spline křivkami a plochami.

povray4320

Obrázek 20: Panoramatický snímek získaný kamerou využívající mapování na válec (cylindrické promítání). Snímek v horizontálním směru pokrývá celý prostor, tj. 360°.

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.