Hlavní navigace

Tělesa modelovaná pomocí spline křivek

Pavel Tišnovský 22. 4. 2008

V osmé části seriálu o renderovacím programu POV-Ray si popíšeme tělesa, která jsou modelovaná pomocí spline křivek. Jedná se především o rotační tělesa (surfaces of revolution), u kterých spline křivka určuje tvar řezu tělesem, a pak také tělesa vzniklá tažením profilové křivky po určené dráze.

Obsah

1. Práce se spline křivkami v POV-Rayi
2. Tvorba rotačních těles (surfaces of revolution)
3. První demonstrační příklad – vykreslení rotačních těles
4. Složitější rotační tělesa a objekt typu lathe
5. Druhý demonstrační příklad – využití objektu typu lathe
6. Zobecněné hranoly
7. Třetí demonstrační příklad – vykreslení obecných hranolů
8. Čtvrtý demonstrační příklad – pyramida
9. Obsah dalšího pokračování seriálu

1. Práce se spline křivkami v POV-Rayi

V POV-Rayi je možné kromě mnoha typů těles definovaných pomocí nějaké implicitní funkce (mezi tato tělesa patří například koule, válec, plocha, implicitní plocha atd.) použít i tělesa, která jsou zkonstruována s využitím takzvaných spline křivek, tj. parametricky. Je přitom možné využít několik typů spline křivek: lineární spline křivky (což jsou vlastně běžné lomené čáry tvořící polyčáru či uzavřený polygon), kvadratické spline křivky, kubické spline křivky a konečně slavné Bézierovy kubické spline křivky, které se od základních kubických spline křivek odlišují především jiným způsobem zadání řídicích bodů. Každá spline křivka, nezávisle na jejím typu, je specifikována několika řídicími body ležícími v ploše, mezi kterými POV-Ray automaticky vypočítá aproximační a/nebo interpolační křivku. Spline křivky jsou použity při tvorbě rotačních těles, obecných hranolů (tj. hranolů, které mohou mít libovolnou základnu) a také těles, které vznikly pohybem koule po zadané trajektorii – tento typ tělesa lze využít například při vytváření modelů potrubí apod.

Jak již bylo řečeno v předchozím odstavci, lineární spline křivka se skládá z několika na sebe napojených úseček, takže výsledkem je otevřená nebo uzavřená lomená čára (polyčára). Tato křivka je v POV-Rayi specifikována klíčovým slovem linear_spline, za nímž následuje počet řídicích bodů, které jsou spojeny lomenou čarou. Poté jsou již specifikovány jednotlivé řídicí body. Všimněte si, že lomená čára obsahuje takový počet segmentů, který odpovídá počtu řídicích bodů zmenšenému o jedničku, tj. musí být zadány alespoň dva řídicí body. Pokud je nutné tuto křivku uzavřít, musí být poslední řídicí bod totožný s bodem prvním.

povray0801

Obrázek 1: Lineární spline křivka zadaná pěticí řídicích bodů

Kvadratická spline křivka je v POV-Rayi specifikována klíčovým slovem quadratic_spline. Tato křivka je složena z jednoho či více kvadratických oblouků (částí kvadratických křivek), které na sebe hladce nebo ostře navazují. Vzhledem k tomu, že kvadratický oblouk je plně zadán třemi body a prochází dvěma řídicími body (druhým a třetím), znamená to, že spline křivka obsahuje takový počet oblouků, který odpovídá počtu řídicích bodů zmenšenému o dvojku. Pro pět řídicích bodů budou vytvořeny pouhé tři oblouky, přičemž křivka bude procházet posledními čtyřmi řídicími body – první řídicí bod „pouze“ určuje tvar prvního oblouku. Při uzavírání kvadratické spline křivky je nutné, aby poslední řídicí bod byl totožný s bodem druhým. Pro vykreslení tohoto typu spline křivky se musí zadat alespoň tři řídicí body, což odpovídá tomu, že se musí vykreslit alespoň jeden kvadratický oblouk.

povray0802

Obrázek 2: Kvadratická spline křivka zadaná pěticí řídicích bodů

Dalším typem spline křivek jsou kubické spline křivky, které jsou složeny z na sebe navazujících kubických oblouků. Každý kubický oblouk je popsán čtyřmi body, přičemž oblouk začíná ve druhém bodu a končí v bodu třetím – první a čtvrtý bod „pouze“ určuje tvar oblouku. Z tohoto důvodu i celá kubická spline křivka neprochází svými krajními řídicími body, ale body vnitřními, což je ostatně patrné i ze třetího obrázku. Počet oblouků je zde roven počtu řídicích bodů zmenšených o tři. I způsob uzavření této spline křivky je odlišný, protože je nutné zajistit totožnost druhého a předposledního řídicího bodu. Minimální počet bodů nutných pro vykreslení kubické spline křivky je roven čtyřem.

