Hlavní navigace

POV-Ray a matematika

Pavel Tišnovský

V jedenácté části seriálu o raytraceru POV-Ray si ukážeme způsob vykreslování implicitních ploch popsaných pomocí polynomů. Mezi tyto plochy patří nejen kvadriky (koule, kužel, válec), ovšem i další tvarově složitější tělesa, jakými jsou například toroidy, kapky, sedlové plochy atd.

Obsah

1. Práce s kubikami
2. První demonstrační příklad – vykreslení kubik
3. Použití objektu typu quartic
4. Druhý demonstrační příklad – několik objektů typu quartic
5. Obecné plochy zadané polynomem
6. Třetí demonstrační příklad – plocha specifikovaná objektem typu poly
7. Čtvrtý demonstrační příklad – další plocha specifikovaná objektem typu poly
8. Obsah následující části seriálu

1. Práce s kubikami

V páté části tohoto seriálu jsme si teoreticky i na jednom poměrně rozsáhlém demonstračním příkladu ukázali způsob modelování takzvaných kvadrik pomocí POV-Rayovského objektu nazvaného (jak jinak) quadric. Jedná se o objekt definovaný pomocí deseti reálných čísel zapsaných ve formě tří třísložkových vektorů a jedné skalární hodnoty. Zápis těchto hodnot má v syntaxi POV-Raye tvar:

quadric {
        <A,B,C>, <D,E,F>, <G,H,I>, J
    } 

Ve své podstatě se jedná o specifikaci parametrů implicitní funkce, která je vykreslována tím způsobem, že jsou analyticky vypočteny všechny průsečíky paprsku s plochou tvořenou všemi body, které splňují rovnici:

A x2 + B y2 + C z2 + D xy + E xz + F yz + G x + H y + I z + J = 0 

Uživatelem zadané koeficienty A až J je možné rozdělit do čtyř skupin. V první skupině se nachází koeficienty ovlivňující druhé mocniny souřadnic x2, y2 a z2, ve druhé skupině koeficienty použité u jednotlivých kombinací souřadnic xy, xz a yz, ve třetí skupině násobicí (multiplikativní) koeficienty uvedené přímo u souřadnic x, y a z a konečně čtvrtou skupinu představuje samostatný koeficient J, který ovlivňuje velikost tělesa (například u koule její poloměr). Rozdělení koeficientů do skupin respektuje i způsob zápisu kvadriky do vytvářené scény, protože jsou použity tři třísložkové vektory a poslední numerický koeficient J je zapsán samostatně, což jsme si ostatně uvedli v předchozích odstavcích.

povray1001

Několik modelů vytvořených pomocí objektu typu quadric

V POV-Rayi je však možné vytvářet i další objekty, jejichž implicitně zadaná plocha je specifikovaná pomocí polynomů vyšších řádů. Jedná se především o kubiky a obecné polynomiální plochy. Nejprve si popišme kubiky. Zatímco kvadriky byly zadány pomocí polynomu, ve kterém se vyskytovaly maximálně druhé mocniny souřadnic x, y, z a všechny kombinace prvních mocnin, jsou u kubik použity i třetí mocniny. To má samozřejmě za následek větší množství parametrů, které uživatel musí specifikovat, ale především je možné modelovat mnohem větší množství tvarů, než to bylo možné pomocí kvadrik. Parametrů (přesněji řečeno koeficientů polynomu) není v tomto případě pouze deset, ale hned dvacet a jsou zapsány v jednom vektoru:

cubic {
        <A1, A2, A3,... A20>
    } 

Význam jednotlivých koeficientů vyplývá z následující rovnice implicitní plochy (všimněte si, že součet mocnin v každém členu je roven maximálně třem a že jsou vyčerpány všechny povolené kombinace včetně nulté mocniny v posledním členu):

A1x3 + A2x2y + A3x2z + A4x2 + A5xy2 + A6xyz + A7xy + A8xz2 + A9xz + A10x + A11y3 + A12y2z + A13y2 + A14yz2 + A15yz + A16y + A17z3 + A18z2 + A19z + A20 

