Kort introduktion till POV-Ray, del 1 Kjell Y Svensson, 2004-02-02,2007-03-13 Denna serie av artiklar ger en grundläggande introduktion och förhoppningsvis en förståelse för hur man skapar realistiska datorberäknade scener med hjälp ray-tracing. Raytracingprogram skapar en bild genom att beräkna hur ljus reflekteras från ett objekt i en scen till betraktraren, med hänsyn till eventuell reflektion och multipla ljuskällor. Jag kommer att använda mig av POV-Ray för beskriva principen. POV-Ray är ett program (gratis ) som kan framställa bilder som kan bli mycket verklighetstrogna om man arbetar med scenerna tillräckligt mycket, och förstår de grundläggande mekanismerna. POV-Ray är en förkortning av Persistence of Vision Ray tracing och är äkta freeware som kan laddas ner från http://www.povray.org. Du bör installera programmet innan du fortsätter läsa, så du kan prova och experimentera med scenerna som beskrivs tills du verkligen förstår hur det fungerar. Denna första artikel introducerar grunderna samt ger lite tips om hur man kan modellera för att kunna hantera lite mer komplicerade scener som vi kommer att komma till senare. Scenbeskrivning En scen har tre element som alla måste finnas för att man ska kunna kalla det en scen, minst ett objekt, en ljuskälla samt en kamera som kan se och fotografera scenen. Vår första scen blir ett ensamt rött klot. Figur 1. Minimal scen med ett rött klot Med scen-beskrivningsspråket som POV-Ray använder sig av så beskrivs denna scen av följande text: // Minimal scen med rött klot camera { location <0,0,-5> look_at <0,0,0> }
light_source { <0,10,-10>, color red 1 green 1 blue 1 } sphere { <0,0,0>, 1 pigment { color red 1 green 0 blue 0 } } Scen 1. Minimal scen med rött klot Texten består av fyra delar, först kommer en kommentar som beskriver vad scenen innehåller, sedan en kamera som befinner sig på positionen location <0,0,-5> och tittar på look_at <0,0,0>. Nästa del är en ljuskälla light_source som befinner sig på positionen <0,0,-10> och har färgen red 1, blue 1 och green 1. Slutligen så finns ett klot sphere på positionen <0,0,0> med radien 1 och med pigment color red 1, blue 0 och green 0. Verkar det fullständigt obegripligt? Jag förstår dig, raderna förutsätter rätt mycket kunskap om hemska saker som koordinat-system, programmerings-språk, RGB-färger och geometriska former, men misströsta inte. Det är inte alls så svår som det verkar om man bara tar en sak i taget. Tips 1. Lägg alltid in kameran, ljuset och objekten på samma ställe så vet du var i texten du ska leta. Kommentarer Kommentarer kommer från programmerings-språk och är något som Pov-Ray helt ignorerar när den läser en scenbeskrivning. En kommentar börjar alltid med två // på en rad och gäller till raden tar slut. Exempel på en kommentar: // Detta är en kommentar // Detta är ytterligare en kommentar, behövs det fler kommentarer? Tips 2. Lägg alltid in en beskrivning för den scen du beskriver, och gärna också på alla de ljus och objekt du har i beskrivningen. Det gör det mycket lättare att återanvända eller förändra scenen senare. Du glömmer fortare än du tror, tro mig, har jag glömt något?. Koordinatsystem Koordinat-system är lite besvärligare att både förstå och att förklara. Ett sätt att förklara det är med tre stavar, en som vi kallar X som ligger ner och går mellan höger och vänster, en som står rakt som vi kallar Y, och en som vi kallar Z som ligger så att den går från oss och bort. Hängde du med? Okey, jag gör en bild där x-staven är röd, y-staven grön och z-staven blå. Matematiker kallar dessa stavar för axlar, så det gör jag också från och med nu. (Vi vill väl alla verka intellekta )
Figur 2. Koordinatsystem för Pov-Ray Om vi sedan kallar platsen där den röda, gröna och blå staven korsas för origo och mäter alla avstånd från denna punkt så kan vi ange var ett föremål befinner sig med hjälp av tre siffror. Origo kan skrivas som x=0, y=0, z=0, men då x,y och z alltid kommer i samma ordning så detta till <0,0,0>. Om vi ökar x så blir koordinaten mer till höger, om vi ökar y blir koordinaten mer uppåt och om ökar z blir koordinaten mer in i bilden. Kanske inte så svårt, men ett par bilder gör det kanske lite enklare. Jag använder samma klot som i första exemplet, men färgar det efter de axlar som det klättrar på. Figure 3. Ett klot i origo <0,0,0> Ett annat klot nu med koordinaterna <0,0,20> dvs. 20 enheter bort från oss i z-riktningen.
Figure 4. Klot med koordinaten <0,0,5> Och slutligen ett klot med koordinaterna <0,20,0>, dvs 20 enheter upp i y-riktningen. Figur 5. Klot med koordinaten <0,20,0> Antag nu att vi fotograferar scenen från ytterligare en kamera som finns utanför scenen. Vad kommer vi då att se. Kameran är en blå box och vår lampa ett gult klot, och vårt klot är fortfarande ett rött klot. Jo, detta:
Figur 5-1. Fotograferad scen med kamera på position <10,10,-20> Jag har lagt in axlarna för X,Y,Z så det ska vara enklare att se var objekten är. Tips 3. Skapa alla objekt i origo, dvs. i koordinaterna <0,0,0>. Det gör det mycket lättare att senare återanvända det du gör. RGB-färger RGB-färger låter lite som KGB, men är inte alls något att vara rädd för. RGB står helt enkelt för färgerna Rött, Grönt och Blått. Dessa är grundfärger används vid additativ färgblandning, dvs. då man lägger till färger, precis som om man hade tre ficklampor en röd, en grön och en blå. Om man lyser på en punkt med alla ficklamporna blir den helt vit. Det är så som en färg- TV fungerar. Om du tittar riktigt nära på en färg-tv ser du hur bilden byggs upp av ett mönster av små punkter i färgerna, rött, grönt och blått. Texten i vår första scen beskriver färgen som color och sedan hur mycket rött, grönt och blått vi vill ha. För att färgerna ska se naturliga ut måste vi belysa dem med vitt ljus och det får vi om alla färger finns med. Därför blir definierar vi en lampa med color red 1 green 1 blue 1 vilket ger en vit lampa. Hur stark en färg är bestäms av värdet efter red, green och blue och detta värde kan vara från 0 till 1 och uttrycks därimellan som decimaltal 0.1, 0.2, 0.3 och så vidare. För att man inte ska slita ut fingertopparna kan man uttrycka färger lite mer kortfattat genom att bara skriva rgb och värdet på de tre färgerna inom hakar på samma sätt som vi skrev
koordinater. Vårt röda klot blir då rgb <1,0,0>. Vill vi ha ett helt grönt klot skriver vi rgb <0,1,0> och ett blått blir då <0,0,1>. Naturligtvis har naturen sällan rent röda, gröna, eller blå klot utan där finns även gula klot och ett sådant får man om man blandar rött och grönt genom att skriva rgb <1,1,0>. (Trodde du inte?) Figur 6. Vår första scen med gult klot Tips 4. Om du tycker att det är besvärligt att ange rgb-värde finns det ett antal färdiga färger att använda. Mer om detta senare. Det enda som jag inte berört hitills är ordet pigment, men det betyder just bara färg och anger att man anger vilken färg objektet har. Bakgrund Hitills har vi sett vår första scen med svart bakgrund, medan de övriga bilderna har haft vit bakgrund. Detta beror på att vi i vår scen inte angett vilken bakgrund den ska ha. Detta gör man med uttrycket background {rgb <1,1,1> }. Lägger man till detta till vår första scen-beskrivning blir bilden denna. Figur 7. Vår scen med vit bakgrund. Och med de förkortningar vi har lärt oss hittills så ser källkoden ut så här nu.
// Minimal scen med gul sfär background { rgb <1,1,1> } camera { location <0,0,-5> look_at <0,0,0> } light_source { <0,10,-10>, rgb <1,1,1> } sphere { <0,0,0>, 1 pigment { rgb <1,1,0> } } Scen 2. Minimal scen med gult klot och vit bakgrund I nästa avsnitt, del 2, tar jag upp hur man placerar det röda klotet på en yta, flyttar klotet, och förstorar klotet. Jag berättar också om fler geometriska former, såsom kuber, cylindrar, och hyper-ellipsoider, samt inte minst hur man roterar dessa, för det är ju inte speciellt roligt att rotera ett klot för det märks ju inte.