povray0803

Obrázek 3: Kubická spline křivka zadaná pěticí řídicích bodů

Posledním typem spline křivek podporovaných v POV-Rayi jsou Bézierovy kubické spline křivky. Jedná se o v počítačové grafice nejpoužívanější typ parametrických křivek, jejichž podporu nabízí téměř jakýkoli vyspělejší program pracující s vektorovou grafikou (Inkscape, CorelDraw!, Adobe Illustrator). To je pravděpodobně i jeden z důvodů, proč se tento typ křivek v POV-Rayi objevil (jinak jsou totiž při raytracingu s Bézierovými křivkami problémy). Bézierovy kubické křivky jsou zadány pomocí čtyř bodů v ploše či prostoru. Křivka přitom prochází prvním a posledním (kotvicím) bodem, druhý a třetí bod (řídicí) určuje tečné vektory na začátku a konci křivky. Křivka tedy druhým a třetím řídicím bodem obecně neprochází, což je patrné i ze čtvrtého ilustračního obrázku. Touto vlastností se Bézierovy křivky podstatným způsobem odlišují od spline křivek popsaných v předchozím odstavci. Také počet řídicích bodů je omezen, protože se musí jednat o násobek čtyř – každé čtyři body představují jednu Bézierovu kubickou křivku, přičemž zajištění vhodného způsobu napojení (shodné koncové řídicí body, kolineárnost tečných vektorů atd.) je ponecháno na uživateli, resp. jím používaném modelovacím programu.

povray0804

Obrázek 4: Bézierova kubická spline křivka zadaná pomocí čtyř řídicích bodů

Spline křivky jsou použity pro modelování několika typů objektů, se kterými se seznámíme v dalších kapitolách.

2. Tvorba rotačních těles (surfaces of revolution)

Prvním typem tělesa, ve kterém se spline křivky používají, je těleso vzniklé rotací této křivky okolo osy y. Tento typ tělesa je v POV-Rayi představován objektem nazvaným sor, což je zkratka sousloví surface of revolution, používaného například v mnoha modelovacích programech i aplikacích typu CAD či CAM. Spline křivka použitá u tohoto typu objektu má určitá omezení, která jsou dána způsobem výpočtu průsečíku paprsku s povrchem tělesa. Žádné řídicí body, které křivku popisují (křivka jimi prochází), nesmí procházet y-ovou osou (tj. x-ové souřadnice jsou buď všechny kladné nebo všechny záporné) a jejich y-ové souřadnice musí tvořit rostoucí posloupnost. Z toho také vyplývá, že se nejedná o uzavřenou křivku a těleso vzniklé rotací této křivky vlastně nemá vnitřek, pouze svůj plášť. Na druhou stranu je vykreslení sor poměrně rychlé, zvláště v porovnání s dalším typem tělesa popsaným dále. Jak se rotační tělesa zapisují do zdrojového textu vytvářeného modelu ukazuje následující fragment kódu:

sor {                                    // rotační plocha
    7,                                   // počet bodu spline křivky
    <0.000000, 0.000000>                 // řídicí body spline křivky
    <0.118143, 0.000000>
    <0.620253, 0.540084>
    <0.210970, 0.827004>
    <0.194093, 0.962025>
    <0.286920, 1.000000>
    <0.468354, 1.033755>
    open                                 // zákaz vytvoření "podstav"
} 

Vzhledem k tomu, že je sor vytvořen tak, že se rotace provádí okolo y-ové osy, musí existovat způsob, jak celý objekt přenést do jiné části scény a popřípadě ho natočit (asi by bylo poněkud zvláštní, kdyby všechny tyto objekty měly shodnou osu). K tomu slouží lineární transformace zapisované pomocí klauzulí translate, rotate a scale, které budou použity i v dnešním prvním demonstračním příkladu.

3. První demonstrační příklad – vykreslení rotačních těles

V dnešním prvním demonstračním příkladu je ukázáno použití rotačních těles při tvorbě modelů různých nádob, což jsou pravděpodobně nejtypičtější reálné předměty, které tento tvar skutečně mají. Ve scéně je umístěno celkem šest objektů typu sor (surface of revolution), které se od sebe odlišují jak počtem řídicích bodů a jejich polohou, tak i použitou texturou a materiálem (konkrétně se jedná o různé typy skel a kovů). Již v předchozí kapitole jsme si řekli, že tyto objekty jsou vždy vytvořeny takovým způsobem, že jsou rotačně symetrické okolo y-ové osy (ta v POV-Rayi směřuje vzhůru, pokud není provedena změna souřadného systému). Posun objektů a změnu jejich měřítka obstarávají klauzuje translate a scale, přičemž je zapotřebí dát pozor na jejich vzájemné pořadí – nejprve jsou objekty patřičně zvětšeny a teprve poté přesunuty do požadované pozice. Následuje výpis zdrojového kódu prvního demonstračního příkladu:

// ------------------------------------------------------------
// Scéna s několika uzavřenými objekty typu sor (surface
// of revolution), čtveřicí světel a jednou kamerou (pozorovatelem)
//
// Založeno na souboru původně vytvořeném Dieter Bayerem (červen 1994)
//
// rendering lze spustit příkazem: povray +W800 +H600 +B100 +FN +D +Isor.pov +Osor.png
// (pro náhled postačí zadat povray sor.pov)
// ------------------------------------------------------------

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

#include "colors.inc"
#include "textures.inc"
#include "shapes.inc"
#include "stones.inc"
#include "glass.inc"

// nastavení kamery (pozorovatele)
camera {
    location  <40, 40, -80>              // pozice kamery
    right     <4/3, 0, 0>                // vektor směřující doprava
    up        <0, 1, 0>                  // vektor směřující nahoru
    sky       <0, 1, 0>
    direction <0, 0, 2.5>
    look_at   <0, 5, 10>                 // bod, na který kamera směřuje
}

// první světelný zdroj
light_source {
    <40, 40, -80>                        // pozice světelného zdroje
    color Gray40                         // barva světla
}

// druhý světelný zdroj
light_source {
    <0, 50, 20>                          // pozice světelného zdroje
    color Gray40                         // barva světla
}

// třetí světelný zdroj
light_source {
    <50, 50, -50>                        // pozice světelného zdroje
    color Gray40                         // barva světla
}

// čtvrtý světelný zdroj
light_source {
    <-50, 50, -50>                       // pozice světelného zdroje
    color Gray40                         // barva světla
}

background {                             // barva pozadí
    color SkyBlue                        // (použije se, když paprsek neprotne žádné těleso)
}

// podkladová plocha
plane {
    y,                                   // orientace roviny
    0                                    // vzdálenost od počátku
    texture {                            // textura - vlastnosti povrchu
        T_Stone1                         // definováno v externím souboru
        pigment {                        // vlastní vzorek textury
            octaves 3                    // modifikace procedurálního vzorku
            rotate 90*z
        }
        finish {                         // optické vlastnosti materiálu
            reflection 0.10
        }
        scale 10
    }
}

#declare Glas1 =
sor {                                    // rotační plocha
    7,                                   // počet bodů spline křivky
    <0.000000, 0.000000>                 // řídicí body spline křivky
    <0.118143, 0.000000>
    <0.620253, 0.540084>
    <0.210970, 0.827004>
    <0.194093, 0.962025>
    <0.286920, 1.000000>
    <0.468354, 1.033755>
    open
}

#declare Glas2 =
sor {                                    // rotační plocha
    12,                                  // počet bodů spline křivky
    <.517241379, -.132625995>            // řídicí body spline křivky
    <.249336870, 0.000000>
    <.068965517, .031830239>
    <.021220159, .050397878>
    <.058355438, .347480106>
    <.132625995, .381962865>
    <.196286472, .464190981>
    <.238726790, .602122016>
    <.249336870, .721485411>
    <.233421751, .864721485>
    <.167108753, 1.000000000>
    <.084880637, 1.055702918>
    open
}


#declare Glas3 =
sor {                                    // rotační plocha
    18,                                  // počet bodů spline křivky
    <0.125628, -0.035176>                // řídicí body spline křivky
    <0.394472, 0.000000>
    <0.281407, 0.030151>
    <0.108040, 0.052764>
    <0.125628, 0.090452>
    <0.221106, 0.185930>
    <0.125628, 0.216080>
    <0.090452, 0.339196>
    <0.185930, 0.402010>
    <0.251256, 0.522613>
    <0.208543, 0.645729>
    <0.150754, 0.703518>
    <0.082915, 0.771357>
    <0.082915, 0.844221>
    <0.155779, 0.917085>
    <0.261307, 0.942211>
    <0.238693, 1.000000>
    <0.329146, 1.115578>
    open
}


#declare Glas4 =
sor {                                    // rotační plocha
    10,                                  // počet bodů spline křivky
    <0.000000, -0.062814>                // řídicí body spline křivky
    <0.062814, 0.000000>
    <0.351759, 0.311558>
    <0.125628, 0.462312>
    <0.233668, 0.575377>
    <0.163317, 0.693467>
    <0.256281, 0.786432>
    <0.165829, 0.876884>
    <0.155779, 1.000000>
    <0.311558, 1.130653>
    open
}

