Home Creatief met POVRay De monitor en de achtergrond Sterren aan het firmament
 

Halo's en een wipkip

Op de vorige cursusavond hebben we gezien hoe we een mooie achtergrond in de vorm van een wolkenlucht konden maken. Nu gaan we het hebben over mist, rook en wolken die laag in onze scŠne hangen en die schaduwen hebben, gedeeltelijk doorzichtig zijn enz. Echte nevels dus in velerlei vorm. Hoe gaan we te werk? Eerst moeten we eens observeren over wat voor soort zaken we het hebben. Kijk maar eens naar de rookwolken die her en der in de zaal opstijgen. De sigarettenrook bestaat uit allemaal kleine stofdeeltjes die het opvallend lucht weerkaatsen en ook absorberen. De rookdeeltjes hebben ook zichtbaar een kleur: uitgeademde rook is b.v. minder blauw dan verse rook. De patronen die we zien lijken wel wat op de wolkenluchten van de vorige cursusavond: strepen, slierten, draaikolken, vervagingen enz. Hoe gaan we dit effect nu in PovRay voor elkaar krijgen? Met halo's natuurlijk.

Halo definitie

De halo kunnen we zien als een speciaal soort 'texture'. Een massief voorwerp kan men er door en door mee vullen. Gevuld wordt met een soort stof (dust) die we voor het gemak maar onder de verzamelnaam 'deeltjes' (particles) zullen vatten. Die deeltjes kunnen we verdelen in het object door te werken met functies die de dichtheid beschrijven; de mate van stoffigheid in een bepaald punt binnen het object kan met een formule berekend worden. De deeltjes zelf kunnen nog allerlei eigenschappen hebben die we al kennen: een kleur voor blauwe sigarenrook, een doorzichtigheid in geval van wolken en zelfs kunnen de deeltjes eigen licht uitstralen voor b.v. een vuurbol of een kaarsvlam. Een halo zit dus altijd vast aan, of liever gezegd in een voorwerp (object) die op zijn Engels dan ook 'container object' heet. We moeten ons dus ook aan de regels houden die voor objecten gelden. Vanzelfsprekend moet dan het oppervlak helder en doorzichting zijn (translucent) maar ook moet het object 'hollow' oftewel leeg zijn (op de halo na natuurlijk). Doe je het niet goed dan zie je niets van je halo. Maar zonder dat je bewust iets fout doet, kan je rendering van de scŠne toch een verkeerd beeld opleveren nl. als de camera geplaatst is in een non-hollow object. Verder zijn er bij de halo-vorming zoveel parameters betrokken dat het een beginneling niet zal lukken om iets voor elkaar te krijgen dat ook maar zijn bedoeling benadert. Ik ga een voorbeeld geven en dan wordt alles duidelijk.

Vuurbol

Laten we het ons gemakkelijk maken. We zorgen dat onze stofdeeltjes licht uitzenden. We zetten het geheel in een bol die in de oorsprong staat. Om nog een beetje een achtergrond te hebben leggen we een vlakje met simpel tegelpatroon aan. Dat wordt dan

  camera {
    location <0, 0, -2.5>
    look_at <0, 0, 0>
  }


  light_source { <10, 10, -10>
                color rgb 1
                shadowless }


  plane { z, 2
    pigment { checker
              color rgb 0,
              color rgb 1 }
    finish { ambient 1
            diffuse 0 }
    scale 0.5
    hollow
  }


  sphere { 0, 1
    pigment {
                 color rgbt <1, 1, 1, 1> }
    halo {
      emitting
      spherical_mapping
      linear
      color_map {
        [ 0 color rgbt <1, 0, 0, 1> ]
        [ 1 color rgbt <1, 1, 0, 0> ]
      }
      samples 10
    }
    hollow
  }