2. První demonstrační příklad – vykreslení kubik

V dnešním prvním demonstračním příkladu je ukázáno dvanáct různých kubik. Vzhledem k tomu, že kubiky jsou nadmnožinou kvadrik (viz pátá část tohoto seriálu), je samozřejmě možné pomocí kubik vykreslit i typické tvary, jako je koule, kužel, válec či paraboloid. Kromě toho lze však využít i dalších deset členů polynomu s vyššími mocninami, což je z některých tvarů uvedených v tomto demonstračním příkladu patrné. Všimněte si i použití klíčového slova sturm, kterým se zapíná pomalejší, ale zato mnohem přesnější výpočet průsečíku paprsku s implicitní plochou představovanou kubikou. Pokud by toto klíčové slovo nebylo uvedeno, mohly by se při vykreslování objevit vizuální chyby, například chybějící či naopak přebývající části ploch. Zdrojový tvar prvního demonstračního příkladu je následující:

// ------------------------------------------------------------
// Demonstrační scéna s několika kubikami.
//
// rendering lze spustit příkazem:
//     povray +W800 +H600 +B100 +FN +D +Icubic.pov +Ocubic.png
// (pro náhled postačí zadat povray cubic.pov)
// ------------------------------------------------------------

#version 3.1;                            // specifikace verze POV-Raye

global_settings {
    assumed_gamma 2.2
}

#include "colors.inc"
#include "woods.inc"

// makra použitá pro rozmístění kvadrik v prostoru
#declare Radius =2.5;
#declare RowSpace=1.1;
#declare ColSpace=1.1;
#declare Dist=-3;
#declare Row3= 2;
#declare Row2=Row3+Radius*RowSpace*2;
#declare Row1=Row2+Radius*RowSpace*2;
#declare Col1= -Radius*ColSpace*3;
#declare Col2= Col1+Radius*ColSpace*2;
#declare Col3= Col2+Radius*ColSpace*2;
#declare Col4= Col3+Radius*ColSpace*2;
#declare Col5= Col4+Radius*ColSpace*2;

camera {
    location  <0, 0, -60>                // pozice kamery
    direction <0, 0,  10>                // směr jejího nasměrování
    look_at   <0, 0,   0>
    translate <0, Row2, -110>            // a její umístění v prostoru
}

light_source {
    <1000, 1000, -2000>
    color White
}

plane {                                  // rovina tvořící pozadí scény
    <0, 0, 1>, 1.01                      // 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
    }
}

#declare Solid=
texture {                                // vlastnosti materiálu
    pigment {                            // použitého pro kubiky
        Green
    }
    finish {
        phong 1
    }
}

#declare UnitBox = box {                 // omezující těleso pro nekonečné kubiky
    <-1, -1, -1>, <1, 1, 1>
}

// deklarace jednotlivých typů kubik

#declare CubicSphere = cubic {
  <
// x^3,      x^2y,     x^2z,     x^2,
   0,        0,        0,        1,
// xy^2,     xyz,      xy,       xz^2,
   0,        0,        0,        0,
// xz,       x,        y^3,      y^2z,
   0,        0,        0,        0,
// y^2,      yz^2,     yz,       y,
   1,        0,        0,        0,
// z^3,      z^2,      z,        C
   0,        1,        0,        -4 // poloměr
  >
  sturm
}

#declare CleanCubic = cubic { // plocha x^3+y^3+z^3+4=0
  <
// x^3,      x^2y,     x^2z,     x^2,
   1,        0,        0,        0,
// xy^2,     xyz,      xy,       xz^2,
   0,        0,        0,        0,
// xz,       x,        y^3,      y^2z,
   0,        0,        1,        0,
// y^2,      yz^2,     yz,       y,
   0,        0,        0,        0,
// z^3,      z^2,      z,        C
   1,        0,        0,        4
  >
  sturm
}

#declare CylinderXY = cubic { // plocha x^2+y^2-2=0 ~ válec
  <
// x^3,      x^2y,     x^2z,     x^2,
   0,        0,        0,        1,
// xy^2,     xyz,      xy,       xz^2,
   0,        0,        0,        0,
