Kort introduktion till POV-Ray, del 5 Kjell Y Svensson, 2004,2007-03-14 Denna del kommer att beskriva hur man modellerar glas, vatten och metall. Vi kommer som vanligt använda oss av lite fördefinierat, men vi börjar med schack. Schack Vad har schack med ray-tracing att göra frågar ni er säkert. Ingenting, förutom att de allra första ray-tracing-försöken hade just ett schackrutemönster som underlag för att visa hur snyggt det var med reflektioner i blanka yter. Så vi öppnar väl med ett sådant exempel. Ett numera klassiskt klot på ett schackbräde, med följande definition på eplanet. plane { <0,1,0>, -1 pigment { checker pigment { color White, pigment { color Black Figur 5-1. Klassisk ray-tracing-bild med reflekterande klot Reflektion För att klotet ska reflekterar krävs det att man beskriver hur mycket av det indirekt infallande ljuset som ska reflekteras. Därför finns det ytterligare en parameter finish som kan kontrolleras, nämligen reflektionen reflection. Klotet ovan beskrevs på följande sätt. sphere { <0,0,0>, 1 texture { pigment { color Red finish { phong 0.5 phong_size 100 reflection 0.2 Reflection anger hur mycket av ljuset som studsar bort från ytan, och är ett värde från 0 till 1. Om man inte sätter något värde alls, så är reflection 0. Tips 12. Det går snabbare att beräkna en bild om reflection är 0 på ett objekt, man bilden blir naturligtvis lite tråkigare. Använd reflektion med sunt förnuft.
Glas, filter och ior Glas har en egenskap som de ytor vi har beskrivit tidigare saknar, det är genomskinligt, men reflekterar ändå ljuset som de klot vi har sett tidigare. Detta kan vi beskriva genom att ange hur mycket av ljuset som ska gå igenom objektet i definitionen av pigment. POV-Ray har en parameter f som i filter och anges med att rgb har utökats till rgbf och anges som en vektor <röd, grön, blå, filter>. Ett helt genomskinligt object anges då som <1,1,1,1>, dvs objektet är egentligen helt vitt, men släpper igenom allt ljus. En annan egenskap är hur mycket det genomsläppta ljuset bryts. Detta specificeras med ior. Det är inte hämtat från Nalle Puh, tror jag. Med ett värde 1.0 på ior så bryts ljuset inte alls. Vi ändrar på sfären ovan så den blir helt genomskinlig med ett ior på 1 och ser vad som händer. sphere { <0,0,0>, 1 pigment { rgbf <1,1,1,1> interior { ior 1 Figur 5-2. Helt genomskinligt objekt med ior 1 Nu vet du vilka egenskaper den osynliga mannen har, han är helt vit, med ett filter som släpper igenom allt och har ett ior som är 1. Om vi ändrar på ior så börjar det hända saker. Några typiska värden på ior är vatten 1.3, glas 1.5 och diamant 2.4, dvs hur hårdare ett genomskinligt ämne ju högre ior. Låt oss testa att göra sfären av glas, genom att sätta ior till 1.5.
Figur 5-3. Sfär av glas Vi kan nu test att ändra färg på den och ge glaset lite finish, så att det reflekterar schackmönstret. sphere { <0,0,0>, 1 pigment { rgbf <0.5,0.5,1,1> interior { ior 1.5 finish { phong 0.5 phong_size 100 Figur 5-4. Sfär av blått glas Notera att det nu blir en skugga och att den blir blåaktig eftersom klotet nu är blått. Surface of Revolution Låter nästan som, vid direktöversättning, som ytan av en revolution, men så är det inte. I stället handlar det om att kunna skapa objekt ungeför som en svarvare gör när han skapar objekt. Man definierar hur kanten ska se ut och skär sedan ner objektet medan det roterar. Låter komplicerat, men vi tar ett par exempel för att reda ut det hela. Definitionen av ett roterande object heter sor, vilket just står för Surface of Revolution. Antag att vi svarvar cylindern mjukt efter de röda punkterna i följande bild.
Figur 5-5. Markeringar för sor-svarvning Resultatet av en sådan svarvning, utförd av en skicklig svarvare förstås, skulle bli ungeför så här. Figur 5-6. Utförd svarvning utgående från punkterna. POV-Rays beskrivning av detta blir en sor som ser ut så här. 7, <0.000000, 0.000000> <0.118143, 0.000000> <0.620253, 0.540084> <0.210970, 0.827004> <0.194093, 0.962025> <0.286920, 1.000000> <0.468354, 1.033755> pigment { Yellow normal { bumps 0.5 scale 0.001 finish { phong 1 phong_size 200 translate <0,0,0.5> Det finns en sak som kräver en närmare beskrivning och det är. Sturm anger att man ska göra en noggrannare beräkning. Det är inte säkert att det krävs, men om du får en dålig bild, som tex kan se ut så här, med ett vertikalt streck, så lägg till.
Figur 5-6 utan. Vasen är i detta fallet ganska bred, men den kan lätt göras smal genom att man drar in den tredje punkten nerifrån. Beskrivningen blir då. 7, <0.000000, 0.000000> <0.118143, 0.000000> <0.13, 0.540084> // Denna punkt är ändrad jämfört med tidigare exempel <0.210970, 0.827004> <0.194093, 0.962025> <0.286920, 1.000000> <0.468354, 1.033755> pigment { Yellow normal { bumps 0.5 scale 0.001 finish { phong 1 phong_size 200 translate <0,0,0.5> Figur 5-7. Indragen midja Att göra eleganta vaser, eller glas är inte enkelt med sor, men resultaten kan bli riktigt bra när man väl lyckas. Jag sa ju i inledningen att detta avsnitt också skulle ta upp metall och det ska det också.
Metall Metall är ju alltid trevligt att kunna använda i sina scener, speciellt som guld och silver är riktigt trevliga metaller. POV-Ray har också här hjälp till genom att ha en fil metals.inc som definierar upp ett antal vanlig metaller i olika varianter, allt från matta till högglansiga. För att demonstrera detta så ska jag göra ett glas, inte i glas, utan i rent silver. Titta i metals.inc för att se vilka varianter som finns. 8, <0.0, -0.5>, <3.0, 0.0>, <1.0, 0.2>, <0.5, 0.4>, <0.5, 4.0>, <1.0, 5.0>, <3.0, 10.0>, <4.0, 11.0> open texture { T_Silver_1D scale 0.1 Open är en nyhet som attribute här, men det innebär bara att toppen på glaset är öppen. Scale behövs för att denna sor är hela 11 enheter hög. Denna sor ser då så här ut. Figur 5-8. Bägare i rent silver på schackbräde Vatten Nu återstår bara att lägga bägaren på vatten och då måste vi utnyttja en hel del kunskaper från del 3 och del 4 så objekten ser nu ut så här. intersection { 8, <0.0, -0.5>, <3.0, 0.0>, <1.0, 0.2>, <0.5, 0.4>, <0.5, 4.0>, <1.0, 5.0>,
<3.0, 10.0>, <4.0, 11.0> texture { T_Silver_1D scale 0.1 cylinder { <0,-1,0>, <0,0.75,0>, 0.2 pigment { rgbf <1,0,0,0.5> interior { ior 1.5 normal { ripples 1 scale 0.5 translate <0,0.1,0> box { <0,0,0>, <1,1,1> scale <1,0.1,1> translate <-0.5,0,-0.5> texture { T_Wood14 rotate <90,0,0> Notera att jag använder skalning och förflyttning för att få allt att falla på plats. Med en vattenyta som boxen kan flyta på som ser ut så här: plane { <0,1,0>, 0 pigment { SkyBlue normal { waves 1 translate <0,1,0> Flera saker har ändrats från standardscenen så här finns den kompletta nya koden för scenen. #include "colors.inc" #include "textures.inc" #include "metals.inc" #include "woods.inc" background { rgb <0,0,0> camera { location <0,1.1,-1.5> look_at <0,0.5,0> light_source { <3,100,-3>, rgb <1,1,1> plane { <0,1,0>, 0 pigment { SkyBlue normal { waves 1 translate <0,1,0> sky_sphere { pigment { Blue_Sky2 intersection { 8, <0.0, -0.5>, <3.0, 0.0>, <1.0, 0.2>, <0.5, 0.4>, <0.5, 4.0>,
<1.0, 5.0>, <3.0, 10.0>, <4.0, 11.0> texture { T_Silver_1D scale 0.1 cylinder { <0,-1,0>, <0,0.75,0>, 0.2 pigment { rgbf <1,0,0,0.5> interior { ior 1.5 normal { ripples 1 scale 0.5 translate <0,0.1,0> box { <0,0,0>, <1,1,1> scale <1,0.1,1> translate <-0.5,0,-0.5> texture { T_Wood14 rotate <90,0,0> Så ser scenen ut så här när den är beräknad. Figur 5-9. Flytande träblock med silverbägare fylld med vin Nästa del, del 6 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 objektform torus.