Home Creatief met POVRay Camera Halo's en een wipkip
 

De monitor en de achtergrond

In deze aflevering zal ik het hebben over hoe we de achtergrond in onze scenes kunnen maken. Er zijn diverse manieren en het is van belang de juiste keuze te maken wantvoordat jehet weet vliegen de rekentijden astronomisch omhoog.

Verder was er verbazing bij de cursisten hoe een TGA-plaatje er verschillend uit kan zien op verschillende monitoren. Ik zal dat laatste eerst verduidelijken.

Computers zijn in de loop der jaren steeds goedkoper geworden als je naar de prijs/prestatie verhouding kijkt. Maar helaas zijn kleurenmonitoren veel minder sterk in prijs gedaald. Bij aanschaf van een computer van een paar duizend gulden wil men niet meer dan zo'n 700 gulden voor de monitor uitgeven. En wat krijg je dan voor je geld? Een niet al te beste kleurenmonitor met een 17 inch scherm. Een TV in die grootte kost minder en daar vergelijken de mensen ten onrechte mee.

Koop je een nieuwe PC en wil je een werkelijk goede grafische kaart erin met 1600 x 1200 pixels dan kost dat een paar honderd gulden extra op de aanschafprijs. Maar wil je dan een monitor erbij kopen die recht doet aan de prestaties van je grafische kaart dan is er niet alleen een groot beeldscherm nodig om al die pixels plaats te geven, ook de kwaliteit van de electronica moet goed zijn. En dan moet je toch wel denken aan een monitor van 3000 gulden. Dat heeft bijna niemand ervoor over; in elk geval is er op deze cursus niemand met zo'n dure monitor, ook ik niet. Als we eventjes alle andere technische mankementen van goedkope monitoren laten voor wat die zijn (convergentie, geometrie e.d.) en ons bezig houden met wat in dit verband van belang is, dan gaan we het hebben over helderheid en kontrast.

Het eerste belangrijke punt is: hoeveel licht zit er nog in de buis? Naarmate b.v. een beeldbuis ouder wordt neemt de helderheid af. In extreme gevallen moet je de helderheid dan maximaal zetten en de kamer goed verduisteren wil je nog wat op het scherm kunnen zien. De prestaties van de monitor kan je vastleggen in de 'gamma' van het ding. Weet je de gamma van jouw monitor dan kan je PovRay de opdracht geven om met jouw monitor rekening te houden. Op die manier komt je plaatje dus zo mooi mogelijk op je scherm. Dat houdt dus in dat iemand met een monitor die een andere gamma-waarde heeft jouw TGA-plaatje te flets, te licht, te donker of te bont van kleur kan vinden. Maar ja, met de de scŠnebeschrijving van PovRay kan je altijd het TGA-beeld laten herberekenen en daarbij de eigen monitor-gamma laten verdisconteren.

Technisch verklaard

In een TGA-file wordt voor de drie kleuren (rood, groen, blauw) de intensiteit weergeven door een 8-bits getal, dus waarden tussen 0 en 255. Drie keer acht bitjes voor de kleuren geven de 24-bits 'true-color' genoemde weergave.

Stel dat een waarde van 127 is uitgerekend voor een kleur. Dan moet de hoeveelheid licht die de monitor uitstraalt ook 50 % van zijn maximale lichtgevendheid zijn. En dat zal vaak niet het geval zijn. De werkelijk uitgestraalde hoeveelheid licht kan maar 22 % bedragen voor een monitor met een gamma waarde van 2.2 om maar een voorbeeld te geven. Om werkelijk 50 procent te bereiken zou een kleurwaarde van 186 nodig zijn in plaats van 127. Je begrijpt het al: aan de hand van een tabel kan PovRay de zaak rechttrekken voor je monitor. Maar het kan gelukkig nog simpeler. Met een exponentiële functie nl. Dan heb je aan 1 waarde (de gamma geheten) voldoende.