// xz,       x,        y^3,      y^2z,
   0,        0,        0,        0,
// y^2,      yz^2,     yz,       y,
   1,        0,        0,        0,
// z^3,      z^2,      z,        C
   0,        0,        0,        -2
  >
  sturm
}

#declare CylinderXZ = cubic { // plocha x^2+z^2+4xy-2=0 ~ zobecněný válec
  <
// x^3,      x^2y,     x^2z,     x^2,
   0,        0,        0,        1,
// xy^2,     xyz,      xy,       xz^2,
   0,        0,        4,        0,
// xz,       x,        y^3,      y^2z,
   0,        0,        0,        0,
// y^2,      yz^2,     yz,       y,
   0,        0,        0,        0,
// z^3,      z^2,      z,        C
   0,        1,        0,        -2
  >
  sturm
}

#declare CylinderYZ = cubic { // uzavírající se válec
  <
// x^3,      x^2y,     x^2z,     x^2,
   0,        0,        0,        0.4,
// xy^2,     xyz,      xy,       xz^2,
   0,        0,        0,        0,
// xz,       x,        y^3,      y^2z,
   0,        0,        0,        0,
// y^2,      yz^2,     yz,       y,
   1,        0,        0,        0,
// z^3,      z^2,      z,        C
   0,        1,        0,        -2
  >
  sturm
}

#declare Cone1 = cubic { // modifikovaný kužel
  <
// x^3,      x^2y,     x^2z,     x^2,
   0,        0,        0,        1,
// xy^2,     xyz,      xy,       xz^2,
   0,        0,        0,        0,
// xz,       x,        y^3,      y^2z,
   0,        0,        0,        0,
// y^2,      yz^2,     yz,       y,
  -1,        0,        0,        0,
// z^3,      z^2,      z,        C
   0,        1,        0,       -0.8
  >
  sturm
}

#declare Cone2 = cubic { // přesný kužel
  <
// x^3,      x^2y,     x^2z,     x^2,
   0,        0,        0,        1,
// xy^2,     xyz,      xy,       xz^2,
   0,        0,        0,        0,
// xz,       x,        y^3,      y^2z,
   0,        0,        0,        0,
// y^2,      yz^2,     yz,       y,
  -1,        0,        0,        0,
// z^3,      z^2,      z,        C
   0,        1,        0,       0
  >
  sturm
}

#declare Cone3 = cubic { // modifikovaný kužel
  <
// x^3,      x^2y,     x^2z,     x^2,
   0,        0,        0,        1,
// xy^2,     xyz,      xy,       xz^2,
   0,        0,        0,        0,
// xz,       x,        y^3,      y^2z,
   0,        0,        0,        0,
// y^2,      yz^2,     yz,       y,
  -1,        0,        0,        0,
// z^3,      z^2,      z,        C
   0,        1,        0,        0.2
  >
  sturm
}

#declare ModulatedSphere = cubic {
  <
// x^3,      x^2y,     x^2z,     x^2,
   0.5,      0,        0,        0,
// xy^2,     xyz,      xy,       xz^2,
   0,        0,        0,        0,
// xz,       x,        y^3,      y^2z,
   0,        0,        0,        0,
// y^2,      yz^2,     yz,       y,
   1,        0,        0,        0,
// z^3,      z^2,      z,        C
   0,        1,        0,        -4
  >
  sturm
}

#declare A1 = cubic {
  <
// x^3,      x^2y,     x^2z,     x^2,
  -0.5,       0,        0,       0,
// xy^2,     xyz,      xy,       xz^2,
   0,        0,        1.5,      0,
// xz,       x,        y^3,      y^2z,
   0,        0,        0,        0,
// y^2,      yz^2,     yz,       y,
   1,        0,        0,        0,
// z^3,      z^2,      z,        C
   0,        1,        0,        -5
  >
  sturm
}
#declare A2 = cubic {
  <
// x^3,      x^2y,     x^2z,     x^2,
  -0.5,       0,        0,       0,
// xy^2,     xyz,      xy,       xz^2,
   0,        0,        -1,        0,
