Hlavní navigace

Bézierovy bikubické pláty v POV-Rayi

29. 4. 2008
Doba čtení: 18 minut

Sdílet

V deváté části seriálu o renderovacím programu POV-Ray si popíšeme, jakým způsobem je možné modelovat prakticky libovolně vytvarované plochy pomocí takzvaných Bézierových bikubických plátů. Jedná se o modelovací techniku zvanou plátování.

Obsah

1. Bézierovy bikubické pláty
2. Napojování Bézierových plátů (plátování)
3. Způsoby zobrazování Bézierových ploch
4. První demonstrační příklad – jednoduchý Bézierův bikubický plát
5. Druhý demonstrační příklad – dva pláty s ostrou návazností
6. Třetí demonstrační příklad – dva pláty s hladkou návazností
7. Čtvrtý demonstrační příklad – přehnutý plát
8. Pátý demonstrační příklad – čtyři pláty tvořící plášť tělesa
9. Obsah dalšího pokračování seriálu

1. Bézierovy bikubické pláty

V předchozí části tohoto seriálu jsme si popsali několik typů těles, které se modelovaly s využitím spline křivek (spline curves). Jednalo se především o rotační plochy a tělesa vzniklá tažením základního tvaru ve směru y-ové osy. V mnoha modelovacích programech jsou tyto typy těles přímo podporovány, jelikož je pomocí nich možné vytvořit skutečné (typicky strojově vyráběné) předměty. Ovšem pro tvorbu obecných tvarů se rotační tělesa ani tažené tvary příliš nehodí, protože jejich modelovací schopnosti nejsou tak velké, aby se s jejich pomocí dala snadno vytvořit například karoserie automobilu. Z tohoto důvodu se v mnoha CAD/CAM systémech i modelovacích programech setkáváme s podporou takzvaných parametrických ploch. Nejčastěji se jedná o Bézierovy plochy (speciálně pak Bézierovy bikubické pláty) a v náročnějších aplikacích se můžeme setkat s neuniformními racionálními B-spline plochami (NURBS). Ty však v POV-Rayi nejsou přímo podporovány, na rozdíl od Bézierových bikubických plátů, kterým se budeme v následujících třech kapitolách věnovat.

povray0901

Obrázek 1: Část modelu vytvořeného pomocí NURBS

Pro jednodušší modelovací systémy, kde je prioritou především rychlost vykreslování, lze povrch těles reprezentovat pomocí sady Bézierových ploch, které se intuitivně modelují a jsou snadno diferencovatelné, což je důležité zejména pro jejich jednoduché navazování a případné fyzikální simulace. Mezi jejich další výhody patří jednoduchý a rychlý výpočet bodů ležících na ploše, což Bézierovy plochy předurčuje pro použití v aplikacích, ve kterých je důležitá rychlost zobrazování trojrozměrných scén. V případě POV-Raye se Bézierovy plochy vykreslují buď přímo (tj. počítají se průsečíky paprsku s plochou) nebo nepřímo – plocha je nejdříve rozložena na jednodušší trojúhelníky, u nichž je výpočet průsečíku paprsku jednodušší.

Bézierovy (neracionální) plochy však neumožňují přesně modelovat povrch základních kvadrik (mezi něž patří například i koule, elipsoid, válec a kužel), nelze dokonce přesně vytvořit ani offsetovou plochu (offsetová plocha je plocha kopírující v určité vzdálenosti svou tvořicí plochu; příkladem může být objekt vytvořený z plechu, kde plech by se modeloval právě pomocí dvojice offsetových ploch) a nejsou invariantní vůči perspektivnímu promítání. To, že se pomocí Bézierových ploch nedají přesně modelovat kvadriky, nás v případě POV-Raye trápit nemusí, protože pro tato tělesa jsou vytvořeny samostatné uzly. Ani neexistující invariance vůči perspektivnímu promítání není problémem, na rozdíl od jiných renderovacích programů, které jsou založeny na jiném principu než na raytracingu.

Také podmínky pro hladké navázání jednotlivých plátů mohou být v některých případech poněkud omezující. Mimo jiné i z tohoto důvodu se jako nejjednodušší parametrické plochy pro modelování těles používají Bézierovy bikubické pláty (stupně 3), protože bikvadratické Bézierovy pláty (stupně 2) neposkytují dostatečný stupeň volnosti při modelování. A právě bikubické pláty je možné v POV-Rayi přímo použít, konkrétně se jedná o uzel nazvaný přímočaře bicubic_patch. Na druhém obrázku je zobrazeno šestnáct řídicích bodů použitých při vytváření Bézierova bikubického plátu (počet řídicích bodů nelze měnit, lze však vytvořit vícenásobné body).