Je zou zeggen dat een fatsoenlijk operatingsysteem een mogelijkheid heeft om de applicaties af te schermen van de eigenaardigheden van de monitor die gebruikt wordt. Bij ons (en bij Windows) is dat niet zo.Bij de Mac (veel in de drukkerijwereld gebruikt nietwaar) is er een mogelijkheid om aan het systeem de gammawaarde op te geven. Ook dan neemt het operatingsysteem de taak op zich om door applicaties afgeleverde beeldschermpixelkleuren om te rekenen.

De gamma zoeken

Het eerste wat we gaan doen is de ruimte waar de monitor staat verduisteren. Inktzwarte duisternis is niet nodig, maar donker moet het wel zijn. We gaan zorgen dat we een volkomen zwart beeld op de monitor hebben. Dat kan b.v. door een volkomen zwart POV-plaatje te maken of door een screen-protector aan te zetten zoals die van Atari die het scherm zwart maakt en hier en daar sterretjes laat verschijnen. Nu gaan we de helderheid en het kontrast op maximaal zetten. Het 'zwart' op het scherm zal nu toch wat licht gaan uitstralen. Het zwart is grijs dus. Ga de helderheid terugdraaien totdat het zwart weer zwart is. Nu gaan we het plaatje voor de gamma-bepaling op het scherm zetten (noot van de redactie: op aanvraag zullen we lezers die deze lessen schriftelijk volgen de disk met dit plaatje toezenden). We gaan het contrast terugdraaien. Let nu op wat er met de afwisselende zwart/wit balken gebeurt. Probeer die op gelijke tint te krijgen. Wat je zit te doen is 50 procent grijs te maken uit half wit en half zwart. Op een PAL-TV beeld (aansluiting via een SCART-plug) zal dit moeilijk vallen. Monitoren zijn vaak heel redelijk afgeregeld en de middenstand van de contrastknop is meestal goed (tenzij de monitor al veel gebruikt is en oud is geworden). Ga nu op een afstand het beeldscherm bekijken. Probeer te schatten welk van de genummerde vakjes overeenkomt kwa grijstint met je benaderde 50 procent grijswaarde. Het nummer in het vakje geeft de gamma-waarde van de monitor aan. Nu we de waarde hebben is de vraag: waar zetten we die neer? De beste plaats is in de povray.ini file waar al jouw algemeen geldende parameters in staan.

Zoek dus op

Display_Gamma = 2.2

en verander die tot de gevonden bepaalde waarde. Voor jezelf zal Povray nu zorgen dat tijdens het bereken van het beeld de eigenschappen van de monitor in rekening worden gebracht zodat op jouw beeldscherm het plaatje is volle pracht zal pronken.

Je blijft natuurlijk het effect houden dat een TGA-plaatje bij iemand anders op een monitor er fletser of te donker of te kontrastrijk uit kan zien. Maar er is nu wel een voordeel: je kan nu de belichting van de scŠnes goed inschatten want je hoeft het TGA-plaatje niet meer te beoordelen terwijl je rekening houdt met je monitoreigenschappen. Bijvoorbeeld: vallen details in een stukje beeld weg omdat het er te donker is, dan is dat 'in werkelijkheid' ook zo en komt dat niet doordat je monitor oud is.

Achtergrond

Nu de koffiepauze voorbij is gaan we verder met de hoofdmoot van deze avond: het maken van de achtergrond. Er zijn vele manieren te bedenken om een achtergrond te maken voor een scŠne en dat maakt het moeilijk om een keus te doen. Maar de beperkte rekenkracht van onze computers maakt de keus voor een 'slechte' methode soms noodzakelijk. Laten we beginnen met de eenvoudigste manier.

background {

color rgb <0.2, 0.2, 0.3 >
}

De werking is simpel: als een zichtstraal geen object in de scŠne ontmoet dat krijg je de background kleur.

Een vlak

In het echt op een toneel wordt vaak gespeeld voor een achtergrondsdoek. Dat kan een fraaie kleur hebben die de aandacht niet van de handeling afleidt of een fraai beschilderd panorama zijn.