// xz,       x,        y^3,      y^2z,
   0,        0,        0,        0,
// y^2,      yz^2,     yz,       y,
   1,        0,        0,        0,
// z^3,      z^2,      z,        C
   0,        1,        0,        -5
  >
  sturm
}
#declare A3 = cubic { // koule s otvory
  <
// x^3,      x^2y,     x^2z,     x^2,
   0,        0,        0,        1,
// xy^2,     xyz,      xy,       xz^2,
   0,        0,        0,        0,
// xz,       x,        y^3,      y^2z,
   0,        0,        0,        0,
// y^2,      yz^2,     yz,       y,
   1,       -0.1,      0,        0,
// z^3,      z^2,      z,        C
   0,        1,        0,        -5
  >
  sturm
}

// umístění jednotlivých objektů tvořených kvadrikami v prostoru
// spolu se specifikací textury a obalového tělesa
quadric {CubicSphere     texture {Solid} clipped_by { object{UnitBox scale 2}} translate <Col1, Row1, Dist>}
quadric {CleanCubic      texture {Solid} clipped_by { object{UnitBox scale 2}} translate <Col1, Row2, Dist>}
quadric {ModulatedSphere texture {Solid} clipped_by { object{UnitBox scale 2}} rotate -20*y translate <Col1, Row3, Dist>}

quadric {CylinderXY      texture {Solid} clipped_by { object{UnitBox scale 2}} rotate 20*y translate <Col2, Row1, Dist>}
quadric {CylinderXZ      texture {Solid} clipped_by { object{UnitBox scale 2}} rotate -20*x translate <Col2, Row2, Dist>}
quadric {CylinderYZ      texture {Solid} clipped_by { object{UnitBox scale 2}} rotate 20*y translate <Col2, Row3, Dist>}

quadric {Cone1           texture {Solid} clipped_by { object{UnitBox scale 2}} rotate -20*x translate <Col3, Row1, Dist>}
quadric {Cone2           texture {Solid} clipped_by { object{UnitBox scale 2}} rotate -20*x translate <Col3, Row2, Dist>}
quadric {Cone3           texture {Solid} clipped_by { object{UnitBox scale 2}} rotate -20*x translate <Col3, Row3, Dist>}

quadric {A1              texture {Solid} clipped_by { object{UnitBox scale 2}} rotate <10,20,0> translate <Col4, Row1, Dist>}
quadric {A2              texture {Solid} clipped_by { object{UnitBox scale 2}} rotate <10,20,0> translate <Col4, Row2, Dist>}
quadric {A3              texture {Solid} clipped_by { object{UnitBox scale 2}} rotate <10,20,0> translate <Col4, Row3, Dist>}

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1002

První demonstrační příklad po vykreslení POV-Rayem

3. Použití objektu typu quartic

Pomocí kubik je sice možné vytvářet mnohem větší množinu různých tvarů než pomocí kvadrik, ovšem pro některé typy objektů je zapotřebí použít polynomy ještě vyšších stupňů. Poměrně časté je použití polynomů stupně čtyři, protože pomocí nich lze vytvářet například tělesa topologicky totožná s anuloidem (toroidem), což v případě kvadrik ani kubik nebylo možné. Pro tento účel je v POV-Rayi používáno těleso nazvané quartic, jehož tvar je specifikován vektorem obsahujícím 35 reálných hodnot.

povray1003

Jeden z možných tvarů objektu typu quartic

Pro nematematiky je zadávání těchto konstant pro dosažení kýženého tvaru poměrně složité (i když pro účely výuky matematické analýzy užitečné), ovšem v POV-Rayi je přítomen standardní soubor shapesq.inc vkládaný pomocí direktivy #include, ve kterém je již mnoho objektů předdefinováno. Autorem tohoto souboru je Alexander Enzmann, který je v komunitě renderingových programů poměrně známou osobou orientovanou především na „matematické“ objekty typu izoploch či implicitních ploch.

povray1004

Další možný tvar objektu typu quartic

Následuje příklad, jak lze vytvořit toroid pomocí objektu typu quartic (ve skutečnosti je samozřejmě ve většině případů lepší použít přímo objekt torus, ale ten není možné dále modifikovat):