povray0902

Obrázek 2: Šestnáct řídicích bodů Bézierova bikubického plátu

Na třetím obrázku je zobrazen Bézierův bikubický plát, jehož tvar je specifikovaný pomocí šestnácti řídicích bodů uspořádaných v mřížce, která má velikost 4×4 body. Mřížka řídicích bodů také tvoří konvexní obal, ve kterém celý plát leží. Tato vlastnost Bézierových ploch je často využívána, například při zobrazování ploch metodou sledování paprsku (raytracing) pro značné urychlení testů průsečíků paprsků s plochou, nebo při testování kolizí dvou těles v aplikacích virtuální reality.

povray0903

Obrázek 3: Bézierův bikubický plát specifikovaný šestnácti řídicími body

2. Napojování Bézierových plátů (plátování)

Samotný Bézierův bikubický plát samozřejmě nestačí pro vymodelování celého tělesa (například již zmíněné karoserie automobilu), proto musí existovat způsob, jak jednotlivé pláty vzájemně propojit tak, aby bylo dosaženo určité, předem známé, míry spojitosti. Při takzvaném plátování je velmi důležité zajistit hladké napojení jednotlivých Bézierových plátů na sebe. V případě napojování plátů se může podle parametrů aplikace požadovat různý stupeň spojitosti. Pokud mají dva pláty společnou alespoň jednu hranu, mají napojení typu C0, tj. mezi spoji nevznikají žádné mezery a spoje se nepřekrývají (ovšem může se jednat o ostré zlomy). Pokud mají dva pláty společnou jednu hranu a současně jsou shodné i parciální derivace ve všech bodech společné hrany, jedná se o napojení typu C1. Někdy je dostačující napojení typu G1, u kterého je zapotřebí zachovat spojitou změnu tečen – tečné vektory musí být kolineární.

U Bézierových bikubických plátů je možné při jejich navazování využít jejich specifických vlastností. Okraje bikubických plátů jsou tvořeny Bézierovými křivkami, jejichž řídicí body jsou určeny čtveřicí řídicích bodů bikubického plátu. Na samotném plátu také existuje několik dalších Bézierových křivek. Ty jsou určeny vždy čtveřicí řídicích bodů, které leží v jedné řadě či jednom sloupci (tj. mění vždy pouze jeden index řídicích bodů). Nás budou nyní zajímat především Bézierovy křivky tvořící okraj plátu:

povray0904

Obrázek 4: Význam okrajů Bézierova bikubického plátu

Bézierův bikubický plát prochází svými čtyřmi rohovými body, což je naznačeno na pátém obrázku. Pokud je zaručeno, že dva pláty mají společnou hranu, tj. jejich čtyři krajní body jsou totožné, má výsledná plocha spojitost C0 – mezi plochami nejsou mezery ani přesahy, ovšem může docházet k tvorbě ostrých hran. Pokud je zaručena i kolinearita tečných vektorů na okraji ploch (ty jsou zadané vždy dvojicí řídicích bodů Px,0-Px,1, nebo P0,y-P1,y), má výsledná plocha spojitost G0, což je pro většinu úloh počítačové graficky více než dostačující.

povray0905

Obrázek 5: Krajní body, kterými prochází Bézierův bikubický plát

3. Způsoby zobrazování Bézierových ploch

Bézierovy plochy lze zobrazovat například převodem na síť trojúhelníků (TIN) s následným vykreslením této sítě pomocí grafických akcelerátorů, nebo s využitím metody zpětného sledování paprsku. Existují dvě nejpoužívanější metody převodu: polygonizace postupným dosazením hodnot u a v do vztahu platného pro Bézierův bikubický plát nebo rekurzivní dělení plátu de Casteljauovým algoritmem.

Druhá metoda je většinou pro implementaci výhodnější, protože umožňuje provádět adaptivní dělení křivky a při výpočtu se používá celočíselné aritmetiky pouze s operacemi sčítání, odečítání a aritmetickým posunem. U adaptivního dělení je zapotřebí zajistit, aby se sousední pláty rozdělily na stejný počet dílů (trojúhelníků), jinak může nastat vizuální zlomení plochy vlivem takzvaných T-spojů. V POV-Rayi se tento způsob rozdělení plochy použije v případě, že se nastaví typ plátu na hodnotu 1, tj. uvede se klauzule type 1.