De camera kijkt een beetje op afstand en we hebben een lichtbron opgehangen om wat licht op de scŠne te werpen. Allemaal heel simpel. We hebben de lichtbron ook het attribuut 'shadowless' gegeven waardoor verhinderd wordt dat de onzichtbare bol die we gebruiken een schaduw krijgt aan de van het licht afgekeerde zijde want dat staat erg raar! Het wandje is bedekt met afwisselend zwarte en witte tegels en heeft ook nog 'hollow' gekregen. 'Waar is dat nu voor nodig', zie ik jullie kijken: 'een hol vlak?'. Maar natuurlijk! Herinner je wat ik gezegd heb op een vorige cursusavond: een vlak is een CSG-object en kan dus net zoals een massief object een binnenkant en een buitenkant hebben. In dit voorbeeld ligt het vlak op zo'n manier dat de voorkant ook de binnenkant is. En de camera staat voor het vlak en zit dus 'in' een (vlak)object en kan geen halo zien. Met 'hollow' wordt het verholpen. Soms kan men door het vlak om te draaien zonder 'hollow' werken. Zou dat in dit geval een goed idee zijn? Het oppervlak van de bol moeten we niet zien. Dit is gedaan door er een verfje (pigment) op te leggen dat doorzichtig is: let op de 't' in rgbt <1,1,1,1>. Gevuld wordt de bol met halo. Laten we de opgegeven parameters eens bekijken. Dat lijken er veel maar kijk eens in de syntaxis van een halo:

halo {
 attenuating | emitting | glowing | dust
  [ constant | linear | cubic | poly ]
  [ planar_mapping | spherical_mapping | cylindrical_mapping | box_mapping ]
  [ dust_type DUST_TYPE ]
  [ eccentricity ECCENTRICITY ]
  [ max_value MAX_VALUE ]
  [ exponent EXPONENT ]
  [ samples SAMPLES ]
  [ aa_level AA_LEVEL ]
  [ aa_threshold AA_THRESHOLD ]
  [ jitter JITTER ]
  [ turbulence <TURBULENCE> ]
  [ octaves OCTAVES ]
  [ omega OMEGA ]
  [ lambda LAMBDA ]
  [ colour_map COLOUR_MAP ]
  [ frequency FREQUENCY ]
  [ phase PHASE ]
  [ scale <VECTOR> ]
  [ rotate <VECTOR> ]
  [ translate <VECTOR> ]   }

Dat is heel wat maar gelukkig: veel zaken kennen we al omdat we die hebben behandeld bij het maken van wolkenluchten. Terug naar ons voorbeeld. Met 'emitting' zorgen we dat onze deeltjes zelf licht uitstralen. De volgende statements zorgen voor de verdeling van het stof. Onze dichtheidsformules gaan werken met een spherical_mapping. De stofdichtheid wordt berekend aan de hand van de afstand tot het het nulpunt van het coördinatensysteem. Omdat het centrum van de bol samenvalt met het punt 0,0,0 hebben we dus een verloop van het centrum van de bol naar de buitenzijde. De dichtheid in het centrum is 1 en op het oppervlak van de bol 0. Dit is een goede manier van werken. Later kan de bol in zijn geheel elders geplaatst worden. Ik raad jullie aan om als je met 'halo' aan de gang gaat altijd eerst de boel in de oorsprong op te bouwen. Maar dat heb ik ook vroeger al gezegd voor objecten. Het verloop vanaf het centrum van de bol naar de buitenkant doen we simpel met 'linear' wat het verloop in dichtheid dus geleidelijk doet zijn. Nu nog de taak om de deeltjes van een optische eigenschap te voorzien. We kunnen volstaan met een kleurtje. We doen dit met

Color_map {
 [ 0 color rgbt <1,0,0,1>]
 [ 1 color rgbt <1,1,0,0>]
}