// Toroid s hlavním poloměrem 40 a vedlejším poloměrem (trubky) sqrt(12)
quartic {
    < 1,   0,   0,   0,   2,   0,   0,   2,   0,
   -104,   0,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   1,   0,   0,   2,   0,  56,   0,
      0,   0,   0,   1,   0, -104,  0, 784 >
    sturm
} 

4. Druhý demonstrační příklad – několik objektů typu quartic

V dnešním druhém demonstračním příkladu je ukázáno vytvoření a následné vykreslení několika objektů typu quartic. Uprostřed se nachází šroubovice vymodelovaná z několika na sebe sesazených a správně natočených půlspirálových ploch (přesněji řečeno se jedná o aproximaci zcela přesné šroubovice), dále pak objekt připomínající krychli se zaoblenými hranami (podobný tvar již umíme vytvořit pomocí superelipsoidu), další objekt má tvar „kouzelnického klobouku“ a konečně následuje objekt, který má tvar druhého orbitu (2p) elektronu. Následuje zdrojový text tohoto demonstračního příkladu:

// ------------------------------------------------------------
// Demonstrační scéna s několika objekty typu quartic.
//
// rendering lze spustit příkazem:
//     povray +W800 +H600 +B100 +FN +D +Iquartic.pov +Oquartic.png
// (pro náhled postačí zadat povray quartic.pov)
// ------------------------------------------------------------

#version 3.1;                            // specifikace verze POV-Raye

global_settings {
    assumed_gamma 2.2
}

#include "shapes.inc"
#include "colors.inc"
#include "textures.inc"
#include "shapesq.inc"

// nastavení kamery
camera {
   location  <0.0, 0.0, -10.0>
   direction <0.0, 0.0, 1.0>
   up        <0.0, 1.0, 0.0>
   right     <4/3, 0.0, 0.0>
}

// první světelný zdroj
light_source {
    <200, 100, -300>
    color red 1.0 green 1.0 blue 1.0
}

// první světelný zdroj
light_source {
    <-200, 100, -300>
    color red 1.0 green 1.0 blue 1.0
}

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


/*
  aproximace půlspirálové plochy (části šroubovice) definované polynomem:
     x (z - z^3/6) - y (1 + z^2/2) = 0, nebo
  (2) -1/6 x z^3 + x z + 1/2 y z^2 - y = 0
*/
#declare Blue_helix =
object {
    Helix
    hollow on
    texture {
        pigment { Blue }
        finish { phong 1.0 }
    }
}

// několik půlspirálových ploch sesazených přesně na sebe
object {
    Blue_helix
    translate -4.2426*z
    rotate 160*z
    rotate -90*x
    translate <0, -2, 5>
}

object {
    Blue_helix
    translate -2.8284*z
    rotate 70*z
    rotate -90*x
    translate <0, -2, 5>
}

object {
    Blue_helix
    translate -1.4142*z
    rotate 160*z
    rotate -90*x
    translate <0, -2, 5>
}

object {
    Blue_helix
    rotate 70*z
    rotate -90*x
    translate <0, -2, 5>
}

object {
    Blue_helix
    translate 1.4142*z
    rotate 160*z
    rotate -90*x
    translate <0, -2, 5>
}

object {
    Blue_helix
    translate 2.8284*z
    rotate 70*z
    rotate -90*x
    translate <0, -2, 5>
}

object {
    Blue_helix
    translate 4.2426*z
    rotate 160*z
    rotate -90*x
    translate <0, -2, 5>
}

object {
    Blue_helix
    translate 5.6569*z
    rotate 70*z
    rotate -90*x
    translate <0, -2, 5>
}

object {
    Blue_helix
    translate 7.0711*z
    rotate 160*z
    rotate -90*x
    translate <0, -2, 5>
}