#declare Glas5 =
sor {                                    // rotační plocha
    14,                                  // počet bodů spline křivky
    <0.148225, 0.000000>                 // řídicí body spline křivky
    <0.189979, 0.000000>
    <0.154489, 0.096033>
    <0.075157, 0.123173>
    <0.070981, 0.164927>
    <0.129436, 0.223382>
    <0.070981, 0.281837>
    <0.108559, 0.354906>
    <0.075157, 0.436326>
    <0.175365, 0.536534>
    <0.240084, 0.672234>
    <0.327766, 0.900000>
    <0.290188, 0.910000>
    <0.250188, 1.000000>
    open
}

#declare Glas6 =
sor {
    11,                                  // rotační plocha
    <0.150754, 0.000000>                 // počet bodů spline křivky
    <0.150754, 0.000000>                 // řídicí body spline křivky
    <0.150754, 0.155779>
    <0.150754, 0.391960>
    <0.140704, 0.449749>
    <0.082915, 0.489950>
    <0.125628, 0.530151>
    <0.140704, 0.582915>
    <0.047739, 0.919598>
    <0.047739, 1.000000>
    <0.000000, 1.035176>
    open
}

object {
    Glas1
    texture {                            // textura - povrch rotační plochy
        T_Glass1                         // definováno v externím souboru
        pigment {
            color blue 0.90 filter 0.85  // barva povrchu
        }
        finish {                         // optické vlastnosti materiálu
            phong 1                      // velikost a síla odlesku
            phong_size 300
            reflection 0.15              // odrazivost
        }
    }
    interior {                           // vlastnosti "vnitřku" objektu
        caustics 1.0
        ior 1.5
    }
    scale <16, 16, 16>
    translate <-20, 0.001, 20>
}

object {
    Glas2
    texture {                            // textura - povrch rotační plochy
        T_Glass1                         // definováno v externím souboru
        pigment {
            color red 0.90 filter 0.85   // barva povrchu
        }
        finish {                         // optické vlastnosti materiálu
            phong 1                      // velikost a síla odlesku
            phong_size 300
            reflection 0.15              // odrazivost
        }
    }
    interior {                           // vlastnosti "vnitřku" objektu
        caustics 1.0
        ior 1.5
    }
    scale <16, 16, 16>
    translate <0, 0.001, 20>
}

object {
    Glas3
    texture { Silver3 }
    scale <16, 16, 16>
    translate <20, 0.001, 20>
}

object {
    Glas4
    texture { Gold_Metal }
    scale <15, 15, 15>
    translate <-15, 0.001, -5>
}

object {
    Glas5
    texture { Copper_Metal }
    scale <15, 15, 15>
    translate <0, 0.001, -5>
}

object {
    Glas6
    texture {                            // textura - povrch rotační plochy
        T_Glass1                         // definováno v externím souboru
        pigment {
            color green 0.90 filter 0.85 // barva povrchu
        }
        finish {                         // optické vlastnosti materiálu
            phong 1                      // velikost a síla odlesku
            phong_size 300
            reflection 0.15              // odrazivost
        }
    }
    interior {                           // vlastnosti "vnitřku" objektu
        caustics 1.0
        ior 1.5
    }
    scale <25, 25, 25>
    translate <15, 0.001, -5>
}



// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray0805

Obrázek 5: První demonstrační příklad po vykreslení POV-Rayem

4. Složitější rotační tělesa a objekt typu lathe

Rotační tělesa vytvořená pomocí výše popsaného objektu typu sor se sice vykreslují (renderují) velmi rychle, ovšem omezení pro polohy řídicích bodů spline křivky mohou být v některých případech velmi nepříjemná, zejména při vytváření skutečných modelů rotačních objektů. Částečně se tato nevýhoda dá obejít použitím více rotačních ploch (například nádoba může být vytvořena ze dvou ploch, kde první plocha představuje vnější stěnu a plocha druhá stěnu vnitřní), ovšem zdaleka se nejedná o ideální řešení, především tehdy, když se použije průhledný materiál. I z tohoto důvodu podporuje POV-Ray další typ těles, který je představován objektem typu lathe (soustruh).

Pomocí tohoto objektu je možné vytvořit rotační tělesa, jejichž profil (tj. tvar, který získáme při kolmém řezu tělesa), může být popsán libovolným typem spline křivky. Podporované typy spline křivek jsme si popsali v první kapitole. Jedinou vážnější nevýhodou je při použití objektu typu lathe poněkud delší čas, který POV-Ray věnuje vykreslení celé scény. Naproti tomu není profil tělesa prakticky žádným způsobem omezen a existuje ještě jedna výhoda – objekty typu lathe je možné použít v CSG operacích.

Syntaxe zápisu objektu typu lathe je následující:

lathe {
    typ_spline_křivky
    počet_řídicích_bodů,
    vektory_řídicích_bodů (oddělené čárkami)
    další_parametry_objektu (textury, lineární transformace atd.)
} 