Dalším způsobem, jímž je možné zobrazovat Bézierovy plochy, je přímé použití metody zpětného sledování paprsku (raytracingu), protože je možné numerickými postupy spočítat průsečík paprsku s Bézierovou plochou. Tato metoda, která je použita například v POV-Rayi za předpokladu, že je typ plátu nastaven na nulu (type 0), však obecně není kvůli své časové složitosti a možnosti vzniku viditelných chyb na zobrazované ploše příliš často využívána. Zjednodušeně řečeno se dá říci, že v POV-Rayi máme na výběr dvě možnosti, ze kterých vybíráme podle toho, jak velké modely je nutné zobrazovat, popř. kolik času obětujeme pro vykreslení:

  1. Plát se nejprve (ve fázi takzvaného preprocesingu scény) rozloží na síť trojúhelníků, která je obecně zobrazována rychleji, ovšem alokuje se větší množství paměti.
  2. Plát je přímo účastní zpětného sledování paprsku (zde se pro výpočet průsečíku použijí numerické metody, ne analytické), což je sice pomalejší, ovšem spotřeba paměti je minimální.

Při vykreslování se musíme také rozhodnout, jak přesný má být vlastní výpočet Bézierova plátu při vykreslování. To je řízeno parametry flatness, u_steps a v_steps. Nejprve si popišme význam parametrů u_steps a v_steps. Ty udávají, na kolik trojúhelníků se má plát rozdělit, přičemž platí, že počet vygenerovaných trojúhelníků je roven:

2×(2u_steps × 2v_steps)

povray0906

Obrázek 6: Nastavení parametru flatness na nenulovou hodnotu může přinést problémy spočívající ve vzniku vizuálních chyb

Čím vyšší jsou zadané hodnoty jednoho či obou těchto parametrů, tím přesněji sice bude Bézierův bikubický plát trojúhelníky aproximován, ovšem na úkor alokované operační paměti a částečně i času výpočtu. Při dělení lze použít i adaptivního de Casteljauova algoritmu, při kterém je dělení řízeno parametrem flatness. V případě, že je hodnota tohoto parametru nenulová, POV-Ray na základě lokálního zakřivení plochy zjišťuje, zda je další dělení skutečně nutné. To je sice na první pohled výhodné, protože v místech malého zakřivení plochy se dělení nemusí provádět do přílišné hloubky a naopak. Ovšem ve skutečnosti to může vést ke vzniku děr ve vykreslované ploše (takzvané T-spoje), takže osobně bych spíše doporučoval ponechávat tento parametr na implicitní (nulové) hodnotě.

povray0907

Obrázek 7: Zvětšený detail místa, ve kterém došlo ke vzniku nežádoucích T-spojů

4. První demonstrační příklad – jednoduchý Bézierův bikubický plát

V dnešním prvním demonstračním příkladu je ukázáno vykreslení Bézierova bikubického plátu, který je, jak již víme z předchozích kapitol, specifikován typem plátu (přesněji řečeno způsobem jeho vykreslení), počtem dělení plátu na trojúhelníky ve směru růstu parametrů u a v a samozřejmě samotnými řídicími body uspořádanými v parametrickém prostoru do mřížky 4×4. Povšimněte si, že hodnota flatness není zadána, což znamená, že je nastavena na implicitní nulovou hodnotu, tj. neprovádí se adaptivní dělení plátu. Parametry u_steps a v_steps jsou shodně nastaveny na hodnotu 8, což znamená, že celkový počet trojúhelníků, na které je Bézierův plát rozložen, činí 2×28×28=131072. To je již poměrně velká hodnota. Většinou postačuje tyto parametry nastavit na hodnotu 3 až 4. Následuje výpis zdrojového kódu prvního demonstračního příkladu:

// ------------------------------------------------------------
// Scéna s jedním Bézierovým bikubickým plátem.
//
// Odvozeno od původního zdrojového kódu Alexandra Enzmanna
//
// rendering lze spustit příkazem: povray +W800 +H600 +B100 +FN +D +Ibezier.pov +Obezier.png
// (pro náhled postačí zadat povray bezier.pov)
// ------------------------------------------------------------



// globální nastavení parametrů scény
global_settings {
    assumed_gamma 2.2
}
#include "colors.inc"
#include "stones.inc"
#include "textures.inc"

camera {
   location  <0.0, 0.0, -15.0>           // pozice kamery
   right     <4/3, 0.0,  0.0>            // vektor směřující doprava
   up        <0.0, 1.0,  0.0>            // vektor směřující nahoru
   direction <0.0, 0.0,  1.0>            // bod, na který kamera směřuje
}

// světelný zdroj
light_source {
    <5, 7, -5>                           // pozice světelného zdroje
    color White                          // barva světla (bílé)
}