Zolang we rekening houden met het blikveld van de camera - geen visseooglens die meer dan 180 om zich heen kan zien want een plat vlak is maar op zijn hoogst 180 graden waard - is er geen probleem. Alleen, wat we ook doen, het blijft er vlak uitzien want het perpectief lijkt nergens naar. Prima als de achtergrond een hoge muur moet zijn of egaal van kleur kan blijven, maar verder niet.

Maar bedenk dat een belangrijke eigenschap van een vlak is dat het oneindig groot is. Leggen we dus een vlak als een soort plafond in de scŠne dan hebben we een nette horizon en het perspectief klopt beter als we een patroon op het vlak aanbrengen.

Afhankelijk van de eenheden waarin we werken hangen we boven de scene een vlak neer waar we schuin tegenaan kijken. Stel mijn scŠne is kwa inhoud zo'n 40 bij 40 bij 40. Dan kan ik het vlak al voldoende hoog leggen op {y,500}. Bedenk wel dat je met coördinaten nooit hoger moet gaan dan ongeveer plus of min 32.000. Laten even terug gaan naar de eigenschappen van een vlak. Ten eerste is die zoals vermeld oneindig. Maar het heeft ook de eigenschappen van b.v. een kubus: er is een binnenkant en een buitenkant die in het geval van ons hemelvlak bovenkant en onderkant genoemd kunnen worden.

Gevuld is gevuld

Maken we b.v. een stenen bol dan is die ook door en door van steen. Happen we er een stuk uit dan zien we ook een steenpatroon verschijnen op de aangevreten delen. Willen we in de kubus b.v. rook of mist aanbrengen dan lukt dat niet want er zit al een steenpatroon in. Wat je dan kan doen is via het keyword 'hollow' zorgen dat je alleen maar de heel dunne oppervlaktelaag overhoudt. Natuurlijk heeft de camera ook problemen als die 'binnen in een object' zit te kijken. Zit je vanwege het aanbrengen van een hemelvlak met je camera aan de 'binnenkant' van het vlak dan komen er meldingen zoals 'camera inside not-hollow object. Problems with halos expected'. Vanzelfsprekend kan je een vlak logisch gezien ook 'hollow' verklaren maar beter is het dan om het vlak om te draaien. In plaats van op plaats { y, 500} zet je dan {-y, 500}.

Afdwalen

Nu we toch hadden over solide objecten wil ik jullie een raadsel voorleggen:

  merge {
    sphere { <-1,0,0>, 2 texture { Stone } }
    sphere { <+1,0,0>, 2 texture { Glass } }
  }

Het is duidelijk: we hebben twee bollen van verschillend materiaal die door elkaar lopen (elkaar overlappen). Over de zichtbare structuur van het oppervalk kan logisch gezien geen verwarring bestan. Maar hoe zit het van binnen? Is het overlappend deel glas, steen of een mengsel van beide? Waar loopt intern de grens tussen beide materialen? Meer vragen dan een gek kan beantwoorden. In ieder geval is bij een 'merge' zoals ook in de handboeken staat de geometrie binnen in ge-mergde voorwerpen niet na te gaan. En wat willen we eigenlijk? Vast en zeker zoiets als:

  union {
    intersection {
      sphere { <-1,0,0>, 2 }
      plane { x, 0 }
      texture { Stone }
    }
    intersection {
      sphere { <+1,0,0>, 2 }
      plane { x, 0 inverse }
      texture { Glass }
    }
  }

Met behulp van een vlak kappen we eerst de stukken van de bollen weg die elkaar gaan overlappen. Die twee bollen met een platte kant worden dan samengenomen. Nu is er geen twijfel meer mogelijk waar in het object het glas ophoudt en waar het steen begint. Dit ter illustratie van het feit dat je eerst eventjes moet nadenken voordat je wat in elkaar flanst.

Leuk luchtje