Následuje konkrétní příklad zápisu rotačního tělesa vytvořeného pomocí objektu typu lathe:

lathe {
    linear_spline        // typ spline křivky
    12,                  // počet řídicích bodů
    <2, 1>,
    <2, -1>, <3, -1>,
    <3.4, -2>, <4, -1.1>, <3.6, -0.9>,
    <2.6, 0>,
    <3.6.9>, <4, 1.1>,
    <3.4, 2>, <3, 1>, <2, 1>
} 

Pro řídicí body spline křivek představujících profil rotačního tělesa platí všechna pravidla uvedená v první kapitole, tj. při praktickém modelování je zejména zapotřebí dát pozor na to, že některé spline křivky neprochází svými krajními řídicími body, což také znamená, že při požadavku na tvorbu uzavřeného tělesa je nutné například při použití kubických spline křivek zajistit totožnost druhého a předposledního řídicího bodu, nikoli bodu prvního a posledního.

5. Druhý demonstrační příklad – využití objektu typu lathe

V dnešním druhém demonstračním příkladu je ukázáno použití objektu typu lathe pro vytvoření modelu rotačního 3D tělesa, které je uzavřené, tj. jeho profil má tvar uzavřené křivky (topologicky je shodný s kružnicí, čehož není možné objektem typu sor dosáhnout). Jednoduchou změnou pouhého jednoho řádku tohoto demonstračního příkladu (řádek je označený trojicí vykřičníků) je možné zvolit typ spline křivky, která bude popisovat profil rotačního tělesa. Na obrázcích číslo 6, 7, 8 a 9 jsou zobrazeny varianty rotační plochy s profilem vytvořeným z lineární spline křivky, kvadratické spline křivky, kubické spline křivky a Bézierových kubických křivek. Aby byl rozdíl ve tvaru jednotlivých profilů jasně patrný, je od rotační plochy pomocí CSG operace difference oddělena jedna čtvrtina (těleso, které se od rotační plochy „odečítá“, má tvar kvádru, který je oproti souřadné soustavě otočen o 30° okolo osy y). Povšimněte si také, jakým způsobem je nastavena barva řezu. Následuje výpis zdrojového kódu druhého demonstračního příkladu:

// ------------------------------------------------------------
// Scéna s jedním rotačním tělesem vytvořeným pomocí objektu
// typu "lathe", od kterého je pomocí CSG operace "odečten"
// kvádr tak, aby byl patrný tvar profilu tělesa.
//
// Typ vykreslené plochy lze změnit na řádku označeném třemi
// vykřičníky.
//
// Založeno na souboru původně vytvořeném Dieter Bayerem (červen 1994)
//
// rendering lze spustit příkazem: povray +W800 +H600 +B100 +FN +D +Ilathe.pov +Olathe.png
// (pro náhled postačí zadat povray lathe.pov)
// ------------------------------------------------------------

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

#declare ROT_PLOCHA1=
    lathe {                              // rotační plocha
        linear_spline                    // typ spline křivky použité pro vytvoření profilu
        12,                              // počet řídicích bodů
        <2, 1>,                          // souřadnice řídicích bodů
        <2, -1>, <3, -1>, <3.4, -2>, <4, -1.1>, <3.6, -0.9>,
        <2.6, 0>,
        <3.6, 0.9>, <4, 1.1>, <3.4, 2>, <3, 1>, <2, 1>
    }

#declare ROT_PLOCHA2=
    lathe {                              // rotační plocha
        quadratic_spline                 // typ spline křivky použité pro vytvoření profilu
        13,                              // počet řídicích bodů
        <2, 1>,                          // souřadnice řídicích bodů
        <2, -1>, <3, -1>, <3.4, -2>, <4, -1.1>, <3.6, -0.9>,
        <2.6, 0>,
        <3.6, 0.9>, <4, 1.1>, <3.4, 2>, <3, 1>, <2, 1>,
        <2, -1>
    }

#declare ROT_PLOCHA3=
    lathe {                              // rotační plocha
        cubic_spline                     // typ spline křivky použité pro vytvoření profilu
        14,                              // počet řídicích bodů
        <2, 1>,                          // souřadnice řídicích bodů
        <2, -1>, <3, -1>, <3.4, -2>, <4, -1.1>, <3.6, -0.9>,
        <2.6, 0>,
        <3.6, 0.9>, <4, 1.1>, <3.4, 2>, <3, 1>, <2, 1>,
        <2, -1>
        <3, -1>
    }