// podkladová rovina
plane {
    z, 500
    hollow on
    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 50
        finish {                         // optické vlastnosti materiálu
            reflection 0.10
            ambient 0.2
            diffuse 0.8
        }
    }
}

// Bézierův bikubický plát
bicubic_patch {
    type 1                               // typ: zde rozdělení plátu na trojúhelníky
    // flatness 0.5                      // odkomentujte pro demonstraci chyb
    u_steps 8                            // dělení plochy (zde velmi přesné)
    v_steps 8

    // 16 řídicích bodů Bézierova bikubického plátu
   < 0.0, 0.0, 2.0>, < 1.0, 0.0, 0.0>, < 2.0, 0.0, 0.0>, < 3.0, 0.0, -2.0>,
   < 0.0, 1.0, 0.0>, < 1.0, 1.0, 0.0>, < 2.0, 1.0, 0.0>, < 3.0, 1.0,  0.0>,
   < 0.0, 2.0, 0.0>, < 1.0, 2.0, 0.0>, < 2.0, 2.0, 0.0>, < 3.0, 2.0,  0.0>,
   < 0.0, 3.0, 2.0>, < 1.0, 3.0, 0.0>, < 2.0, 3.0, 0.0>, < 3.0, 3.0, -2.0>

    texture {                            // textura namapovaná na povrch plátu
        pigment {                        // šachovnicový vzor
         checker color White color Blue  // barva na šachovnici
         translate <0, 0.1, 0>           // změna textury tak, aby se v y-ové ose neměnila
         scale <0.5, 20.0, 0.5>
         rotate 90*x
         quick_color Red
        }
        finish {                         // optické vlastnosti materiálu
            ambient 0.1
            diffuse 0.9
            phong 1                      // odlesky
        }
    }
    translate <-1.5, -1.5, 0>            // lineární transformace aplikované na objekt
    scale     2.6
    rotate    <30, -60, 0>
}



// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray0908

Obrázek 8: Screenshot prvního demonstračního příkladu

5. Druhý demonstrační příklad – dva pláty s ostrou návazností

Ve druhém příkladu je ukázán způsob napojení dvou Bézierových bikubických plátů tak, aby v místě napojení došlo k vytvoření ostré hrany. Krajní řídicí body obou plátů jsou shodné, tj. mezi pláty nevznikají mezery. Ovšem tečné vektory se liší svým směrem, což vede ke vzniku zmiňované hrany.

// ------------------------------------------------------------
// Jednoduchá scéna s dvojicí Bézierových bikubických plátů,
// které na sebe navazují se spojitostí C0.
// ------------------------------------------------------------

#include "colors.inc"

global_settings {
    assumed_gamma 2.2
}

camera {
   location <0, 0, -2.5>                 // umístění kamery
   right    4/3 * x                      // vektor směřující doprava
   up       y                            // a nahoru
   look_at  <0, 0, 0>                    // bod, na který se kamera zaměřila
}

light_source {                           // první světelný zdroj
    <2, 6, -10>                          // pozice světelného zdroje
    color red 0.7 green 0.7 blue 0.7     // barva světelného zdroje
}

light_source {                           // druhý světelný zdroj
    <0, 0, -10000>                       // pozice světelného zdroje
    color red 0.7 green 0.7 blue 0.7     // barva světelného zdroje
    shadowless
}

plane {                                  // rovina tvořící pozadí scény
    <0, 0, 1>, 2                         // posun a orientace roviny
    hollow on
    pigment {                            // procedurální textura
        agate
        agate_turb 0.3
    }
    finish {                             // optické vlastnosti materiálu povrchu
        ambient 0.1
        diffuse 0.4
    }
}


// Bézierův bikubický plát
bicubic_patch {
    type 1                               // typ: zde rozdělení plátu na trojúhelníky
    u_steps 6                            // dělení plochy (zde velmi přesné)
    v_steps 6

    // 16 řídicích bodů Bézierova bikubického plátu
   < -1.5,-1.5, 1.0>, < -0.5,-1.5, 0.0>, < 0.5,-1.5, -1.0>, < 1.5,-1.5, 0.0>,
   < -1.5,-0.5, 1.0>, < -0.5,-0.5, 0.0>, < 0.5,-0.5, -1.0>, < 1.5,-0.5, 0.0>,
   < -1.5, 0.5, 1.0>, < -0.5, 0.5, 0.0>, < 0.5, 0.5, -1.0>, < 1.5, 0.5, 0.0>,
   < -1.5, 1.5, 1.0>, < -0.5, 1.5, 0.0>, < 0.5, 1.5, -1.0>, < 1.5, 1.5, 0.0>
    texture {
        pigment {
            color red 0 green 0 blue 1   // barva materiálu
        }
        finish {                         // optické vlastnosti materiálu povrchu
            ambient  0.2
            diffuse  0.4
            specular 0.6
            phong    0.6
            phong_size 3
            reflection 0
        }
    }
    scale 0.5
    translate <-0.75,0,0>
    rotate <30,0,0>
}

