Home Creatief met POVRay Installeren en belichting Sneeuw, regen en nog meer ongemak
 

Vragen uit de praktijk

Het is voor de eerste keer sinds deze cursus begonnen is dat het buiten nu niet regent. Kortom, vanavond is het niet het moment om sterk theoretische zaken te gaan bespreken die veel voorstellingsvermogen van de cursisten vragen. We houden het simpel en praktisch dit keer met problemen en vragen waar we allemaal wel eens mee te maken hebben als we een scene opzetten. Geen exotische dingen dus maar meer aardse zaken.

Vliegende schotel

Peter kwam aan met moeilijkheden bij het maken van een beeld met een vliegende schotel. De vorm is natuurlijk geen probleem: een UFO is een fantasie-object en zolang het er maar een beetje schotel-achtig uitziet is het wel goed. Heel simpel kan de vorm gemaakt worden met behulp van kegelsnedes. Ik ga Peter niet het werk uit handen nemen, maar kan het toch niet nalaten om een voorbeeld van Aaron A. Collins te demonstreren. Het heet dish.pov en in afbeelding 1 is het resultaat te zien.

In listing 1staat de source.

Listing 1.

#include "shapes.inc"
#include "colors.inc"

camera {
   location     <0, 0, -70>
   direction    <0, 0,   1>
   up           <0, 1,   0>
   right        <4/3, 0,   0>
}
/* The basic dish */
union {
  intersection {
      object { Paraboloid_Y
        scale <30, 20, 30> }
      object { Paraboloid_Y
        scale <29, 19, 29>              inverse }
      plane  { y, 20 }


      pigment{color rgb <0.8,0.2,0.2>}
      finish {

        ambient 0.2
                diffuse 0.8
                phong 1.0
                phong_size 10
        }
   }

 union {
      object { QCone_Y
         scale <1, 10, 1> translate y*31
         clipped_by { plane { y, 31}

                plane {-y,  0} }
                  }
      sphere { <0, 30, 0>, 2}


      pigment {color rgb<0, 0.2,0.8>}
      finish    {

        ambient 0.2
                diffuse 0.8
                phong 1.0
                phong_size 30
        }
   }


   /* The equatorial mount */


   object { Paraboloid_Y
      rotate x*180
      scale <30, 60, 30>


      texture {
         pigment {      color rgb<0,0.8,0.2>}
         finish {
            ambient 0.2
            diffuse 0.8
            phong 1.0
            phong_size 30
         }
      }
   }


   rotate <-30, -30, 0>
}


light_source {<100, 120, -130>

        colour White}
light_source {<-100, 100, -130> colour White}

Het verschillende parabolen kan je zo een vliegende schotel maken. Dit voorbeeld laat ook zien hoe je een schotel een dikte geeft. Waar Peter vooral moeite mee had was een metallic glimmende buitenkant met een beetje een blauwe schijn. Zoiets als gepoetst chroom. Waarom dat zelf doen als iemand dat al heeft gedaan? Kijk maar in de inc-verzameling. Daarin zit vast wel een file met de naam metals.inc. Ik weet, er is zoveel materiaal in zoveel folders dat zoeken soms lastig is. Ik vind in die file de T-Chrome2 die beschreven wordt als lichtelijk blauwig, 60 procent grijs met een goede 'steel' finish. Dat klinkt goed. Het ziet er als volgt uit: (zie listing 2) en geeft het oppervlak een finish.

listing 2


#declare P_Chrome2   =
        color rgb <0.39, 0.41, 0.43>


// F_MetalD  :  Highly hard and polished. High reflectivity.


#declare F_MetalD  =
  finish {
        ambient 0.15
        brilliance 5
        diffuse 0.6
        metallic
        specular 0.80
        roughness 1/100
        reflection 0.65
        }


#declare T_Chrome_2D =
  texture {
    pigment { P_Chrome2 }
    finish { F_MetalD  }
    }

Ikzelf ben ook heel tevreden met het uiterlijk dat ik krijg met: (zie listing 3)

listing 3


  finish {
        ambient 0.043133
        diffuse 0.517967
        brilliance 1.127667
        specular 0.7266
        roughness 0.4436
        metallic 1.5
        refection 0.043133
        }