#declare ROT_PLOCHA4=
    lathe {                              // rotační plocha
        bezier_spline                    // typ spline křivky použité pro vytvoření profilu
        12,                              // počet řídicích bodů
        <2, 1>, <2, -1>, <3, -1>, <4, -2>, // souřadnice řídicích bodů
        <4, -2>, <3.6, -0.9>, <2.6, 0>, <3.6, 0.9>, // druhá Bézierova křivka
        <3.6, 0.9>, <4, 1.1>, <3.4, 2>, <2, 1> // třetí Bézierova křivka
    }

#declare ROT_PLOCHA=                     // výběr rotační plochy
    object {
/* !!! */ ROT_PLOCHA1                    // (lze změnit na ROT_PLOCHA2, ROT_PLOCHA3 či ROT_PLOCHA4)
    }

#include "colors.inc"

background {                             // barva pozadí
    color MidnightBlue                   // (použije se, když paprsek neprotne žádné těleso)
}

// nastavení kamery (pozorovatele)
camera {
  location  <0, 7, -10>                  // pozice kamery
  right     <4/3, 0, 0>                  // vektor směřující doprava
  up        <0, 1, 0>                    // vektor směřující nahoru
  sky       <0, 1, 0>
  direction <0, 0, 1.21>
  look_at   <0, 0, 0>                    // bod, na který je kamera namířena
}

// světelný zdroj
light_source {
    <5, 20, -10>                         // pozice světelného zdroje
    color White                          // barva světla
}

// podkladová plocha
plane {
    y,                                   // orientace roviny
    -6                                   // vzdálenost od počátku
    texture {                            // textura - vlastnosti povrchu
        pigment {                        // vzorek textury
            checker color Blue color Green
            scale 5
        }
        finish {                         // optické vlastnosti materiálu
            ambient 0.2
            diffuse 0.8
        }
    }
}

difference {                             // CSG operace mezi rotační plochou a kvádrem
    object {
        ROT_PLOCHA                       // naše rotační plocha
        texture {                        // textura použitá pro rotační těleso
            pigment {
                color Red                // barva povrchu
            }
            finish {                     // optické vlastnosti materiálu
                ambient 0.1
                diffuse 0.6
                phong   0.8
                phong_size 7
            }
        }
    }
    box {                                // kvádr, který je od rotační plochy "odečten"
        <0, -5, 0>,                      // rozměry (body na tělesové úhlopříčce)
        <5, 5, -5>
        rotate <0, 30, 0>                // rotace okolo y-ové osy
        pigment {
            color White                  // barva řezu
        }
        finish {                         // optické vlastnosti řezu
            ambient 0.1
            diffuse 0.6
            phong   0.6
            phong_size 7
        }
    }
}
// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray0806

Obrázek 6: Druhý demonstrační příklad po vykreslení POV-Rayem při nastavení lineární spline křivky

povray0807

Obrázek 7: Druhý demonstrační příklad po vykreslení POV-Rayem při nastavení kvadratické spline křivky

povray0808

Obrázek 8: Druhý demonstrační příklad po vykreslení POV-Rayem při nastavení kubické spline křivky

povray0809

Obrázek 9: Druhý demonstrační příklad po vykreslení POV-Rayem při nastavení kubických Bézierových křivek

6. Zobecněné hranoly

Dalším typem objektu, jehož tvar je částečně specifikován pomocí spline křivek, je objekt představující zobecněný hranol, tj. těleso s libovolně tvarovanou základnou zadanou právě pomocí spline křivky, které má určitou (nenulovou) výšku. Jde o objekt prism a ve skutečnosti se jedná o jeden ze způsobů tvorby těles tažením (sweep). Spline křivky specifikující základnu, mohou být čtyř typů, podobně jako v případě objektu typu lathe: lineární, kvadratická či kubická spline křivka, popř. množina Bézierových kubických křivek. Základna vždy leží v rovině x-z, a s využitím jejího tvaru jsou vytvořeny obě podstavy zobecněného hranolu, které jsou vysunuty ve směru osy y. To znamená, že základní informace, které musíme o zobecněném hranolu znát, jsou: výšky obou podstav (vzdálenost od roviny x-z), typ spline křivky představující tvar podstavy, počet řídicích bodů spline křivky a konečně 2D souřadnice řídicích bodů. Všechny informace jsou uloženy v uzlu prism v následujícím pořadí:

prism {
    linear_spline        // typ spline křivky
    0,                   // výška první podstavy
    1,                   // výška druhé podstavy
    12,                  // počet řídicích bodů
    <2, 1>,
    <2, -1>, <3, -1>,
    <3.4, -2>, <4, -1.1>, <3.6, -0.9>,
    <2.6, 0>,
    <3.6.9>, <4, 1.1>,
    <3.4, 2>, <3, 1>, <2, 1>
} 