// Bézierův bikubický plát
bicubic_patch {
    type 1                               // typ: zde rozdělení plátu na trojúhelníky
    u_steps 6                            // dělení plochy (zde velmi přesné)
    v_steps 6

    // 16 řídicích bodů Bézierova bikubického plátu
   < -1.5,-1.5, 0.0>, < -0.5,-1.5, 0.0>, < 0.5,-1.5, 0.0>, < 1.5,-1.5, 0.0>,
   < -1.5,-0.5, 0.0>, < -0.5,-0.5, 0.0>, < 0.5,-0.5, 0.0>, < 1.5,-0.5, 0.0>,
   < -1.5, 0.5, 0.0>, < -0.5, 0.5, 0.0>, < 0.5, 0.5, 0.0>, < 1.5, 0.5, 0.0>,
   < -1.5, 1.5, 0.0>, < -0.5, 1.5, 0.0>, < 0.5, 1.5, 0.0>, < 1.5, 1.5, 0.0>
    texture {
        pigment {
            color red 1 green 0 blue 0   // barva materiálu
        }
        finish {                         // optické vlastnosti materiálu povrchu
            ambient  0.2
            diffuse  0.4
            specular 0.6
            phong    0.6
            phong_size 3
            reflection 0
        }
    }
    scale 0.5
    translate <0.75,0,0>
    rotate <30,0,0>
}


// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray0909

Obrázek 9: Screenshot druhého demonstračního příkladu

6. Třetí demonstrační příklad – dva pláty s hladkou návazností

Předchozí demonstrační příklad lze upravit tak, aby na sebe pláty hladce navazovaly. Postačí změnit pozici druhého sloupce řídicích bodů druhého plátu tak, aby byl zachován směr (a v tomto případě dokonce i velikost) tečných vektorů v místě dotyků obou plátů.

// ------------------------------------------------------------
// Jednoduchá scéna s dvojicí Bézierových bikubických plátů,
// které na sebe navazují se spojitostí G1.
// ------------------------------------------------------------

#include "colors.inc"

global_settings {
    assumed_gamma 2.2
}

camera {
   location <0, 0, -2.5>                 // umístění kamery
   right    4/3 * x                      // vektor směřující doprava
   up       y                            // a nahoru
   look_at  <0, 0, 0>                    // bod, na který se kamera zaměřila
}

light_source {                           // první světelný zdroj
    <2, 6, -10>                          // pozice světelného zdroje
    color red 0.7 green 0.7 blue 0.7     // barva světelného zdroje
}

light_source {                           // druhý světelný zdroj
    <0, 0, -10000>                       // pozice světelného zdroje
    color red 0.7 green 0.7 blue 0.7     // barva světelného zdroje
    shadowless
}

plane {                                  // rovina tvořící pozadí scény
    <0, 0, 1>, 2                         // posun a orientace roviny
    hollow on
    pigment {                            // procedurální textura
        agate
        agate_turb 0.3
    }
    finish {                             // optické vlastnosti materiálu povrchu
        ambient 0.1
        diffuse 0.4
    }
}


// Bézierův bikubický plát
bicubic_patch {
    type 1                               // typ: zde rozdělení plátu na trojúhelníky
    u_steps 6                            // dělení plochy (zde velmi přesné)
    v_steps 6

    // 16 řídicích bodů Bézierova bikubického plátu
   < -1.5,-1.5, 1.0>, < -0.5,-1.5, 0.0>, < 0.5,-1.5, -1.0>, < 1.5,-1.5, 0.0>,
   < -1.5,-0.5, 1.0>, < -0.5,-0.5, 0.0>, < 0.5,-0.5, -1.0>, < 1.5,-0.5, 0.0>,
   < -1.5, 0.5, 1.0>, < -0.5, 0.5, 0.0>, < 0.5, 0.5, -1.0>, < 1.5, 0.5, 0.0>,
   < -1.5, 1.5, 1.0>, < -0.5, 1.5, 0.0>, < 0.5, 1.5, -1.0>, < 1.5, 1.5, 0.0>
    texture {
        pigment {
            color red 0 green 0 blue 1   // barva materiálu
        }
        finish {                         // optické vlastnosti materiálu povrchu
            ambient  0.2
            diffuse  0.4
            specular 0.6
            phong    0.6
            phong_size 3
            reflection 0
        }
    }
    scale 0.5
    translate <-0.75,0,0>
    rotate <30,0,0>
}