// plocha připomínající druhý orbit elektronu
quartic {
   < 1.0,  0.0,  0.0,  0.0, 0.0,  0.0,  0.0,  0.0,  0.0, -1.0,
     0.0,  0.0,  0.0,  0.0, 0.0,  0.0,  0.0,  0.0,  0.0,  0.0,
     0.0,  0.0,  0.0,  0.0, 0.0,  1.0,  0.0,  0.0,  0.0,  0.0,
     0.0,  0.0,  1.0,  0.0, 0.0 >

    bounded_by { sphere { <0, 0, 0>, 2.01 } }

    texture {
       pigment {
          Red
       }
       finish {
          phong 1.0
          phong_size 10
          ambient 0.2
          diffuse 0.8
       }
    }
    sturm
    scale 2
    rotate 45*z
    translate <-4, 2, 0>
}

// tvar připomínající krychli se zaoblenými hranami
quartic {
  < 1.0,  0.0,  0.0,   0.0,    0.0,  0.0,  0.0,  0.0,  0.0,   0.0,
    0.0,  0.0,  0.0,   0.0,    0.0,  0.0,  0.0,  0.0,  0.0,   0.0,
    1.0,  0.0,  0.0,   0.0,    0.0,  0.0,  0.0,  0.0,  0.0,   0.0,
    1.0,  0.0,  0.0,   0.0, -1000.0 >
    rotate <20.0, 40.0, 30.0>

   texture {
      pigment {
         Green
      }
      finish {
         phong 1.0
         phong_size 10
         ambient 0.2
         diffuse 0.8
      }
   }
   sturm
   scale 0.3
   rotate -45*x
   translate <4, 2, 0>
}

// "kouzelnický klobouk"
intersection {
   quartic {
      < 0.0,  0.0,  0.0,  0.0,  0.0,  0.0,  1.0,  0.0,  0.0,  0.0,
        0.0,  0.0,  0.0,  0.0,  0.0,  0.0,  0.0,  0.0,  0.0,  0.0,
        0.0,  0.0,  0.0,  0.0,  0.0,  0.0,  0.0,  1.0,  0.0,  0.04,
        0.0,  0.0,  0.0,  0.0,  0.04 >

      texture {
         pigment { Cyan }
         finish {
            specular 1.0
            roughness 0.05
            ambient 0.2
            diffuse 0.8
         }
      }
      sturm
   }

   sphere {
      <0, 0, 0>, 1
      texture { pigment { Clear } }
   }

   bounded_by { sphere { <0, 0, 0>, 1.5 } }
   scale 1.3
   rotate <30, 0, 180>
   translate <-4, -2, 0>
}



// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1005

Druhý demonstrační příklad po vykreslení POV-Rayem

5. Obecné plochy zadané polynomem

Zobecněním objektů typu quadric, cubic a quartic vznikl objekt nazvaný jednoduše poly (od slova polynom). Jedná se o implicitní plochu definovanou polynomem n-tého stupně, přičemž stupeň polynomu může ležet v rozsahu 2 až 15. S vyšším stupněm samozřejmě roste i počet členů, tj. i koeficientů, které se musí specifikovat (například pro šestý stupeň se jedná o 84 koeficientů). Syntaxe zápisu objektu poly je velmi jednoduchá:

poly {
        stupeň <A1, A2, A3,... Am>
    } 

Oba dva předchozí demonstrační příklady by bylo možné převést na obecný polynom, ovšem rychlost renderingu by se poněkud snížila.

6. Třetí demonstrační příklad – plocha specifikovaná objektem typu poly

Ve třetím příkladu je ukázán způsob vytvoření plochy (izoplochy) zapsané polynomem stupně 5. Vzhledem k tomu, že se v tomto případě jedná o nekonečnou plochu, je celá scéna pro lepší představu uzavřená do kvádru se šachovnicovou texturou a světelnými odlesky i odrazy na svých stěnách. Povšimněte si zde opětovného použití modifikátoru sturm, který sice způsobí zpomalení vykreslování (používá se Sturmova posloupnost místo metody půlení intervalu při hledání průsečíků paprsku s plochou), ale plocha neobsahuje žádné viditelné artefakty.