Maar nu wordt er nog geklaagd door Peter dat het nergens op lijkt. Ik heb de sourcefile eens bekeken en laat ik het maar weer eens zeggen: alles wat glimt en spiegelt zien we zo doordat de omgeving erin weerspiegelt. Nu was er ten eerste een achtergrond background {colour black} en dat helpt niet veel. Gebruik eens een sky-sphere zou ik zeggen met wat wolken en veel blauwe lucht. Of een sterrenhemel met forse lichtpunten. Ten tweede: de zon zit verkeerd. Kijk maar:

#declare Sun= sphere{ <4,5,4>,2
   texture {pigment color White
   finish {ambient0.5 specular0.7}
     }
   }

object {Sun}
 light_source {<3,3,3> color White
 looks_like {Sun}
 }

Er gebeurt hier iets dubbelop. Er komt in de scene een object 'Sun' te hangen en dat nog eens door het gebruik van looks_like in de light_source statement.

Wat er sowieso mis gaat is dat, als de lichtbron ook echt in de 'Sun' zou zitten dat het omringende object dan schaduw werpt en wel overal om zich heen. Er komt dus geen licht uit. The no-shadow zou gezet moeten zijn. Maar er gaat nog iets anders mis waardoor de scene geen licht ontvangt en alleen maar de 'ambient' voor een beetje beeld zorgt.. Ga je een object declareren dan neemt Povray aan dat het centrum op <0,0,0> zit. Declareer dus nooit een object met de translatie opgegeven. Dus sphere {<0,0,0>,2... opgeven en dan pas later bij gebruik plaatsen met object {Sun <4,5,4>...

Gebruik je de looks_like dan wordt de lichtbron in het centrum van het object geplaatst, <0.0,0> dus waarna je pas de hele lichtbron verplaatst. Bij Peter in zijn scene zit dus na afloop de lichtbron op <3,3,3> en de bol op <7,8,7> oftewel <3,3,3>+<4,5,4>.

Verder: zwarte achtergrond geeft weinig om te zien qua reflecties en die zijn nu juist zo belangrijk met metalen gladde oppervlakken. In principe hebben we een spiegel in een donkere kamer zonder dat er licht opvalt. Een leuk achtergrondje met wat sterren-achtig gedoe (heelal) krijg je met

sphere {<0,0,0>,550000
  texture {
  pigment {spotted color_map{
 [0, 0.2991 color Black color Black]
 [0.2991, 0.3} color rgb<0.7,0.7,0.9>
           color rgb <0.4,0.4,0.45>]
 [0.3, 0.4994  color Black color Black
 [0,4994, 0.5 color White color White]
 [0.5, 0.7993 color Black color Black]
 0.7993, 0.8 color rgb<0.75,0.1,0.1>
       color rgb <0.45,0.0]
 [0.8, 0.899 color Black color Black]
 [0.89, 0.9 color Gray35 color Gray15]
 [0.9, 1.0001 color Black color Black] } }
finish {ambient 1 diffuse 0}
 scale 300
 }
 }
 no_shadow hollow
 }

Er zijn natuurlijk betere sterrenhemels; sla de cursus van een tijdje geleden er maar op na. Ik heb het er uitgebreid over gehad en ik heb mij voorgenomen vanavond niet teveel in herhalingen te vervallen.

Geodesic dome

Architecten zijn dol op deze vorm want met weinig materiaal kunnen ze een stevige bolvormige afdekking maken voor grote complexen. Wiskundig gezien is de geodesic dome gebaseerd op een icosahedron. Twintig symmetrisch driehoeken als vlakken. Verder in de apex: vijf driehoeken vormen de bovenkant die pentagonaal is. De volgende rij bestaat uit tien driehoeken. Hopeloos dus om zelf te maken. Maar er is het programma DOME die een Povray-script aflevert. Maar helaas: voor Windows gemaakt dus niet voor ons.

Het maken van een schroef

Het basis idee is 'maak de moer en dan de groeven'. Het voor de hand liggende idee is: een voorwerp in een spiraalbaan om de cylinder te laten bewegen en dan de overlap van de cylindervorm aftrekken. Als het ware een draaibank nadoen. Een soort snijmes maken en dan de schroefdraad snijden. Er is een alternatief: de vorm van de schroefdraad op het cylindervlak plakken. Maak je het stukje van de schroef waar de draad op zit een beetje smaller dan de rest en dan is deze oplossing ook mogelijk. Laten we een paar cursusavonden teruggaan. Toen was er het probleem van de wipkip. Hoe maak je zo een spiraalvormige veer? Dat is toen opgelost en zo'n spiraal kunnen we natuurlijk gebruiken om een schroefdraad te maken. Ik bedenk nog een derde oplossing: het moet alleen maar lijken alsof er een schroefdraad is, het oppervlak, de vorm dus hoeft geen fysieke schroefdraad te hebben. Ga je aan de oppervlakte-normaal sleutelen dan zal de terugkaatsing van licht worden veranderd en dan kan je een effect krijgen alsof er bobbels of deuken op het oppervlak zitten. Neem maar eens dit voorbeeld:

#declare T2=
  texture{
    pigment{White}
    normal{
      bumps 0.6
      scale 0.24
    }    finish{phong 0.8 phong_size 200}
  }

Wat meer toepasselijker is, aangezien we met een schroefdraad gaan werken het voorbeeld

 #declare T2=
 texture{
    pigment{White}
   normal{
      spiral2 5, 0.6
     scale 0.24
    }
    finish{phong 0.8 phong_size 200}
  }


Wat we moeten doen is een cylinder voorzien van een texture op zo'n manier dat we een groef menen waar te nemen. Ik heb een voorbeeld gezocht waarbij duidelijk zichtbaar is wat 'spiral' nu eigenlijk is. In de voorbeelden heb ik wat gevonden. Het is hierbij afgebeeld. Let vooral op het conservenblikje middenonder. Het lijkt alsof daar rondlopende groeven in zitten. Bij nauwkeurige waarneming kan je zien dat er geen deukjes zitten aan de rand. Louise komt met de suggestie dat je als het ware een schroefdraad zou kunnen vastsmeden aan de cylinder door een andere lange en dunne cylinder te nemen en die in de rondte te buigen. Zoiets hebben we de vorige keer gedaan met de bend.inc file. Ook met de eerder gebruikte veer van de wipkip zou je wat kunnen doen. Dat kan allemaal best wel maar omdat bij gebruik van bend.inc die lange dunne cylinder in partjes wordt opgedeeld kom je te zitten met erg veel objects. Ga maar na. Om een beetje regelmatig door de 360 graden bocht te gaan heb je zeker 100 stapjes nodig. En hoeveel draaien in de rondte heeft een schroefdraad wel niet? Renderen wordt dan traag. Nog een overweging is: de schroefdraad hoeft niet (zeker bij metaalschroeven) zichtbaar in een spiraal te zitten. Volledig parallelle groeven zijn mogelijk. En je kan volstaan met het in stapjes in de lengterichting van de cylinder uithappen van een cirkelvormige groef. Met een doughnut shape b.v. (de opgepompte fietsband-vorm). Ik wil nu de koffie heet is gelijk een mooi voorbeeld laten zien van gezichtsbedrog.


Schroef/bout verschil

Laten we een voorbeeld nemen van een schroef

Listing 4.

#include "colors.inc"
#declare Count=0;


camera {
        location <10,20,200>
        look_at <1,20,0>
        angle 25
        }
light_source {
        <50,50,50>      White

}
#declare thread1 =
 polygon
   { 4, <10,0>, <10,10>,        <20,5>, <10,0>
     texture {
        pigment { Silver }
        finish {
           ambient .8
           diffuse .8
                   }
      }
   }

background {
        color rgb <0.8,0.8,1.0>
        }


cylinder {
        <0,0,0>, <0,40,0>, 10   pigment {Green }
         }
#while (Count < 720)


 object { thread1
        rotate Count*y
        translate (Count/36)*y}


#declare Count=Count+1;


#end

Wat gebeurt hier allemaal? Een cylinder is gemaakt met een driehoek op de buitenrand en die wordt rond de Y-as gedraaid met een klein verzet. We krijgen dus een metaalbout. Het is zeker geen houtschroef met een toelopende punt. Daarvoor moet je wat meer werk doen. Mij lijkt het het handigste om de houtschroef ook als een cylinder te beginnen maar het snijmes langzaamaan met zijn punt van buiten naar het centrum te laten bewegen tijdens het roteren. Ik laat het aan de vragensteller over om dit voorbeeld aan te passen.

Listing 5