// Bézierův bikubický plát
bicubic_patch {
    type 1                               // typ: zde rozdělení plátu na trojúhelníky
    u_steps 6                            // dělení plochy (zde velmi přesné)
    v_steps 6

    // 16 řídicích bodů Bézierova bikubického plátu
   < -1.5,-1.5, 0.0>, < -0.5,-1.5, 1.0>, < 0.5,-1.5, 0.0>, < 1.5,-1.5,-1.0>,
   < -1.5,-0.5, 0.0>, < -0.5,-0.5, 1.0>, < 0.5,-0.5, 0.0>, < 1.5,-0.5,-1.0>,
   < -1.5, 0.5, 0.0>, < -0.5, 0.5, 1.0>, < 0.5, 0.5, 0.0>, < 1.5, 0.5,-1.0>,
   < -1.5, 1.5, 0.0>, < -0.5, 1.5, 1.0>, < 0.5, 1.5, 0.0>, < 1.5, 1.5,-1.0>
    texture {
        pigment {
            color red 1 green 0 blue 0   // barva materiálu
        }
        finish {                         // optické vlastnosti materiálu povrchu
            ambient  0.2
            diffuse  0.4
            specular 0.6
            phong    0.6
            phong_size 3
            reflection 0
        }
    }
    scale 0.5
    translate <0.75,0,0>
    rotate <30,0,0>
}


// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray0910

Obrázek 10: Screenshot třetího demonstračního příkladu

7. Čtvrtý demonstrační příklad – přehnutý plát

Ve čtvrtém demonstračním příkladu je ukázána tvorba přehnutého plátu. Řídicí body totiž nemusí ležet v rigidní pravidelné mřížce. Jejich vzájemná poloha v podstatě není ničím omezena, čehož je v tomto případě využito. Povšimněte si, že napojení plátů na sebe je určeno pouze dvěma sloupci řídicích bodů, zbývající dva sloupce způsob napojení neovlivní.

// ------------------------------------------------------------
// Jednoduchá scéna s dvojicí Bézierových bikubických plátů,
// které na sebe navazují se spojitostí G1. Druhý plát je přehnut.
// ------------------------------------------------------------

#include "colors.inc"

global_settings {
    assumed_gamma 2.2
}

camera {
   location <0, 0, -2.5>                 // umístění kamery
   right    4/3 * x                      // vektor směřující doprava
   up       y                            // a nahoru
   look_at  <0, 0, 0>                    // bod, na který se kamera zaměřila
}

light_source {                           // první světelný zdroj
    <2, 6, -10>                          // pozice světelného zdroje
    color red 0.7 green 0.7 blue 0.7     // barva světelného zdroje
}

light_source {                           // druhý světelný zdroj
    <20, 6, -5>                          // pozice světelného zdroje
    color red 0.7 green 0.7 blue 0.7     // barva světelného zdroje
    shadowless
}

plane {                                  // rovina tvořící pozadí scény
    <0, 0, 1>, 2                         // posun a orientace roviny
    hollow on
    pigment {                            // procedurální textura
        agate
        agate_turb 0.3
    }
    finish {                             // optické vlastnosti materiálu povrchu
        ambient 0.1
        diffuse 0.4
    }
}


// Bézierův bikubický plát
bicubic_patch {
    type 1                               // typ: zde rozdělení plátu na trojúhelníky
    u_steps 6                            // dělení plochy (zde velmi přesné)
    v_steps 6

    // 16 řídicích bodů Bézierova bikubického plátu
   < -1.5,-1.5, 1.0>, < -0.5,-1.5, 2.0>, < 0.5,-1.5, -1.0>, < 1.5,-1.5, 0.0>,
   < -1.5,-0.5, 1.0>, < -0.5,-0.5, 0.0>, < 0.5,-0.5, -1.0>, < 1.5,-0.5, 0.0>,
   < -1.5, 0.5, 1.0>, < -0.5, 0.5, 0.0>, < 0.5, 0.5, -1.0>, < 1.5, 0.5, 0.0>,
   < -1.5, 1.5, 1.0>, < -0.5, 1.5,-2.0>, < 0.5, 1.5, -1.0>, < 1.5, 1.5, 0.0>
    texture {
        pigment {
            color red 0 green 0 blue 1   // barva materiálu
        }
        finish {                         // optické vlastnosti materiálu povrchu
            ambient  0.2
            diffuse  0.4
            specular 0.6
            phong    0.6
            phong_size 3
            reflection 0
        }
    }
    scale 0.5
    translate <-0.75,0,0>
    rotate <30,0,0>
}