We hebben het al eerder over color_map gehad: het verloop gaat van 0 naar 1. Onze vuurbol is in het centrum geel en aan de randen rood. Om door het buitenste nevel (rood) een beetje heen te kijken zodat het gele binnenste ook nog te zien is wordt gedaan door de 'transluncent' te laten verlopen (de 't' in rgbt). Tot slot nog een technische kwestie: de 'samples 10'. Het advies is: zet die zo laag mogelijk, maar te laag geeft ongewenste effecten. De vuistregel is: 10 is prima als de halo regelmatig is zoals in dit geval maar komt er meer turbulentie in dan moet die waarde verhoogd worden wat ten koste gaat van rekentijd. Als we de scŠne bekijken dat valt direct op dat het wat kunstmatig lijkt: de kleuren van de halo zijn dof en de achtergrond schijnt teveel door. We moeten zeker in het centrum de zaak minder transparant maken. Dit kan door wat met de kleur te doen:

color_map {
 [0 color rgbt <1,0,0,1> ]
 [1 color rgbt <1,1,0,-1>]
}

en zie: dit lijkt beter.

In het rode buitengebied is er meer doorschijnendheid en in het centrum juist wat minder. Verbaas je niet over die -1 voor transparantie: dat mag gewoon.

Minder saai

Erg opwindend ziet de lichtgevende halo er niet uit. Maar net zoals we al eerder zagen bij het maken van wolkenluchtjes helpt een beetje turbulentie heel wat. We voegen flink wat turbulentie (1.5) toe.

  sphere { 0, 1
    pigment { color rgbt <1, 1, 1, 1> }
    halo {
      emitting
      spherical_mapping
      linear
      turbulence 1.5
      color_map {
        [ 0 color rgbt <1, 0, 0,  1> ]
        [ 1 color rgbt <1, 1, 0, -1> ]
      }
      samples 10
    }
    hollow
  }

Zouden we minder turbulentie toevoegen dan krijgen we een regelmatige 'stroming' in de dichtheid, met wat meer komen dan krulvormige bewegingen er bij. Het ziet er nu meer uit als een vurige explosie. Maar helaas: de bolvorm komt wel erg naar voren. Door de turbulentie kan het voorkomen dat de dichtheid bij het oppervlak van de bol tamelijk hoog wordt. Buiten de bol valt die plotsklaps terug op nul want de halo kan niet buiten het container object komen. Dus ga je een vage bolvorm zien die als het ware de explosie omsluit. Dat moet anders. En de oplossing ligt voor de hand: we maken de halo kleiner dan de bol waardoor de opgewolkte deeltjes binnen de bol blijven. Probeer maar om na samples 10 op te geven scale 0.5. Dan wordt de vuurbol wel de helft kleiner maar dat kunnen we compenseren door de bol weer groter te maken (na de hollow opgeven scale 1.5 ).

Wat betreft de kleuring kunnen we de zaak wat realistischer maken. We hebben een simpel kleurverloop gemaakt van 0 naar 1. We kunnen met 'frequency' ervoor zorgen dat die color_map zich in de range meermalen herhaald. Met een trucje kunnen we een mooi verlopende golving krijgen:

  sphere { 0, 1
    pigment { color rgbt <1, 1, 1, 1> }
    halo {
      emitting
      spherical_mapping
      linear
      turbulence 1.5
      color_map {
        [ 0.0 color rgbt <1, 0, 0,  1> ]
        [ 0.5 color rgbt <1, 1, 0, -1> ]
        [ 1.0 color rgbt <1, 0, 0,  1> ]
      }
      frequency 2
      samples 20
      scale 0.5
    }
    hollow
    scale 1.5
  }

De explosie wordt ook duidelijk mooier op deze manier. Maar er is een nadeel: hoe hoger de frequency hoe hoger je het aantal samples moet opgeven en dat kost rekentijd.

Gloeien