#declare Schroef_1 =
union{
   #declare aa=0.0
   #while (aa<2000)
   union {
   cylinder{y*-1.4,y*1.4,0.22}
   cone{x*0.2,0.35,x*0.5,0.0
        scale<1.0,0.45,0.51>
        translate <0.0,-1.2,0.0>
        rotate <0.0, -1.125*aa,                              0.0>
        translate <0.0,         0.00125*aa, 0.0>
        }
   }
#declare aa=aa+1.0;
#end
}
object {Schroef_1 translate.......

Veel objecten

Het is niet zo erg als er veel objecten in een scene zitten, maar zitten ze dicht op elkaar dan gaat het tijd vreten. Het wordt dan nl. nogal veel zoekwerk om het oppervlak van het object te vinden waar de zichtstraal op valt. Ga maar eens bij de vorming van een spiraal zo te werk dat je een CSG-object maakt van 3600 overlappende stukjes. De oplossing van: 'breng wat bounding objects aan' helpt ook niet veel in deze situatie. Een veel betere oplossing: een cone-object om de schroefdraad te maken en na afloop kan je de CSG-operaties doen. Ook de grofheid van de schroefdraad is te veranderen op een simpele manier: de diameter van de cone aanpassen. Voor een platte schroefdraad is het advies: truncate het eind van de cone.

Een zuil met groeven

Dat lijkt niet moeilijk en is ook simpel want we weten hoe we een schroef maken. Dit een peulenschil.

#include "colors.inc"
#declare grooves=36
#declare step=360/grooves
#declare   groove_now=1

difference{
  cylinder{<0,0,0>,<0,3,0>, 1
   pigment {color Red}
 #while (groove_now<grooves)
   cylinder {<1,1,0>,<1,4,0>, 0.1
   rotate       <0,step*groove_now,0>
                 pigment {Blue}
 }
#declare groove_now=groove_now+1
#end }

En zo heb je een zuiltje met mooie groeven erin.

Planeetje

Miranda wilde weten of het maken van een planeet erg lastig is. Dat is het niet. Neem het volgende voorbeeld:

Listing 6.

camera {

        location <0,1,-255>
        look_at 0
        }
sphere {<0,0,0>,100 //atmosfeer
        pigment {color rgbf 1}
        interior{
           media{
               scattering{

              1, <0,0.025,0.05>}
              }
        }
        hollow
}
sphere{<0,0,0>, 97.5
//planet
        pigment {bozo      color_map {
        [0 rgb <0,0,1>]
        [0.5 rgb <0,0,1>]
        [0.5 rgb <1,0,0>]
        [1 rgb <1,0,0>]
        }
  scale 50
 }
}
light_source{ <-1000,1000,-1000> color 1}

Voor meer voorbeelden kan ik verwijzen naar

  • planet.pov in samples/textures/pigments
     
  • planeth1.pov in pov3demo/halo
     
  • planeth2.pov in scenes/level2
     

Maar de atmosfeer kan natuurlijk beter zoals met

interior {media
 scattering 1,<0,0.25,0.05>}
 density {spherical color_map {
  [0.0 rgb <0.0,0.0,0.0>]
        [0.1 rgb <0,75,0.75,0.75>]
   [1.0 rgb <0.75,0.75,0.75>]}
  }
  }
 }
hollow


Een riviertje

Johanna wil een scene maken waarbij een rustiek riviertje door zachtglooiend landschap stroomt. Ze zit eventjes met de rivier. Laat ik de volgende tip geven: gebruik een vlak

plane{<0,0.08,0>,0
   texture{
  pigment {color rgb<0,0.1,0.2>}
  normal {bumps 0.2
   scale <0.5,0.3,0.3>}
 finish {phong 1 reflection 0.5
   ambient 0.1 diffuse 0.2}
  }
 translate <0,0,2,0>

en ik kan Johanna verzekeren dat het als eerste aanzet zo bruikbaar is. Voor de rest; zolang de bodem hoger ligt dan dit 'watervlak' zie je het niet.

Include files gebruiken

We hebben allemaal wel include files in gebruik al was het alleen maar de colors.inc. We kunnen files maken met onze eigen zaken. Bijvoorbeeld zet je in zo'n inc-file

#declare Voorwerp1= {.........}

Zorg er wel voor dat je elk object op zijn <0,0,0> plaats houdt want bij gebruik zoals in

 object {Voorwerp1
 translate.... rotate....}

raak je anders verdwaald met je verplaatsingen.

Als je de bend-files hebt bestudeerd van een vorige keer dan heb je gezien dat meer mogelijk is. Voeg b.v. aan je inc-file het volgende toe

#ifndef{Voorwerp1_trans}
#declare Voorwerp1_trans = <0,0,0>
#end

en in de definitie van het voorwerp zoiets als

 translate {Voorwerp1_trans}

Nu worden verplaatsingen stukken makkelijker. Bij gebruik zegt je nu:

#declare Voorwerp1_trans = <5,3,9>
 ...
#include "myfile.inc"
 ...

Even wat uitleg toch maar lijkt mij want ik zie vragende gezichten. Ten eerste zorgen we ervoor dat er altijd een Voorwerp1_trans zal zijn. Blijkt die er niet te zijn (ifndef) dan wordt die gemaakt. Wordt de include file binnengehaald dan wordt bij het inlezen rekening gehouden met de dan geldende waarde van Voorwerp1_trans. Er is een derde manier om include files te gebruiken. Dan ga je gebruik maken van het 'macro' feature. Ik ga er nu niet op in.

Netwerk gebruiken

Weinig mensen zullen thuis een netwerk hebben. Met maar 1 computer is dat ook zinloos. Maar op het werk komen steeds meer computers die dag en nacht aan het netwerk hangen en die het merendeel van de tijd niets staan te doen. Tekst typen of een database gebruiken zijn niet zulke verschrikkelijk rekenintensieve taken dat een Pentium Pro op 400 MHz daar volledig mee bezig is. Op diverse plaatsen is men bezig om te werken aan extra software om PovRay op veel computers tegelijk in het netwerk te laten werken. Voor Lunix is men al zo goed als klaar. Voor Windhoos is men druk bezig maar helaas voor Atari zal er weinig gebeuren. Op elke machine op je werk achtereenvolgens in te loggen en Povray te draaien zal niet gaan. Niet alleen heb je veel werk om bij te houden wie wat doet en moet je met de hand aparte ini-files maken enz. maar ook zullen je medewerkers niet blij zijn met vreemde vingers aan hun computer. Wat nodig is: een 'Client applicatie' die met een speciale server praat. Die server doet de rewrites van de ini-files, de source en de include files en zendt ze naar renderers die het werk gaan verrichten. Resultaten van deze 'slaves' komen weer bij de server binnen die de delen van de beelden samenvoegt of animatiebeelden op volgorde zet. Philip Cowley werkt eraan. Belangstellenden kunnen bij hem navraag doen (philc@totem.co.uk).

De hemel

Ik dacht dat ik de vorige keren toch heel duidelijk ben geweest over het maken van wolkenluchten e.d. De vuistregels zijn: gebruik eerst een sky_sphere. Lukt dat niet, gebruik dan een sphere die hollow is en een zo grote straal heeft dat de hele scene er binnen valt. Het meest simpele in de praktijk blijkt het gebruik te zijn van een oneindig groot vlak dat flink hoog in de scene hangt. Dat is ook heel handig als je divere lagen van wolken nodig hebt: gebruik dan parallelle vlakken met een relatief korte afstand tot elkaar. Tevens kan je schaduwen laten werpen door wolken. Een andere plezierige eigenschap is dat door de perspectiefwerking de gebruikte patronen heel veel lijken op de werkelijkheid. Mij werd onder de aandacht gebracht dat er nog een derde mogelijkheid is: een vlak met dikte oftewel een hele grote hooghangende box.

box {   <-10000, 5000, 10000>,
                  <10000,10000, -10000>
 hollow
 texture {
  pigment {bozo
        color_map {
                  [0 rgbt 1]
                  [0.5 rgbt 1]
                  [1 rgbt <0.9,0.9,0.9,
                   0.5, 0.5>]
 }
 translate -0.5 rotate 25*-y
 turbulence 0.5 octaves 3 lambda 6 scale 50000}
 }
 finish {ambient 1 diffuse 0.2}
 }

Je moet wel oppassen dat je de randen van de box niet ziet. Oftewel door ze uit het blikveld te houden of door te zorgen dat het patroon de randen niet laat zien. Een variant hierop is de dikke schil die je kan krijgen door twee bollen van verschillende diameter (maar met eenzelfde middelpunt) van elkaar af te trekken.

Slotwoord

Dit was het dan voor deze keer, de koffie staat klaar en daarna kan iedereen vroeg naar huis want het is buiten nog licht en het regent zomaar niet. Zou de lente dan toch komen?

Piet Vogelaar


Copyright © Rein Bakhuizen van den Brink
Last updated on 1 september 1999
Home Creatief met POVRay Installeren en belichting Sneeuw, regen en nog meer ongemak