// Bézierův bikubický plát
bicubic_patch {
    type 1                               // typ: zde rozdělení plátu na trojúhelníky
    u_steps 6                            // dělení plochy (zde velmi přesné)
    v_steps 6

    // 16 řídicích bodů Bézierova bikubického plátu
   < -1.5,-1.5, 0.0>, <  0.5,-1.5, 1.0>, < 1.5,-1.5, 1.0>, <-1.0,-1.5,-2.0>,
   < -1.5,-0.5, 0.0>, <  0.5,-0.5, 1.0>, < 1.5,-0.5, 1.0>, <-0.5,-0.5,-2.0>,
   < -1.5, 0.5, 0.0>, <  0.5, 0.5, 1.0>, < 1.5, 0.5, 1.0>, <-0.5, 0.5,-2.0>,
   < -1.5, 1.5, 0.0>, <  0.5, 1.5, 1.0>, < 1.5, 1.5, 1.0>, <-1.0, 1.5,-2.0>
    texture {
        pigment {
            color red 1 green 0 blue 0   // barva materiálu
        }
        finish {                         // optické vlastnosti materiálu povrchu
            ambient  0.2
            diffuse  0.4
            specular 0.6
            phong    0.6
            phong_size 3
            reflection 0
        }
    }
    scale 0.5
    translate <0.75,0,0>
    rotate <30,0,0>
}


// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray0911

Obrázek 11: Screenshot čtvrtého demonstračního příkladu

8. Pátý demonstrační příklad – čtyři pláty tvořící plášť tělesa

V pátém demonstračním příkladu jsou použity čtyři Bézierovy bikubické pláty, které jsou naprosto shodné, liší se pouze svým natočením. Pomocí těchto plátů je vytvořen plášť tělesa. V místě napojení vzniká hrana.

// ------------------------------------------------------------
// Čtyři Bézierovy bikubické pláty tvořící plášť tělesa.
// ------------------------------------------------------------

#include "colors.inc"

global_settings {
    assumed_gamma 2.2
}

camera {
   location <0, 0, -2.5>                 // umístění kamery
   right    4/3 * x                      // vektor směřující doprava
   up       y                            // a nahoru
   look_at  <0, 0, 0>                    // bod, na který se kamera zaměřila
}

light_source {                           // první světelný zdroj
    <0, 0, -6>                           // pozice světelného zdroje
    color red 0.7 green 0.7 blue 0.7     // barva světelného zdroje
}

light_source {                           // druhý světelný zdroj
    <0, 0, -10000>                       // pozice světelného zdroje
    color red 0.7 green 0.7 blue 0.7     // barva světelného zdroje
    shadowless
}

plane {                                  // rovina tvořící pozadí scény
    <0, 0, 1>, 2                         // posun a orientace roviny
    hollow on
    pigment {                            // procedurální textura
        agate
        agate_turb 0.3
    }
    finish {                             // optické vlastnosti materiálu povrchu
        ambient 0.1
        diffuse 0.4
    }
}