// ------------------------------------------------------------
// Demonstrační scéna s nekonečným objektem typu poly.
//
// rendering lze spustit příkazem:
//     povray +W800 +H600 +B100 +FN +D +Ipoly1.pov +Opoly1.png
// (pro náhled postačí zadat povray poly1.pov)
// ------------------------------------------------------------

#version 3.1;                            // specifikace verze POV-Raye

global_settings {
    assumed_gamma 2.2
}

#include "colors.inc"
#include "woods.inc"

camera {                                 // nastavení kamery,
    right x*image_width/image_height     // které odpovídá optice
    location  <0,2,-6>                   // lidského oka
    look_at   <0,0,0>
    angle 35
}

// první světelný zdroj
light_source {
    <500,500,-500>
    rgb 1
}

// druhý světelný zdroj
light_source {
    <-500,500,-500>
    rgb <0.1,0.1,0.3>
    shadowless
}

// třetí světelný zdroj
light_source {
    <3,3,-3>
    rgb <1,1,1>
    shadowless
}

// povrch plochy
#declare Solid=
texture {                                // vlastnosti materiálu
    pigment {                            // procedurální textura
        agate
        agate_turb 0.7
    }
    finish {                             // odlesky
        phong 1
    }
}

// plocha ve tvaru kapky
#declare Glob_5 =
 poly
  {5,
   <-0.5, 0,   0,  -0.5, 0,   0,   0,   0,   0,  0,
     0,   0,   0,   0,   0,   0,   0,   0,   0,  0,
     0,   0,   0,   0,   0,   0,   0,   0,   0,  0,
     0,   0,   0,   0,   0,   0,   0,   0,   0,  0,
     0,   0,   0,   0,   1,   0,   0,   0,   0,  0,
     0,   0,   0,   1,   0,   0>
  }

poly {
    Glob_5
    texture {Solid}
    sturm
    rotate <0,0,-90>
    rotate <0,25,0>
}

// kvádr, do kterého je celá scéna uzavřena
box {
    <-10,-1,-8>, < 10, 10, 8>
    texture {
        pigment {                        // šachovnicová textura
            checker
            color <0.1, 0.3, 0.4>,
            color <0.2, 0.5, 0.7>
        }
        finish {                         // odlesky a odrazy na povrchu
            diffuse 0.7                  // kvádru
            reflection 0.2
        }
    }
}



// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1006

Třetí demonstrační příklad po vykreslení POV-Rayem

7. Čtvrtý demonstrační příklad – další plocha specifikovaná objektem typu poly

Zdrojový kód čtvrtého demonstračního příkladu se do značné míry podobá příkladu třetímu, ovšem s tím rozdílem, že nyní je vytvořená plocha (izoplocha) konečná, má tvar dvojité kapky a polynom je šestého stupně a ne stupně pátého. Zdrojový tvar tohoto demonstračního příkladu má obsah:

// ------------------------------------------------------------
// Demonstrační scéna s uzavřeným objektem typu poly.
//
// rendering lze spustit příkazem:
//     povray +W800 +H600 +B100 +FN +D +Ipoly2.pov +Opoly2.png
// (pro náhled postačí zadat povray poly2.pov)
// ------------------------------------------------------------

#version 3.1;                            // specifikace verze POV-Raye

global_settings {
    assumed_gamma 2.2
}

#include "colors.inc"
#include "woods.inc"

camera {                                 // nastavení kamery,
    right x*image_width/image_height     // které odpovídá optice
    location  <0,2,-6>                   // lidského oka
    look_at   <0,0,0>
    angle 35
}

// první světelný zdroj
light_source {
    <500,500,-500>
    rgb 1
}

// druhý světelný zdroj
light_source {
    <-500,500,-500>
    rgb <0.1,0.1,0.3>
    shadowless
}

// třetí světelný zdroj
light_source {
    <3,3,-3>
    rgb <1,1,1>
    shadowless
}

// povrch plochy
#declare Solid=
texture {                                // vlastnosti materiálu
    T_Wood1
    finish {                             // odlesky
        phong 1
    }
    scale 1
}