Hier komt een voorbeeld van een achtergrond die heel natuurlijk lijkt:

  plane { y, 500
    texture {
      pigment { SkyBlue }
      finish { ambient 1 diffuse 0}
     }
     texture {
       pigment {
         bozo
         turbulence .5
         color_map {
           [0 White]
           [1 White filter 1]
         }
       }
       finish { ambient 1 diffuse 0 }
       scale <1000, 250, 250>
       rotate <5, 45, 0>
    }
  }

Je krijgt een helder blauwe lucht gevuld met streepachtige wolken die erg lijken op wat de weerman 'cirrus' noemt. Er zit regelmaat in het patroon, het is toch 'random' en naar de horizon toe lijkt het perspectief te kloppen. En nu is het weer tijd voor koffie.

Uitleg

Nu we allemaal een opkikkertje hebben gehad gaan we eens zien hoe het komt dat we zo'n mooi luchtje hebben. Ten eerste hebben we het vlak geverfd met een pigment {color SkyBlue} kleurtje, zie de 'texture' statement. Ik wil even in herinnering halen hoe we dit kleuringsproces moeten voorstellen. Er is als het ware een oneindige ruimte geheel gevuld met verf (pigment) van de kleur SkyBlue. Het vlak doorsnijdt die ruimte en neemt de kleur aan die hij ter plekke aantreft. Door gebruik te maken van een pigment kunnen we later een extra laag aanbrengen. (zie de volgende 'texture' opdracht.)

Maar zouden we alleen maar de kleur geven dan zien we zwart want alleen als er licht op ons vlak valt komt de kleur tevoorschijn. We zouden dus ons vlak met een lichtbron moeten verlichten. Dat is lastig en vreet rekentijd. Ook moet je de lichtbron zo maken dat die de lichtval op de eigenlijke scŠne niet verstoort. Veel handiger is het om van de 'ambient' gebruik te maken. Ambient geeft aan dat er van alle kanten licht op het oppervlak valt. Met een ambientwaarde van 1.0 krijgt men een maximale oplichting. De hemel wordt dus sprankelend blauw. Met de tweede laag voegen we later oppervlakte-eigenschappen aan het vlak toe met behulp van 'finish'. Daarin kunnen we een hele hoop typische eigenschappen beschrijven zoals refleectie, breking en lichtgevendheid. Om te voorkomen dat we nare lichtreflecties krijgen op het vlak ten gevolge van lichtbronnen uit onze scŠne zetten we diffuse op 0.0. Opvallend licht wordt dan niet teruggekaatst. We komen na aan onze tweede laag voor het hemelvlak. Deze bevat voor de kleur een heel complexe beschrijving. Ten eerste zal 'bozo' wel een raadsel zijn voor de meeste, in elk geval voor de mensen die hun huiswerk de vorige keer niet gedaan hebben.

We gaan een patroon aanbrengen en wel van de soort 'bozo'. Verwante patronen bestaan met de namen wood, granite, marble, spotted e.d. Voor degenen die hun huiswerk niet gedaan hebben - en dat is de meerderheid - zal ik wat extra uitleg geven. Niet over bozo maar over 'wood'. Voor een rustiek balkje had ik een houtpatroon nodig. Dat werd

  sphere { <0, 1, 2>, 2
    texture {
      pigment {
        wood
        color_map {
          [0.0 color DarkTan]
          [0.9 color DarkBrown]
          [1.0 color VeryDarkBrown]
        }
        turbulence 0.05
        scale <0.2, 0.3, 1>
      }
      finish { phong 1 }
    }
  }

Nu is 'wood' een keyword en zorgt voor een patroon van houtnerven. Zaag ik de stam door en kijk ik op de kopse kant dan zie ik groeiringen. Zaag ik mijn balk uit dan zie ik aan de lange zijden de houtnerven lopen. De color_map slaat op de houtnerven zelf.

