Kort introduktion till POV-Ray, del 6 Kjell Y Svensson, 2004,2007-03- 14 Detta avsnitt kommer att bli en liten lathund till hur man gör saker snabbare med mindre skrivande. Koppla dock inte ur hjärnan för det kommer finnas saker som #declare och #while för att inte tala om matematikens kusiner sinus och cosinus. Och eftersom det är avsnitt 6 så tar vi även upp en ny sexig objektform torus. Lata tips Det är inte nödvändigt att skriva color i en pigment-beskrivning, utan man kan skriva Pigment { Red direkt. Man behöver inte skriva ut nollan vid decimal-tal, utan 0.01 kan skrivas som enbart.01. Rotation kring en axel, tex 90 grader kring y-axeln har jag tidigare beskrivit som rotate <0,90,0>, detta kan förkortas till rotate y*90. Om man vill skala lika i x,y och z-led, tex skala upp en faktor 2, så kan man istället för att skriva scale <2,2,2> bara skriva scale 2. Loopar En mycket bra och arbetsbesparande finess i POV-Ray är möjligheten att beskriva loopar, dvs en aktivitet som görs flera gången, men bara behöver beskrivas en gång. Antag att vi i vår scen vill ha 10 lika sfärer. Då kan vi istället för att göra 10 sfärer beskriva en sfär och skapa en loop som gör att det blir 10 stycken. Loopar skapas genom att deklarerar en loop-variabel med uttrycket #declare variablename = 0; Därefter bildas loopen mellan uttrycket #while och. Vi tittar på hur det ser ut i beskrivningen. Innan måste loop-variabeln räknas upp så att villkoret counter < 10 blir falskt när counter blir 10. #declare counter = 0; #while (counter < 10) pigment { Red #declare counter = counter + 1;
Figur 6-1. Loop med 10 röda sfärer Vad gick fel med denna loop? Vi ser ju bara en sfär när vi trodde att vi skapade 10 stycken. Det finns en logisk förklaring, visst vi skapade 10 sfärer, man alla på samma position. Vi måste förflytta sfären som skapas i loopen, och det kan vi göra med en translate som tar loopräknaren counter till sin hjälp. Tips 12. Om det POV-Ray tar en evighet på sig att beräkna en scen, kontrollera då att du verkligen räknar upp loop-variabeln i varje varv av loopen. Vi modifierar loop till detta. #declare counter = 0; #while (counter < 10) pigment { Red translate <counter * 0.5, 0,0> #declare counter = counter + 1; Figur 6-2. Loop med 10 förflyttade sfärer Detta var väl vad vi förväntade oss, inte sant, men nu när vi har blivit varma i kläderna låt oss fortsätta. Varför inte skapa sfärerna i en ring. Det är nu vi kommer fram till er värsta mardröm, vi måste använda oss av de förskräckliga kusinerna sinus och cosinus. Du trodde väl aldrig att du skulle få någon nytta av dem, eller hur. I loopen förflyttar vi sfärerna både
längs X-axeln och Y-axeln, och vi förflyttar oss 36 grader per varv i loopen. För att förstå vad som händer kan du söka på sinus och cosinus på nätet, det finns säkert någon bra introduktion. #declare counter = 0; #while (counter < 11) pigment { Red translate <sin(36*counter),0.5 +cos(36*counter),0> #declare counter = counter + 1; Figur 6-3. 11 sfärer i en ring Nu när vi kan skriva en enkel loop, varför inte gå vidare skriva en loop inuti en loop, och på så sätt skapa figurer i ett två-dimensionellt mönster. Låt oss test och skapa en uppställd hop av krigiska sfärer. #declare Xcounter = 0; #while (Xcounter < 10) #declare Zcounter = 0; #while (Zcounter < 10) pigment { Red translate <Xcounter* 0.5, 0, Zcounter*0.5> #declare Zcounter = Zcounter + 1; #declare Xcounter = Xcounter + 1;
Figur 6-4. 100 sfärer i perfekt formation Eller varför inte 10 000 sfärer som väller fram in i en enda lång ström. Figur 6-5. 10 000 sfärer i en lång kö. Eller varför inte 1 miljon sfärer. Du förstår kanske potentialen för att skapa många objekt med några få raders beskrivning. Jag ska avsluta denna orgie i att skapa röda sfärer med att visa hur man kan skapa dem i 3 dimensioner med följande loop. #declare Xcounter = 0; #while (Xcounter < 10) #declare Zcounter = 0; #while (Zcounter < 10) #declare Ycounter = 0; #while (Ycounter < 10) pigment { Red translate <Xcounter* 0.5, Ycounter*0.5, Zcounter*0.5> #declare Ycounter = Ycounter + 1; #declare Zcounter = Zcounter + 1; #declare Xcounter = Xcounter + 1;
Figur 6-6. Kub med 10x10x10 sfärer Proffs-tips 2. Indentera alltid en loop så att du ser vilka #while som hör ihop med vilka. Vid långa looper, skriv då en kommentar efter #while och som visar vilka som hör ihop. Det finns mera möjligheter i POV-Rays programspråk, men det återkommer jag till i senare avsnitt. Glöm inte att avsnitt 256 kommer att avslöja hur man verkligen använder sig av POV- Ray. Torus En torus är formad precis som en badring, dvs en rund ring. Denna form finns inbyggd för att den är rätt så svår att beskriva med andra former. En torus definieras av två mätt, radien på själva ringen och radien på ringen som utgör kroppen på torusen. Ett exempel på en smal torus. torus { 4,.5 // ringens radie, kroppens radie rotate -90*x // rotation så vi kan se den från sidan pigment { Yellow Figur 6-7. Smal torus Om vi ändrar till torus { 4, 2 så ser torusen ut så här, så nu är det kanske mera klart vilket mått som påverkar vad.
Figur 6-7 med torus { 4,2 Och som final i detta avsnitt, en massa ringar. union { #declare Xcounter = 0; #while (Xcounter < 10) #declare Zcounter = 0; #while (Zcounter < 10) #declare Ycounter = 0; #while (Ycounter < 10) torus { 4, 0.6 rotate -90*x scale 0.1 translate <Xcounter* 0.7, Ycounter*0.7, Zcounter*2> #declare Ycounter = Ycounter + 1; #declare Zcounter = Zcounter + 1; #declare Xcounter = Xcounter + 1; pigment { BrightGold finish { phong 1 phong_size 100 Notera att jag lägger en union runt hela loopen. Detta gör att jag kan ange pigment och finish för alla object på en gång, vilket också gör att beräkandet av scenen går snabbare och kräver mindre minne.
Figur 6-8. Torus i ett tre-dimensionellt mönster. Nästa del, del 7 kommer att handla om slumpen, vi ska lära oss skriva och så undersöker vi några fler fördefinierade mönster i stil med schack vi sett tidigare.