merge {

    // Bézierův bikubický plát
    bicubic_patch {
        type 1                               // typ: zde rozdělení plátu na trojúhelníky
        u_steps 6                            // dělení plochy (zde velmi přesné)
        v_steps 6

        // 16 řídicích bodů Bézierova bikubického plátu
       < -1.5, 1.5,-1.5>, < -0.5, 1.5,-1.5>, < 0.5, 1.5,-1.5>, < 1.5, 1.5,-1.5>,
       < -1.5, 1.5,-0.5>, < -0.5, 3.5,-0.5>, < 0.5, 3.5,-0.5>, < 1.5, 1.5,-0.5>,
       < -1.5, 1.5, 0.5>, < -0.5, 3.5, 0.5>, < 0.5, 3.5, 0.5>, < 1.5, 1.5, 0.5>,
       < -1.5, 1.5, 2.5>, < -0.5, 1.5, 1.5>, < 0.5, 1.5, 1.5>, < 1.5, 1.5, 2.5>
        texture {
            pigment {
                color red 0 green 0 blue 1   // barva materiálu
            }
            finish {                         // optické vlastnosti materiálu povrchu
                ambient  0.2
                diffuse  0.4
                specular 0.6
                phong    0.6
                phong_size 3
                reflection 0
            }
        }
        scale 0.5
    }

    // Bézierův bikubický plát
    bicubic_patch {
        type 1                               // typ: zde rozdělení plátu na trojúhelníky
        u_steps 6                            // dělení plochy (zde velmi přesné)
        v_steps 6

        // 16 řídicích bodů Bézierova bikubického plátu
       < -1.5, 1.5,-1.5>, < -0.5, 1.5,-1.5>, < 0.5, 1.5,-1.5>, < 1.5, 1.5,-1.5>,
       < -1.5, 1.5,-0.5>, < -0.5, 3.5,-0.5>, < 0.5, 3.5,-0.5>, < 1.5, 1.5,-0.5>,
       < -1.5, 1.5, 0.5>, < -0.5, 3.5, 0.5>, < 0.5, 3.5, 0.5>, < 1.5, 1.5, 0.5>,
       < -1.5, 1.5, 2.5>, < -0.5, 1.5, 1.5>, < 0.5, 1.5, 1.5>, < 1.5, 1.5, 2.5>
        texture {
            pigment {
                color red 0 green 0 blue 1   // barva materiálu
            }
            finish {                         // optické vlastnosti materiálu povrchu
                ambient  0.2
                diffuse  0.4
                specular 0.6
                phong    0.6
                phong_size 3
                reflection 0
            }
        }
        scale 0.5
        rotate <0, 0, -90>
    }
    // Bézierův bikubický plát
    bicubic_patch {
        type 1                               // typ: zde rozdělení plátu na trojúhelníky
        u_steps 6                            // dělení plochy (zde velmi přesné)
        v_steps 6

        // 16 řídicích bodů Bézierova bikubického plátu
       < -1.5, 1.5,-1.5>, < -0.5, 1.5,-1.5>, < 0.5, 1.5,-1.5>, < 1.5, 1.5,-1.5>,
       < -1.5, 1.5,-0.5>, < -0.5, 3.5,-0.5>, < 0.5, 3.5,-0.5>, < 1.5, 1.5,-0.5>,
       < -1.5, 1.5, 0.5>, < -0.5, 3.5, 0.5>, < 0.5, 3.5, 0.5>, < 1.5, 1.5, 0.5>,
       < -1.5, 1.5, 2.5>, < -0.5, 1.5, 1.5>, < 0.5, 1.5, 1.5>, < 1.5, 1.5, 2.5>
        texture {
            pigment {
                color red 0 green 0 blue 1   // barva materiálu
            }
            finish {                         // optické vlastnosti materiálu povrchu
                ambient  0.2
                diffuse  0.4
                specular 0.6
                phong    0.6
                phong_size 3
                reflection 0
            }
        }
        scale 0.5
        rotate <0, 0, 90>
    }
    // Bézierův bikubický plát
    bicubic_patch {
        type 1                               // typ: zde rozdělení plátu na trojúhelníky
        u_steps 6                            // dělení plochy (zde velmi přesné)
        v_steps 6

        // 16 řídicích bodů Bézierova bikubického plátu
       < -1.5, 1.5,-1.5>, < -0.5, 1.5,-1.5>, < 0.5, 1.5,-1.5>, < 1.5, 1.5,-1.5>,
       < -1.5, 1.5,-0.5>, < -0.5, 3.5,-0.5>, < 0.5, 3.5,-0.5>, < 1.5, 1.5,-0.5>,
       < -1.5, 1.5, 0.5>, < -0.5, 3.5, 0.5>, < 0.5, 3.5, 0.5>, < 1.5, 1.5, 0.5>,
       < -1.5, 1.5, 2.5>, < -0.5, 1.5, 1.5>, < 0.5, 1.5, 1.5>, < 1.5, 1.5, 2.5>
        texture {
            pigment {
                color red 0 green 0 blue 1   // barva materiálu
            }
            finish {                         // optické vlastnosti materiálu povrchu
                ambient  0.2
                diffuse  0.4
                specular 0.6
                phong    0.6
                phong_size 3
                reflection 0
            }
        }
        scale 0.5
        rotate <0, 0, 180>
    }
    scale 0.9
    rotate <0, 140, 70>
}

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray0912

Obrázek 12: Screenshot pátého demonstračního příkladu

root_podpora

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

V následující části seriálu o raytraceru POV-Ray si kromě popisu dalších dvou typů těles (konkrétně výškového pole a objektu vzniklého tažením koule po zadané dráze) ukážeme přímé vykreslování různých matematických funkcí s využitím objektů typu poly a isosurface. Také si vysvětlíme princip výpočtu osvětlení ve vytvářených scénách, různé typy světel a nastavení základních optických vlastností povrchu vykreslovaných tě­les.

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.