Laten we eens een grapje uithalen en de kleur laten verlopen van groen naar rood op de manier:

  sphere { 0, 1.5
    pigment { color rgbt <1, 1, 1, 1> }
    halo {
      emitting
      spherical_mapping
      linear
      turbulence 0.5
      color_map {
        [ 0 color rgbt <0, 1, 0,  1> ]
        [ 1 color rgbt <1, 0, 0, -1> ]
      }
      samples 10
      scale 0.75
    }
    hollow
    scale 1.5
  }

Wat zien we dan? De volgende dia graag. De rand is rood maar waar komt dat gele centrum vandaan? Omdat de ray die getraced wordt kleur krijgt van eerst groen en als die verder de halo binnendringt ontmoet die ook nog eens rood. Dat wordt als het container object verlaten wordt samengenomen, vervolgens gemiddeld en dan levert dus geel op. Als je dit effect niet wilt en eigenlijk willen we dat in dit ziekelijke geval ook niet, dan moeten we de soort halo niet 'emitting' maken maar 'glowing'.

Dat levert ook wel problemen op. Je bent nl. wel van dat vervelende mixen van de kleuren af maar er wordt ook licht geabsorbeerd. Probeer het maar eens. (Volgende dia graag.) Van het inwendige rood is weinig te zien omdat het omringende groen dit absorbeert, maar waar het om ging was: de kern moest rood zijn en niet geel!

In de wolken

Er is nog een soort halo die we goed kunnen gebruiken, de 'attenuating'. Dat klink moeilijk. Vandaar dat zo te zien het beter is om eerst maar aan de koffie te gaan. (Red. : er wordt koffie gedronken) We gaan weer verder. Voordat we ophielden waren we bezig met iets waar we echte wollige, wattige en plukkige wolken mee zouden gaan maken die door een zonnetje beschenen worden en die schaduwen werpen. We nemen ons oude voorbeeld en vervangen 'emitting' door 'attenuating'. Verder maken we het hele kleurverloop eventjes rood. Dan zien we beter wat we doen tegen de zwart/wit geblokte achtergrond nl. De manier waarop de lichtstraal wordt afgehandeld is als volgt: hij komt het container object binnen, weet dan dat die een halo binnen komt en houdt tijdens het passeren (de doorgang) voortdurend bij (in stapjes, vandaar die 'samples 10') welke dichtheid wordt aangetroffen. Deze geaccumuleerde dichtheid wordt gebruikt om de kleur te bepalen. Realiseer je dat dit anders is dan daarnet: daar werd ook wel de dichtheid bepaald in stapjes maar de erbij behorende kleur werd uitgerekend en die werd gesommeerd! Wat we nu doen is pas de kleur bepalen na afloop! Natuurlijk moeten we dit goed in de gaten houden als de color_map vast gaan leggen. De buitenzijde van de toekomstige wolk moet meer doorzichtigheid hebben dan de binnenkant. In ons geval vertaalt zich dat in

color_map{
 [0 color rgbt <1,0,0,1>]
 [1 color rgbt <1,0,0,0>]
}

Wolkig is het bepaald nog niet, meer een roodachtige bolligheid die wat doorzichtig (translucent) is. Net zoals daarnet kunnen we de bol en de halo gaan schalen na wat turbulentie (1.0) aangebracht te hebben. Zoals bij elk CSG-object schaalt de vulling mee. Tenminste met de kanttekening natuurlijk dat de halo zelf een mogelijkheid tot schaling heeft, maar dat hebben we aan het begin van de avond laten zien. Een wolk wordt veel realistischer als je zijn vorm een beetje elliptisch maakt. Zet dus na de 'hollow' van de sphere

scale  < 1.5, 0.75, 1 >

neer in de sourcetekst en het lijkt beter. Maar realistisch is het niet (even afgezien van de afschuwelijke rode kleur). Zoals net gezegd; we hebben te maken met een CSG-object dus een soort 'union' is mogelijk. Met andere woorden, we kunnen halo's laten overlappen door hun containing objects samen te nemen dan wel meerdere halo's in eenzelfde containing object stoppen. Hoe je te werk gaat is eigen keus en bepalend is vaak de uiteindelijke vorm die je wilt hebben. Soms is die vorm makkelijker binnen 1 object te verkrijgen, soms (bij meer onregelmatige wolkenvormen b.v.) makkelijker aan de hand van meerdere halo's elk in zijn eigen containing object.