Om die een beetje echt te doen lijken is de kleur vanaf 0 tot 0.9 verlopend van DarkTan naar DarkBrown gemaakt en de resterende korte afstand van 0.9 tot 1.0 wordt de kleur nog donkerder. Bekijk maar eens echt hout. Dan zie je dat aan de ene rand van de nerf de kleurovergang snel is maar dat die aan de andere kant veel minder snel overloopt naar de basiskleur van het hout. Wat betreft de schaal waarop patronen gemaakt worden: die is altijd zo gekozen dat 1 kenmerk maar 1 keer verschijnt in een bol met een straal van 1. Zonder 'scale' te gebruiken zou je dus maar 1 houtnerf zien op de eenheidsbol. Door de zaak te schalen krijg ik in dit geval 5 concentrische houtnerven aan de kopse kant van mijn 1 x 1 x 7 balk. (0.2 in de x-richting en 0.3 in de y-richting). Nu is bozo zelf tamelijk regelmatig en daar kan je met turbulence wat aan doen. In het patroon dat door bozo gemaakt wordt moet een kleurverloop zitten. De wolken zijn wit maar aan de rand moeten ze niet al te scherp ophouden. De color_map beschrijft dat we met wit beginnen en ook met wit eindigen maar dan wit dat langzaam overgaat in de achtergrondskleur. Dat bereiken we door filter 1.0 op te geven: wit dat transparant is en 100 % van de achtergrond doorlaat. Aangezien we de beschrijving van een texture in een eenheidskubus doen moeten we gaan opschalen. Eerst brengen we het op onze gewenste grootte met de scale-opdracht. Bemerk dat we een beetje a-symetrisch de zaak oprekken: 1000 maal in de x-richting en maar 250 maal in de andere richtingen. Raadselachtig zal misschien de rotate opdracht zijn maar na wat nadenken komen we daar wel uit. Ik zie geen groot enthousiasme op de gezichten dus ik zal het nadenken wel eventjes voor jullie doen. Daar betaal je ook nl. cursusgeld voor.

Wat we doen is de oriëntatie van ons patroon veranderen. Eerst draaien we 5 graden om de x-as want dat geeft mooie wolkenstrepen. Het patroon kiepert als het ware een beetje naar de +z horizon toe. De draaiing om de Y-as zorgt dat de streperigheid van het patroon zichtbaar wat naar de +x/+z horizon loopt. Je moet bedenken dat de texture aan het oppervlak van ons hemelvlak het gevolg is van de doorsnijding van dat vlak met de ruimte die het bozo-patroon bevat. We hebben zo een hemeltje waar we heel wat mee kunnen experimenteren maar je zal zien dat ondanks de betoverende patronen die mogelijk zijn het toch wat beperkt is kwa mogelijkheden. Maar deze vulling van de achtergrond rekent relatief snel door. Men kan ook leuk met het wolkenpatroon stoeien als men b.v. extra meegeeft frequentie 3. Dan geven we aan hoe vaak de color_map zich binnen de eenheidsmaat moet herhalen. Zo krijg je dus meer of minder wolkenslierten in de lucht. Tja, en nu komt Maria met de vraag of het niet uitmaakt of we scale dan wel frequency te gebruiken. In ons geval niet: Met frequency 2 herhaalt het kleurverloop zich twee keer over de afstandsmaat in de x-richting (bij default worden color_maps geacht langs de x-as te veranderen) dus scale 0.5 * x zou eenzelfde effect hebben. Maar er bestaat ook een 'radial' keyword waarbij het patroon zich niet lineair langs de x-as uitbreidt maar radiaal zich om de y-as heen wikkelt. Dan is er wel verschil. Dit is een doordenkertje.

De hemelbol

Aangezien je nogal vaak gebruikt zou willen maken van een overkapping van een scŠne met behulp van een soort hemelbol, is er iets speciaals voor bedacht.

  sky_sphere {
    pigment {
      gradient y
      color_map {
        [0 color Red]
        [1 color Blue]
      }
      scale 2
      translate -1
    }
  }

Wat we hier doen is het effect nabootsen van de kleurverandering van de top naar de rand van de hemelbol. Aan de horizon ziet alles er wat fletser en/of roder uit. We gaan een kleurovergang maken. Als richting moeten we de y-richting kiezen. Er is dus een overgang in bovenwaartse richting van rood naar blauw. Maar deze kleurovergang verloopt in de eenheidsbol van 0 naar 1. Wat ik wil is dat op de helft van de hoogte van de bol de kleur rood begint - de horizon immers - en daartoe dient de scale 2 gevolgd door een schuif van alles met translate -1.