// dvě spojené kapky
#declare Twin_Glob =
 poly
  {6,
   < 4,   0,   0,   0,   0,   0,   0,   0,   0, -4,
     0,   0,   0,   0,   0,   0,   0,   0,   0,  0,
     0,   0,   0,   0,   0,   0,   0,   0,   0,  0,
     0,   0,   0,   0,   0,   0,   0,   0,   0,  0,
     0,   0,   0,   0,   0,   0,   0,   0,   0,  0,
     0,   0,   0,   0,   0,   0,   0,   0,   0,  0,
     0,   0,   0,   0,   0,   0,   0,   0,   0,  0,
     1,   0,   0,   0,   0,   0,   0,   0,   0,  0,
     0,   1,   0,   0>
  }

poly {
    Twin_Glob
    texture {Solid}
    sturm
    rotate <0,0,-90>
    rotate <0,25,0>
}

// kvádr, do kterého je celá scéna uzavřena
box {
    <-10,-1,-7>, < 10, 10, 7>
    texture {
        pigment {                        // šachovnicová textura
            checker
            color <0.1, 0.3, 0.4>,
            color <0.2, 0.5, 0.7>
        }
        finish {                         // odlesky a odrazy na povrchu
            diffuse 0.7                  // kvádru
            reflection 0.2
        }
    }
}



// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1007

Čtvrtý demonstrační příklad po vykreslení POV-Rayem

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

V další části seriálu se budeme zabývat dvěma typy objektů – výškovému poli (heightfield) a izoploše (isosurface). Bude se jednat o poslední typ objektů, který si popíšeme, protože další části seriálu již budou zaměřeny na problematiku osvětlení, texturování a také vykreslení vnitřních částí uzavřených objektů.

povray1008

Výškové pole kompletně vytvořené pomocí POV-Raye

Našli jste v článku chybu?

6. 5. 2008 7:20

hal66 (neregistrovaný)
"...Myslím, že si nezaslouží tolik dílů seriálu na root.cz, ačkoliv technicky možná dobrý je. Spíše bych ho zmínil jedním článečkem..."

Doufám, že tento (pokud jsem měl možnost vidět) ojedinělý diskusní příspěvek nebude autorem brán v potaz a tento (bohužel také ojediněle) velice dobrý seriál bude pokračovat.

6. 5. 2008 3:57

Trm (neregistrovaný)
Ja bych se na to asi vysral. Jak rika Bruce Perens: ,,Free and nonfree software should coexist''. Navic serial je naprosto bozi, lepsi nez jsem cpat sracky od nejakych iliteratu, popisujici po ste, jak si nainstalovat nejnovejsi Ubuntu nebo co je to jadro. :-(
Vitalia.cz: Bižuterie tisícinásobně překračuje povolené limity

Bižuterie tisícinásobně překračuje povolené limity

120na80.cz: 5 nejčastějších mýtů o kondomech

5 nejčastějších mýtů o kondomech

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

Přehledná titulka, průvodci, responzivita

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

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

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

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

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

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

Vitalia.cz: Když přijdete o oko, přijdete na rok o řidičák

Když přijdete o oko, přijdete na rok o řidičák

Podnikatel.cz: Chaos u EET pokračuje. Jsou tu další návrhy

Chaos u EET pokračuje. Jsou tu další návrhy

Vitalia.cz: Pamlsková vyhláška bude platit jen na základkách

Pamlsková vyhláška bude platit jen na základkách

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

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

Měšec.cz: mBank cenzuruje, zrušila mFórum

mBank cenzuruje, zrušila mFórum

Vitalia.cz: Nejlepší obranou při nachlazení je útok

Nejlepší obranou při nachlazení je útok

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

Jmenuje se Janina a žije bez cukru

Podnikatel.cz: Udávání kvůli EET začalo

Udávání kvůli EET začalo

Vitalia.cz: Taky věříte na pravidlo 5 sekund?

Taky věříte na pravidlo 5 sekund?

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

Podnikatel.cz: Zavře krám u #EET Malá pokladna a Teeta?

Zavře krám u #EET Malá pokladna a Teeta?

Lupa.cz: Teletext je „internetem hipsterů“

Teletext je „internetem hipsterů“

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

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

Recenze Westworld: zavraždit a...