sphere { 0, 1
 pigment { Clear}
 halo { de eerste}
 halo { de tweede}
 ...
 hollow
}

Natuurlijk kunnen we (anders hadden we er weinig aan) elke halo apart vervormen en verschuiven, maar dat had ik net al gezegd. Neem maar het volgende wolkje:

  sphere { 0, 1.5
    pigment { color rgbt <1, 1, 1, 1> }
    halo {
      attenuating
      spherical_mapping
      linear
      turbulence 1
      color_map {
        [ 0 color rgbt <1, 0, 0,  1> ]
        [ 1 color rgbt <1, 0, 0, -1> ]

       }
      samples 10
      scale <0.75, 0.5, 1>
      translate <-0.4, 0, 0>
    }
    halo {
      attenuating
      spherical_mapping
      linear
      turbulence 1
      color_map {
        [ 0 color rgbt <1, 0, 0,  1> ]
        [ 1 color rgbt <1, 0, 0, -1> ]
      }
      samples 10
      scale <0.75, 0.5, 1>
      translate <0.4, 0, 0>
    }
    halo {
      attenuating
      spherical_mapping
      linear
      turbulence 1
      color_map {
        [ 0 color rgbt <1, 0, 0,  1> ]
        [ 1 color rgbt <1, 0, 0, -1> ]
      }
      samples 10
      scale 0.5
      translate <0, 0.2, 0>
    }
    hollow
  }

Wat we nu zien (volgende dia graag) is iets dat weerkundigen een 'cumulus' noemen; de onderkant is tamelijk vlak en de bovenkant (top) loopt ver naar boven. Met wat geknutsel moet het iedereen toch wel lukken om wolken te maken die een beetje naar de zin zijn.

Mist

Natuurlijk kan je in principe een hele grote wolk maken en die over je scŠne heen laten dalen. Als je de transparantie een beetje in de gaten houdt zal je zelfs nog wel iets wat kunnen zien. Maar het kan eenvoudiger want er bestaat 'fog' in PovRay.

Gelijk kan ik dan Roselien helpen die zich zit af te vragen hoe ze een scŠne romantischer kan maken. Nu zie ik een heleboel vrijwillers die daar zo hun eigen ideeën over hebben en dat met haar in privacy willen bespreken maar grondmist of zo iets was haar eigen idee. En 'ground fog' bestaat! Ik zal proberen helder te zijn in mijn uitleg over de diverse mistvormen.

Gewone mist is overal gelijkmatig aanwezig en heeft een eigen kleur. De dichtheid geven we op als de afstand waarop nog 36,8 procent van de achtergrond zichtbaar is. Waarom dit rare getal? Ik weet het niet. Maar zeg maar voor het gemak 1/3. De kleur kan van alles zijn, zelfs zwart. Een zwarte mist in b.v. een grot geeft het effect alsof de reikwijdte van de blik vermindert.

  #include "colors.inc"

  camera {  location  <0, 20, -100>  }

  background { colour SkyBlue }

  plane { y, -10
    pigment {
      checker colour Yellow colour Green
      scale 20
    }
  }

  sphere { <0, 25, 0>, 40
    pigment { Red }
    finish { phong 1.0 phong_size 20 }
  }

  sphere { <-100, 150, 200>,  20
    pigment { Green }
    finish { phong 1.0 phong_size 20 }
  }

  sphere { <100, 25, 100>, 30
    pigment { Blue }
    finish { phong 1.0 phong_size 20 }
  }

  light_source { <100, 120, 40>
                         colour White}

  fog {
    distance 150
    colour rgb<0.3, 0.5, 0.2>
  }