Zonnetje met wolken

Nu het principe bekend is kunnen we iets fraais gaan maken. B.v. een ondergaande zon met wolken. Dat wordt zo iets als

  sky_sphere {
    pigment {
      gradient y
      color_map {
        [0.000 0.002 color rgb <1.0, 0.2, 0.0>
                     color rgb <1.0, 0.2, 0.0>]
        [0.002 0.200 color rgb <0.8, 0.1, 0.0>
                     color rgb <0.2, 0.2, 0.3>]
      }
      scale 2
      translate -1
    }
    pigment {
      bozo
      turbulence 0.65
      octaves 6
      omega 0.7
      lambda 2
      color_map {
          [0.0 0.1 color rgb <0.85, 0.85, 0.85>
                   color rgb <0.75, 0.75, 0.75>]
          [0.1 0.5 color rgb <0.75, 0.75, 0.75>
                   color rgbt <1, 1, 1, 1>]
          [0.5 1.0 color rgbt <1, 1, 1, 1>
                   color rgbt <1, 1, 1, 1>]
      }
      scale <0.2, 0.5, 0.2>
    }
    rotate -135*x
  }


  plane { y, 0
    pigment { color Green }
    finish { ambient .3 diffuse .7 }
  }

We zetten weer een kleurverloop op onze bol. In dit geval maken we een color_map met drie kleuren: een beetje geelgetint rood dat we gebruiken voor de zon, wat donkerder rood voor een halo eromheen en donkerblauw voor de rest van de nachthemel. We maken maar een klein zonnetje: 0.0 tot 0.002 en we zorgen dat we een scherpe overgang hebben tussen zon en hemel want anders vloeit de zon langzaam weg en dat is niet de bedoeling. Je ziet dat we eindigen met een kleur in 0.002 en ook beginnen met een kleur op 0.002. Dat geeft die scherpe overgang. Waar staat de zon nu? Recht onder onze voeten op 0 graden. Om de zon boven de horizon te krijgen moeten we de complete hemelbol tenslotte draaien en wel via de x-as met rotate -135 * x

Je ziet dat er op de bol een tweede laag wordt gezet die de wolken bevat. We gebruiken het bekende bozo-patroon waar we dit keer een hoop extra zaken voor opgeven. De Turbulence kennen we al en die zorgt voor de nodige wirwar met zijn waarde van 0.65. Tussen haakjes: je kan ook een turbulence van 1.5 of nog hoger opgeven maar dan zit je toch wel een beetje chaotische patronen te maken. Met octaves 6 geef je een parameter van de turbulentie aan. De defaultwaarde is ook 6 dus het had er niet hoeven te staan. Maar ik heb het erin gezet om verderop in deze cursus erover te kunnen praten. Met omega 0.7 (default 0.5) geven we wat meer scherpte aan de turbulenties. Met een lagere waarde worden de turbulenties vaag van uiterlijk. Lambda 2 (de default) geeft je meer kolkende werking in het patroon dan een waarde van 1.0. Het effect is lastig in woorden te vatten, je moet het zelf zien. Over ons gebruikte kleurpatroon valt nog op te merken dat er in het wolkendek natuurlijk ook transparante delen moeten zijn om de kleuren van het eerst beschreven pigment door te laten. Vandaar de color rgbt (let op de 't' voor transparant) van 0.5 tot 1.0.

Slotwoord

We hebben dit stuk van de cursus weer achter de rug. De volgende keer ga ik uitleggen hoe je meer realistische effecten kan maken waarbij wolken echt in de ruimte hangen, waar rook opstijgt, mist hangt en dergelijk.

Piet Vogelaar


Copyright © Rein Bakhuizen van den Brink
Last updated on 1 september 1999
Home Creatief met POVRay Camera Halo's en een wipkip