Zajímavé je, že spline křivka určující tvar základy může sama sebe protínat, což ve výsledku vede k tomu, že se části základny navzájem „odečtou“ a vznikne tak hranol obsahující otvory. Existuje ještě jedna možná modifikace tohoto typu těles, která spočívá v uvedení modifikátoru conic_sweep. Přidáním tohoto modifikátoru se kompletně změní tvar celého objektu, protože se jeho první základna smrskne na pouhý jeden bod a objekt tedy dostane tvar zobecněného kužele či jehlanu. Tato modifikace bude použita ve čtvrtém demonstračním příkladu.

7. Třetí demonstrační příklad – vykreslení obecných hranolů

Ve třetím demonstračním příkladu je ukázáno vykreslení jednoduchého obecného hranolu, jehož základna je vytvořena pomocí kubické spline křivky. Hranol má výšku 0,7 délkových jednotek a jeho profilová křivka je specifikována sedmi řídicími body. Všimněte si, že druhý a předposlední řídicí bod jsou shodné, což v případě kubické spline křivky znamená její uzavřenost. Textura na povrchu objektu je otočena o 90°, aby na plášti vznikly pruhy. Zdrojový kód tohoto demonstračního příkladu má tvar:

// ------------------------------------------------------------
// Scéna s jedním zobecněným hranolem vytvořeným pomocí objektu
// typu "prism".
//
// rendering lze spustit příkazem: povray +W800 +H600 +B100 +FN +D +Iprism1.pov +Oprism1.png
// (pro náhled postačí zadat povray prism1.pov)
// ------------------------------------------------------------

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

#include "colors.inc"
#include "stones.inc"

camera {
    location <-10, 10, -10>              // pozice kamery
    right    4/3 * x                     // vektor směřující doprava
    up       z                           // vektor směřující nahoru
    look_at  <1, -1, 0>                  // bod, na který kamera směřuje
    angle    20
}

// světelné zdroje
light_source {
    <0, 50, 10>                          // pozice světelného zdroje
    rgb 1                                // barva světla (bílé)
}

light_source {
    <-30, 20, -50>                       // pozice světelného zdroje
    rgb 0.7                              // barva světla (šedé)
}

light_source {
    <30, 20, -20>                        // pozice světelného zdroje
    rgb 0.7                              // barva světla (šedé)
}

// podkladová rovina
plane { y, 0
    texture {                            // textura - vlastnosti povrchu
        T_Stone5                         // definováno v externím souboru
        pigment {                        // vlastní vzorek textury
            octaves 3                    // modifikace procedurálního vzorku
            rotate 90*z
        }
        scale 10
        finish {                         // optické vlastnosti materiálu
            reflection 0.10
            ambient 0.2
            diffuse 0.8
        }
    }
}

#declare Prism = prism {                 // zobecněný hranol
    cubic_spline                         // typ použité spline křivky
    0.0,                                 // výška první podstavy
    0.7,                                 // výška druhé podstavy
    7,                                   // počet řídicích bodů
    <-0.228311,  0.228311>,              // souřadnice řídicích bodů
    <-1.000000, -1.000000>,
    < 1.000000, -1.000000>,
    < 0.228311,  0.228311>,
    <-0.228311,  0.228311>,
    <-1.000000, -1.000000>,
    < 1.000000, -1.000000>
}

object {
    Prism
    texture {
        pigment {
            agate
            agate_turb 0.3
            scale 0.2
            rotate 90*x                  // horizontální pruhy
        }
        finish {                         // optické vlastnosti materiálu
            phong 1                      // velikost a síla odlesku
            phong_size 300
        }
    }
    scale <2, 2, 2>
    translate <-1, 0.5, -0.6>
}



// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray0810

Obrázek 10: Třetí demonstrační příklad po vykreslení POV-Rayem

8. Čtvrtý demonstrační příklad – pyramida

Čtvrtý demonstrační příklad vychází z příkladu třetího, ovšem při tvorbě hranolu je použit modifikátor conic_sweep, který způsobí vytvoření pyramidy (základna je určena pomocí lineární spline křivky, tj. čtyř úseček tvořících čtverec). Aby byl vrcholek pyramidy viditelný (pyramida je totiž implicitně postavena „na špičku“), je celý objekt otočen o 180°. Zdrojový tvar čtvrtého a současně dnešního posledního demonstračního příkladu má tvar:

// ------------------------------------------------------------
// Scéna s jedním zobecněným hranolem (v tomto případě pyramidou)
// vytvořeným pomocí objektu typu "prism".
//
// rendering lze spustit příkazem: povray +W800 +H600 +B100 +FN +D +Iprism2.pov +Oprism2.png
// (pro náhled postačí zadat povray prism2.pov)
// ------------------------------------------------------------

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

#include "colors.inc"
#include "stones.inc"

camera {
    location <-10, 10, -10>              // pozice kamery
    right    4/3 * x                     // vektor směřující doprava
    up       z                           // vektor směřující nahoru
    look_at  <1, -0.6, 0>                // bod, na který kamera směřuje
    angle    20
}