We hebben (volgende dia) een aantal gekleurde bollen, een achtergrondskleur, een betegeld vloertje voor wat perspectief en een gekleurd mistje. Een gevolg van het gebruik van standaard-mist is wel dat de achtergrond echt helemaal kan verdwijnen. Soms wil je dat niet. Voeg dan aan de kleur van de mist toe dat er translucency nodig is; een t (van rgbt) van 0.2 zorgt dat je altijd minimaal 20procent van de achtergrond blijft zien.

fog {
 distance 150
 color rgbt <0.3, 0.3, 0.3, 0.2>
}

Wat de mist doet is gewoon de lichtintensiteit veranderen. Wat niet gebeurt is dat er ook nog licht door de mist heen filtert. Dat kan veranderd worden met

color rgbf < 0.3, 0.3, 0.3, 1.0 >

Let op de 'f' van 'filter' die nu zorgt dat al het licht (100 procent) dat door de mist valt door de mist beďnvloed wordt. Is de mist grijs dan kan je zo de mate van vergrijzing van de doorvallende kleuren bepalen. Om de mist wat interessanter te maken kan er turbulentie worden toegevoegd.

  fog {
    distance 150
    colour rgbf < 0.3, 0.5, 0.2, 1.0 >

    turbulence 0.2
    turb_depth 0.3
  }

Grondmist

Iedereen kent wel het typische effect van grondmist; heel bekend zijn foto's van koeien die met hun poten in de mist verdwijnen. Een voorbeeld van z'n mist:

fog {
    distance 150
    colour rgbf<0.3, 0.5, 0.2, 1.0>
    fog_type 2
    fog_offset 25
    fog_alt 1
  }

Gebruik deze maar eens in de daarnet scŠne met de bollen. Ik heb er geen dia van maar kan vertellen dat het best een aardig effect is.

Ter verklaring:

fpg_type 2 geeft aan dat het grondmist betreft. Vandaar dat er dan gepraat kan worden over fog_offset die aangeeft hoe hoog de mist komt (langs de y-as gezien) en over fog_alt die aangeeft hoe snel de dichtheid van de mist naar 0 gaat. In dit voorbeeld heeft de mist een constante dichtheid beneden y=25 en neemt daarboven heel snel af.

Nog meer mist

Je kan een scŠne voorzien van meer dan 1 mist(soort). Gewoon diverse 'fog' beschrijvingen in de scŠnebeschrijving opnemen. Het aantal soorten mist in de atmosfeer is redelijk groot. Ik zal het niet allemaal behandelen maar kan wel het bestaan aanstippen van mist met konstante dichtheid, grondmist, mist die het licht filtert, mist die dat niet doet, mist met een drempelwaarde voor de doorzichtigheid enz. Geliefd zijn combinaties van gewone mist met grondmist.

Atmosfeer

De lucht is nooit volkomen helder. Is de lucht vochtig dan verdwijnt alles in de verte in een blauw waas. Ook lichtbundels zijn zichtbaar omdat er altijd wel wat stof is. Met 'fog' kom je best een aardig eind maar er is een speciale methode om die overal gelijkmatig aanwezige atmosferische lichtverstrooiing voor elkaar te krijgen. Omdat het gaat om interactie met licht kan de atmosfeer-grap aan de lichtbron worden vastgemaakt. Dus

light_source { < 0, 10, 0 >
 color rgb < 1, 1, 1 >
 ...
 spotlight
 ...
 atmospheric_attenuation on
}

zorgt ervoor dat het uittredend licht door de atmosfeer verzwakt gaat worden. Natuurlijk moet ook de atmosfeer beschreven worden met:

atmosphere {
 type 1
 samples 10
 distance 20
 scattering 0.5
}

Dit betekent: de soort is van type 1 wat wil zeggen: licht wordt gelijkmatig naar alle kanten verspreid. Voor het gemak van de cursisten is de betekenis van 'distance' dezelfde als bij de eerder besproken 'fog' nl. een maat voor de sterkte van het atmosferische effect. Met 'scattering' geven we op hoeveel van het licht we overhouden. Zo kan je fraai de 'helderheid' van de atmosfeer instellen. Ik raad iedereen om als huiswerk eens de demo's die namen hebben zoals atmos1.pov e.d. te bekijken en eventueel te laten doorrekenen.

Zo meteen

We nemen even pauze voor nog meer koffie. Voorlopig zijn we klaar met mist, atmosfeer, wolken e.d. Er valt veel meer te vertellen maar iedereen zit nu wel aan zijn tax. Na de koffie iets heel anders.

Wipkip

Jolanda is bezig met een scŠne waarin een soort speeltuin wordt afgebeeld. Zij komt met de vraag die we hier voor een groot publiek gaan oplossen: 'Hoe maak ik een wipkip?'. Ik zie een paar mensen vragend kijken en zo te zien hebben sommige mannen een vreemde associatie bij het woord. Heren, gedraag u wat vrouwvriendelijker! Voor wie niet weet wat een wipkip is: dat is een speeltuig voor kleuters. Op een stevige bodemplaat is een spiraalveer loodrecht gemonteerd. Bovenop de spiraal is een zitvlakje gemaakt met een uitsteeksel om steun met de handen te hebben. Kinderen zitten erop en maken een wippende beweging. Wippen, schommelen en zwaaien vinden veel kleine kinderen erg leuk. Worden mensen ouder dan wordt meestal alleen de eerste beweging geregeld beoefend.

Ik wist ook niet hoe je een spiraalveer moest maken. Gaan we filosoferen dan is de manier waarop je het maakt logisch: een vorm via wiskundige formules gaan buigen. Maar is er iemand onder de cursisten met voldoende wiskundegevoel om dat te doen? Nee helaas en ondanks de smachtende blik in Jolanda's ogen toen ze met de vraag over de wipkip bij me kwam: ook ik wist het niet. Maar ik heb Internet en dus zijn we samen gaan zoeken. En ik heb toen wat gevonden voor ons wipkippetje.

Chris Colefax heeft een algemene oplossing gemaakt voor spiralen of spoelen (coils). Op de disk die de cursisten mee krijgen staat dit programma. (Red: voor de lezers van dit blad zal de vermelde software na telefonische aanvraag verstrekt worden. We zullen het ook op disk ST75 zetten voor de volledigheid).

Het fraaie van de hier opgevoerde methode is dat het resulterende spoel-object van het CSG-type is: dus massief en niet zoals zo vaak met dit soort dingen alleen maar bestaand uit een vliesdun oppervlak aangegeven door driehoeken. We kunnen de spoel dus gewoon roteren, schalen en samen laten gaan met andere massieve objecten, we kunnen er happen uit nemen, de boel schalen enz. We moeten de spoel natuurlijk wel uit simpele wiskundige voorwerpen (basisvormen) gaan maken. Er is een basisvorm nodig met een gebogen oppervlak. Een bol b.v. of een cylinder of een torus. Met behulp van een heleboel van deze basisvormen benaderen we een 'coil'. Nu de praktijk. We moeten in onze bibliotheek de file coil.inc opbergen. Dan kunnen we in onze scŠnebeschrijving opnemen

  #declare coil_point1 = <0, 0, 0>
  #declare coil_point2 = <0, 10, 0>

gevolgd door de import:

    object {#include "Coil.inc"
       texture {MyTexture}
       }

We zijn dus volkomen vrij om het materiaal van de spoel nader te bepalen. De twee opgegeven punten geven aan van waar naar waar de spoel moet lopen; een begin- en een eindpunt. Er zijn natuurlijk een hoop andere dingen op te geven om de dimensies van de spoel en de vorm te bepalen en wel: (zie onderstaande tabel)