// světelné zdroje
light_source {
    <0, 50, 10>                          // pozice světelného zdroje
    rgb 1                                // barva světla (bílé)
}

light_source {
    <-30, 20, -50>                       // pozice světelného zdroje
    rgb 0.7                              // barva světla (šedé)
}

light_source {
    <30, 20, -20>                        // pozice světelného zdroje
    rgb 0.7                              // barva světla (šedé)
}

// podkladová rovina
plane { y, 0
    texture {                            // textura - vlastnosti povrchu
        T_Stone5                         // definováno v externím souboru
        pigment {                        // vlastní vzorek textury
            octaves 3                    // modifikace procedurálního vzorku
            rotate 90*z
        }
        scale 10
        finish {                         // optické vlastnosti materiálu
            reflection 0.10
            ambient 0.2
            diffuse 0.8
        }
    }
}

#declare Prism = prism {                 // zobecněný hranol
    linear_spline                        // typ použité spline křivky
    conic_sweep
    0.0,                                 // výška první podstavy
    1.0,                                 // výška druhé podstavy
    5,                                   // počet vrcholů spline křivky
    <0.7,0.7>,<-0.7,0.7>,<-0.7,-0.7>,<0.7,-0.7>,<0.7,0.7>
}

object {
    Prism
    texture {
        pigment {
            agate
            agate_turb 0.3
            scale 0.15
            rotate 90*x                  // horizontální pruhy
        }
        finish {                         // optické vlastnosti materiálu
            phong 1                      // velikost a síla odlesku
            phong_size 300
        }
    }
    scale <2, -2, 2>
    translate <0, 2.0, -0.6>
}



// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray0811

Obrázek 11: Čtvrtý demonstrační příklad po vykreslení POV-Rayem

9. Obsah dalšího pokračování seriálu

V následující části seriálu o raytraceru POV-Ray už konečně dokončíme popis typů těles, které je možné v tomto renderovacím programu použít. Řekneme si, jakým způsobem je možné použít textové objekty (tj. tělesa vytvořená ze znaků) a především si popíšeme různé typy ploch: bikubické spline plochy, výšková pole a dále plochy popsané matematickým výrazem, zejména takzvané izoplochy, plochy zadané polygonem aj. Především izoplochy, které byly do POV-Raye přidány ve verzi 3.5, mohou být velmi užitečné, například při zkoumání geometrických vlastností různých funkcí, popř. kombinací více funkcí.

povray0812

Obrázek 12: Izoplochy vykreslené pomocí POV-Raye

Našli jste v článku chybu?

22. 4. 2008 10:40

Díky moc za pochvalu. Už minule se probíraly implicitní plochy, ty jsou tady docela "mocné", co se týče modelovacích schopností. Ale pro strojařsky či na design orientovaný CAD/CAM jsou spline křivky různého typu samozřejmě ideální.

22. 4. 2008 7:22

honyczek (neregistrovaný)
Na tento a na ten následující článek čekám celou dobuuuu. Hrozně sem se totiž těšil na složitější tělesa, než kvádr, koule atd.... Tento seriál se mi moc líbí, dokonce je to i dobře napsané *THUMBS UP*
Vitalia.cz: „Připluly“ z Německa a možná obsahují jed

„Připluly“ z Německa a možná obsahují jed

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Lupa.cz: Slevové šílenství je tu. Kde nakoupit na Black Friday?

Slevové šílenství je tu. Kde nakoupit na Black Friday?

Podnikatel.cz: Vládu obejde, kvůli EET rovnou do sněmovny

Vládu obejde, kvůli EET rovnou do sněmovny

DigiZone.cz: Česká televize mění schéma ČT :D

Česká televize mění schéma ČT :D

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

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

Lupa.cz: Avast po spojení s AVG propustí 700 lidí

Avast po spojení s AVG propustí 700 lidí

Lupa.cz: UX přestává pro firmy být magie

UX přestává pro firmy být magie

Vitalia.cz: Chtějí si léčit kvasinky. Lék je jen v Německu

Chtějí si léčit kvasinky. Lék je jen v Německu

Podnikatel.cz: EET zvládneme, budou horší zákony

EET zvládneme, budou horší zákony

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Vitalia.cz: To není kašel! Správná diagnóza zachrání život

To není kašel! Správná diagnóza zachrání život

Vitalia.cz: Baletky propagují zdravotní superpostel

Baletky propagují zdravotní superpostel

Root.cz: Vypadl Google a rozbilo se toho hodně

Vypadl Google a rozbilo se toho hodně

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

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

Vitalia.cz: Říká amoleta - a myslí palačinka

Říká amoleta - a myslí palačinka

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

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

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

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č?