De volgende conventie geldt: coil_type=1 gebruikt als uitgangsmateriaal bollen (spheres) en kan af en toe niet-continue uitpakken. Type 2 gebruikt zowel bollen als cylinders en dan krijg je gegarandeerd een aaneengesloten voorwerp. Type 3 gebruikt stukjes van tori en deze wordt aanbevolen want het oppervlak wordt zo gelijkmatig en er wordt niet erg veel geheugen gebruikt. Bij type 3 hoef je dan ook niet de coil_smoothness op te geven wat bij type 1 en 2 wel het geval is. De betekenis is dan: hoeveel bollen en/of cylinders totaal gebruikt worden per omwenteling van de spoel. Verder is te zien dat er aparte parameters zijn voor de radius en de diameter bij begin- en eindpunt. Dat opent mogelijkheden om de raarste spoelen te maken. Ook hebben we de mogelijkheid om de draaiing linksom of rechtsom te laten verlopen. Een positieve coil_revolutions geeft een kloksgewijze draai; een negatieve waarde laat de draaiing de andere kant op gaan. Er is nog een technische beperking die voortkomt uit de gebruikte wiskunde: bij type 3 spoelen kan de coil_revolutions alleen maar met veelvouden van 0.5 werken.

Als we de include-file even onder ogen nemen dan zien we dat er heel wat gedeclareerd wordt. Centraal staat de 'Union' die alles aaneenplakt. Wat hij plakt wordt in eerste instantie door het type bepaald. Verder is te zien dat er heel wat variabelen worden gebruikt om alles te positioneren en dat een groot aantal programmalus en zorgen voor de generatie van een hele kudde bollen, cylinders of torussen. Schroefvormen in de vorm van b.v. wormwielen worden vaak gebruikt in animaties. Daar zien we in deze file dan ook de sporen van terug. Maar aan het begin van deze cursus is al gezegd: 'animaties, daar bemoeien we ons niet mee'. En dat doen we nu ook heel actief.

Tot slot een klein voorbeeldje zodat iedereen een houvast heeft in deze toch wel wat abstracte materie.

// Camera en belichting
   camera {location <0, 0, -15>
           look_at <0, 0, 0>}
   light_source {<-10, -20, -50>
                 rgb <.7, .7, .3>}
   light_source {<20, 40, -30>
                 rgb <.2, .4, .7>}
   light_source {<0, 0, -100>
                 rgb 1}
// even wat redelijke verhoudingen
   #declare coil_thickness = .5
   #declare coil_smoothness = 16
// Coil 3 type (met halve tori)
   #declare coil_type = 3
   #declare coil_radius = 2
   #declare coil_radius2 = 2
   #declare coil_thickness2 = .5
   #declare coil_revolutions = 3
   object {#include "Coil"
           pigment {rgb <.5, .7, 1>}
           translate <6, -5, 0>}

We zien, het centrale onderdeel van de wipkip is redelijk eenvoudig te maken. Aan de hand van dit voorbeeld kan met wat verdere schaling, positionering en texture de uit CVG-objecten bestaande wipkip aan elkaar worden geplakt. Ik laat het hierbij.

Piet Vogelaar

Van de Redactie

We betreuren het zeer dat in dit blad geen kleur kan worden afgedrukt. Over het algemeen bevatten Povray beelden fraaie kleuren maar hoe we ook proberen om die naar grijstinten over te zetten, het resultaat is gewoon veel te flets. Verder is het volgens Piet vaak van essentieel belang dat de kleuren zichtbaar zijn. De lezers zullen het dus zonder illustratieve afbeeldingen moeten stellen. Maar ze kunnen natuurlijk altijd hun computer aan het rekenen zetten om de beelden op hun eigen kleurenbeeldscherm te reproduceren!


Copyright © Rein Bakhuizen van den Brink
Last updated on 1 september 1999
Home Creatief met POVRay De monitor en de achtergrond Sterren aan het firmament