Debreceni Egyetem Matematikai Intézet Felületek vizualizációja sugárkövetéses eljárással Készítette: Kovács Edina III. évfolyam Matematika kiegészítő levelező Témavezető: Dr. Kovács Zoltán egyetemi docens 2004.
Akkor tudod igazán, hogy már túl régen használod a sugárkövetés módszerét Ha azon tűnődsz, hogy vajon Isten melyik sugárkövetést használta. David Kraics
Tartalomjegyzék I. Bevezetés...4 I.1. A sugárkövetés... 5 I.2. A sugárkövetéses módszer működése... 5 I.3. A POV-Ray... 7 I.4. A POV-Ray használata... 8 I.5. A szövegszerkesztő részei... 10 I.6. Az include fájlok... 11 I.7. Egyéb include fájlok... 13 II. Fényforrások...14 II.1. Pontfény... 14 II.2. Fényszóró... 15 II.3. Hengeres fény... 16 II.4. Szórtfény... 17 II.5. Fény homályosítása... 18 II.6. Árnyéknélküliség... 18 II.7. Fénycsoportok... 19 II.8. Párhuzamos fénynyalábok létrehozása... 19 II.9. Átvetített fény... 20 II.10. Testet körülvevő fény... 20 II.11. Egy tárgy kijelölése fényforrásnak... 21 III. Kameratípusok...22 III.1. Egyszerű kamera... 23 III.2. Halszem kamera... 23 III.3. Hengeres kamera... 24 III.4. Fókusz kamera... 25 III.5. Zavart kamera... 26 III.6. Ultra-széles látószögű kamera... 26 III.7. Omnimax kamera... 27 III.8. Panoráma kamera... 27 III.9. Perspektív kamera... 28 III.10. Ortografikus kamera... 28 2
III.11. Égbolt kamera... 29 III.12. Gömb kamera... 29 IV. Egyszerű testek...30 IV.1. A téglatest... 30 IV.2. A gömb... 31 IV.3. A kúp... 31 IV.4. A henger... 32 IV.5. A sík... 32 V. Műveletek...33 V.1. Unió... 33 V.2. Metszet... 34 V.3. Különbség... 34 VI. Geometriai transzformációk...35 VI.1. A tengelyes tükrözés... 35 VI.2. A középpontos tükrözés... 35 VI.3. Az eltolás... 36 VI.4. A nyújtás... 36 VI.5. Elforgatás... 37 VII. Görbék...38 VII.1. A görbevonal... 38 VII.2. A spirál... 39 VII.3. A csavarvonal... 39 VII.4. A csigavonal... 40 VII.5. Csigák... 41 VIII. Felületek...43 IX. Alkalmazás...45 X. Feladatok...46 XI. Megoldások...47 XII. Függelék...48 Irodalomjegyzék...50 3
I. Bevezetés Napjainkban egyre több filmben láthatunk számítógép segítségével elkészített vagy feljavított jeleneteket. Néhány évvel ezelőtt ez csak kisebb változtatásokat jelentett, viszont ma már egy új szereplő, egy épület vagy egy új jármű beillesztése a jelenetbe könnyen megvalósítható feladat. Persze nemcsak a hollywoodi filmek és a reklámfilmek egyes részei, hanem akár hírstúdiók teljes berendezései is ezzel a módszerrel készülnek. Olcsóbb és egyszerűbb háromdimenziós modellezéssel megjeleníteni a megfelelő elemeket, mint sok pénzért előállítani az elképzeléseket. Emellett vannak olyan alkalmazások is, amelyekben nem létező vagy egyéb korlátok miatt nem ábrázolható dolgokat jelenítenek meg. Például a rajzfilmek világa vagy akár egy tervezés alatt álló épület látványterve. Egyszóval a számítógépes háromdimenziós modellezésnek egyre fontosabb szerepe van manapság. Ilyen program például a POV-Ray nyílt forráskódú modellező is, mely a sugárkövetéses módszerre épül. Dolgozatomban bemutatom a program működését, a használatához alapokat és ötleteket adok, illetve egy kis bepillantást a POV-Ray világába. Olyanoknak szánom, akik érdeklődnek a háromdimenziós modellezés iránt, de nem használtak még ilyen programot. Munkám lépésről-lépésre halad, így könnyen követhető. Mivel minden alapot bemutatok, ezért kis időt szánva a gyakorlásra, tudásunk egyszerűen továbbfejleszthető és olyan magas szintű képeket is előállíthatunk, mint amilyeneket dolgozatom végében bemutatok. Itt szeretném megragadni az alkalmat, hogy megköszönjem Dr. Kovács Zoltán tanár úr közreműködő, segítő konzulens munkáját. 4
I.1. A sugárkövetés A háromdimenziós képelőállítás módszerei közül a sugárkövetés emelkedik ki a minőségével, profizmusával, és sajnos a számításigényével is. Ez a módszer a számítógépes grafika egyik legdinamikusabban fejlődő ágazata. Alapgondolata, hogy egy elképzelt tájat szeretnénk minél valósághűebben ábrázolni; azaz a fénysugárkövetés egy háromdimenziós képelőállítási technológia. A végső cél persze az, hogy a szemlélő ne tudja megkülönböztetni a számítógéppel létrehozott tájat a valóditól. Az általunk elképzelt tájat valamilyen módon jellemeznünk kell a számítógépnek, meg kell adnunk, hogy hol milyen testek vannak, milyen a színük és egyéb felületi tulajdonságaikat. Meg kell határoznunk a fényforrások elhelyezkedését is. I.2. A sugárkövetéses módszer működése Ha hagyományos módon közelítjük meg a valósághű képek előállítását, logikusnak tűnik a valódi látás szimulálása. A valódi világban a fény a fényforrásból indul, és megvilágítja a tárgyakat. A visszavert vagy áteresztett fényt látja meg a szemünk. Ezek szerint a fényforrásokból sugarakat bocsátunk ki, végigkövetjük az útvonalukat sok-sok fénytörésen és visszaverődésen keresztül. Ha a fénysugár kalandjai után eléri a kamerát, akkor hatással van az általunk látott képre, ellenkező esetben viszont nincs. Minél több fénysugár útját követjük végig, annál valósághűbb képét kapjuk a mesterségesen előállított világunknak. A probléma abból ered, hogy a fénysugarak döntő többsége nem éri el a kamerát, azaz a látott képbe sem szól bele. Következésképpen ezek kiszámítása miatt egy kép elkészítése a végtelenségig tartana, folyamatosan felesleges számításokat végeznénk. 5
Itt jön be a sugárkövetés. Kövessük csak azokat a sugarakat, amelyek biztosan elérik a kamerát! Ennek legegyszerűbb megvalósítási módja, hogy a kamerába érkező sugarakat visszafelé követjük és figyeljük, hogy milyen színű és felülettípusú objektumokon változtat irányt. Ez alapján a kép minden pontjához hozzá tudunk rendelni egy színt, melyek összességében felépítik a mi kis virtuális tájunkat. Természetesen egy elkészített kép annál élethűebb, minél több fizikai jelenséget veszünk figyelembe (fénytörés, tükröződés stb.) ( A sugárkövetés működése ) A felhasználó tehát berendezheti a teret, megadhatja a kamera, a fényforrások és a tárgyak helyét, ezek felszíni és belső (pl. átlátszóság) tulajdonságait, atmoszférikus hatásokat, mint például a köd, tűz stb., és még számos egyéb paramétert. Röviden a fénysugárkövetés nem más, mint egy módszer tárgyak vagy komplett jelenetek matematikai modellből realisztikus képpé alkotása. Mérnöki és művészi alkotások hozhatók így létre viszonylag kevés munkával, de annál inkább látványos eredménnyel. A matematikailag egyszerűbb, néhány geometriai egyenlettel jól leírható testek modellezése kevesebb fáradságot, képpé alakításuk kevesebb időt igényel. Gömbök, kockák létrehozása egyszerű, azonban egy valósághű emberi arc ( ráncokkal, realisztikus bőrrel, hibákkal stb. ) igen komoly problémákat vet fel. 6
Egy másik érdekes probléma, hogy mivel a fénysugárkövetés a matematikára épül, az előállított képek természetellenesen tiszták, hibátlanok lesznek. Minden fókuszban van, semmi sem koszos vagy elmosódott, az árnyékok metszően élesek és minden tárgy matematikai tökéletességű. Azonban ezeket a hatásokat is lehet korrigálni. E program profi felhasználói azok, akik képesek kevésbé tökéletes, a mindennapi életben látottakhoz hasonló képet előállítani. Mint például ez: A következőkben egy ilyen elven működő sugárkövetéses módszert ismerhetünk meg: a POV-Ray ( Persistence of Vision Raytracer ) ingyenesen elérhető programot. I.3. A POV-Ray A POV-Ray egy igen jó minőségű, ingyenes és nyílt forráskódú fénysugárkövető rendszer. Ezeknek a tulajdonságainak köszönhetően talán ez a legelterjedtebb módszer napjainkban. A program nem más, mint egy renderelő motor, kisebb kiegészítéssel. Ez annyit jelent, hogy kér egy bemeneti állományt, majd hosszabb-rövidebb számolás eredményeképpen kiad egy kimeneti fájlt. Egyszerűbben: a POV-Ray bemenete egy szöveges állomány, amely egy sosem létezett világot ír le, a kimenete pedig a látvány, ami ebben a világban a szemünk elé tárulna. A bemenő adathalmaz tehát egy fájl, amelyben a különböző tárgyakat, objektumokat definiáljuk a POV-Ray speciális leírónyelvén. Egy-egy tárgy leírása tartalmazza annak típusát (ami az alakját reprezentálja; ez lehet előredefiniált vagy általunk létrehozott bonyolultabb tárgy), és különböző tulajdonságokat: a színét, fényvisszaverő képességét stb. 7
I.4. A POV-Ray használata Legelső dolgunk a program letöltése, majd hogy egy kicsit jobban megismerkedjünk vele, és talán, hogy kedvet kapjunk, célszerű megtekinteni már egy általa elkészített képet. Töltsünk be egy egyszerű példát! (Mappa magnyitása) A betöltés után a Run mezőre kattintva renderelhetjük, azaz megnézhetjük a képet (a kép mérete a - sorok, oszlopok pixelszáma - a képernyő bal felső részén levő legördülő menüben állítható be, az ideális az 512 384). A program a képet egy renderelő ablakban állítja elő, amelynek felső sorában jelzi, hogy hány %-a kész a képnek. Alapértelmezésben a program a képeket.bmp kiterjesztésű fájlformátumban állítja elő, amelyeket az images mappában helyez el. Íme egy kép és forráskódja: Ha egy kicsit szemügyre vesszük közelebbről is a forráskódot, láthatjuk, hogy az alapvető objektumok meg vannak határozva a térben. 8
Ahhoz, hogy megértsük a tárgyak térbeli elhelyezkedését, meg kell ismerkednünk a program koordinátarendszerével. A térben való navigálásra háromdimenziós, ún. balkezes koordinátarendszert használunk. A három tengely ( x, y, z ) sorban a következőképpen áll: az x tengely jobbra, az y tengely felfelé, míg a z tengely hátrafelé, tehát a szemünktől a képernyő felé mutat. Ha a bal kezünket úgy tartjuk, hogy a kinyújtott hüvelykujjunk a kérdéses tengely irányába mutasson, a többi ujjunk által mutatott irány jelképezi a megfelelő tengely körüli forgatás pozitív irányát. Ha már ismerjük a program koordinátarendszerét, ismerkedjünk meg a szövegszerkesztő legfontosabb részeivel is. 9
I.5. A szövegszerkesztő részei A NEW gombbal hozhatunk létre mindig új projectet, azaz kapunk egy üres szövegszerkesztő ablakot. Mint már az előző példánál is láthattuk, a térben minden objektum definiálva van: azaz különböző parancsszavak segítségével helyezhetünk el gömböt, kockát vagy akár síkot a képzeletbeli képünkön. Minden képnek tartalmaznia kell néhány alapvető dolgot: egy fényforrást, egy kamerát és természetesen valamilyen formát vagy formákat. (A fényforrásokról illetve a kamerák típusairól a későbbiekben teszünk említést.) Első ránézésre bonyolultnak tűnik, de a POV-Ray-t létrehozó szakemberek mindenre gondoltak, hiszen bőséges szín, minta és standard építőelemadattárakat hoztak létre, amelyek könnyen elérhetőek. A beszúrás menü lehetővé teszi, hogy könnyen és gyorsan illesszünk be tárgyak komplett definícióit néhány kattintással. Ennek a menünek van egy speciális tulajdonsága, hogy amikor megnyitjuk, a program előre bemutatja a választható típusokat pici képeken. Például megnézhetjük, milyen speciális hatásokat tud létrehozni: többek között ködöt, szivárványt. Így könnyen alkothatunk egyszerű képeket, csak ügyesen kell megválasztanunk a koordinátákat. 10
A POV-Ray hátránya viszont az, hogy előre meg kell adnunk a térben az objektumok elhelyezkedését, viszont ennek eredményét csak a sokszor igen időigényes lefuttatást követően nézhetjük meg. Előfordul az is, hogy elgépeltünk egy betűt vagy éppen lemaradt egy zárójel, így a program nem képes megmutatni a képet, ameddig a hibát ki nem javítjuk. Ebben nagy segítség, hogy sárga mezőben jelöli meg azt a sort, ahol a hiba található, és a képernyő alsó sorában jelzi a hiba megszüntetésének módját. A megfelelő elem kiválasztása után // jel után olyan információkat is ad, amelyeket nem vesz figyelembe a kép készítésénél, de hasznos lehet számunkra. Például a kameráknál // jel után megadja, hogy a kamera látószöge mekkora értékeket vehet fel. I.6. Az include fájlok Ha kiválasztottuk a megfelelő tárgyat is, akkor mindenképpen adnunk kell neki valamilyen struktúrát is, azaz meg kell mutatnunk a felszíni tulajdonságait. A texture kijelentés határozza meg ezeket a paramétereket. Ebben benne van a tárgy színe (ez a minimum, amelyet meg kell adni), hepehupássága és felületi tulajdonságai. Az include fájlok előre elkészített tulajdonságok készletei, kiterjesztésük.inc. Ez annyit tesz, hogy ha beírjuk a megfelelő include fájlt a szövegünk elejére, akkor úgy működik, mintha a megfelelő definíciós részeket egy az egyben bemásoltuk volna a forráskódunkba. Ezzel meggyorsíthatjuk a munkánkat, hiszen hivatkozhatunk a fájl bármelyik tagjára. Például a colors.inc fájl 122-féle előre kikevert színt tartalmaz, és használatával nem kell a színkeveréssel fáradozni. Például, ha beírjuk a forráskódunk elejére az #include colors.inc sort, akkor elég a későbbiekben a szín nevét megemlítenünk - sötétolajzöld szín: pigment DarkOliveGreen. Vigyázni kell arra, hogy a neveket pontosan írjuk be, helyesen a kis- és nagybetűket, egyébként nem tud a program renderelni. A színválasztékot átnézhetjük a colors.pov mappában. Ha nem találunk megfelelő színt, akkor mi magunk is létrehozhatunk újakat. A POV-Ray a háromcsatornás RGB (vörös, zöld, kék) színteret alkalmazza, azaz ezen alapszínekből 0-tól 1-ig adott értékekből keverhetünk színeket. Például: rgb<0.5,1,0.12> azt jelenti, hogy a színt 0.5 vörös, 1 zöld és 0.12 kék alapszínekből keveri. Ha festenénk egy gömböt, akkor arra figyelnénk, hogy az árnyékos helyeken sötétebb tónust használjunk, míg a megvilágított helyeken világosabbakat. A POV-Ray ezt automatikusan végrehajtja, azaz nekünk csak ki kell választani a színt, és a program sötétíti vagy éppen világosítja a fénynek megfelelően. Ha több include fájlt akarunk használni, akkor 11
egyesével minden egyes használni kívánt include fájl nevét, külön sorba, egymás után be kell írni. A leggyakrabban használt fájlok: colors.inc, finish.inc, textures.inc, glass.inc, metals.inc, stones.inc és a woods.inc. Az #include finish.inc sor beírása után 8-féle különböző fényvisszaverődésű és tükröződésű felületre utalhatunk a neveikkel. Például: Mirror -tükrös felületet ad, vagy Luminous -élénk, fényes felületet ad stb. Az #include textures.inc utasítás esetén mintegy 80-féle, egymástól teljesen különböző, kész textúra közül választhatunk. Vannak itt kőmintázatok, például a márványszerű: White Marble, vagy hagyományos kőminta: például a PinkAlabaster. Választhatunk felhőfoltos borításuk közül - ilyen például a Blue Sky -, vagy esetleg famintázatokból (Wood1). Az üvegből készült tárgyak megrajzolására használhatjuk többek között a Glass2 textúrát. Aranyból készült tárgy esetén a Gold Metal, ezüstből készült tárgy esetén a Silver Metal textúrát lehet használni, de találhatunk itt csíkos mintázatokat is, ilyen például a Candy_cane, és léteznek villámcsapás mintázatokat, mint a Lightening1. A választék megtekintéséhez meg kell nyitni a File/Older Files mappában lévő texture1.pov, texture2.pov vagy texture3.pov fájlokat, és a RUN gombbal lefuttatni őket. Mindhárom fájl külön-külön 27 db objektumot tartalmaz, 3 sorban soronként 9 db, más-más textúrájú objektumot. A kódban egyértelműen látszik, hogy melyik tárgyhoz melyik textúra tartozik. Ha kiválasztottuk a mintázatot, csak a nevét kell megjegyeznünk, amellyel beszúrható a forrásfájlba. Például a texture2.pov megjelenése: 12
I.7. Egyéb include fájlok Ha nem találtunk megfelelő textúrát, akkor további fájlok állnak rendelkezésünkre: a glass.inc, a metals.inc és a woods.inc. A glass.inc fájlt üvegből készült tárgyak megrajzolásánál használhatjuk. 13-féle üveg textúra található a fájlban. A fémek nagyobb választékát a metals.inc fájlnál találhatjuk. Itt ötféle alapfém árnyalatai vannak: sárgaréz, vörösréz, króm, arany és ezüst. Fémenként 25 árnyalat textúráját, azaz 100 textúra van a fájlban. A woods.inc fafelületeket tartalmaz, melyeket szintén a lefuttatás után összességében megtekinthetünk. üveg textúrák az arany árnyalatai a vörösréz árnyalatai famintázatok 13
II. Fényforrások A fényforrás egy láthatatlan pici pont, mely fényt bocsát ki, nincs fizikai formája, ezért nincs felszíne sem. A munkánknak mindig tartalmaznia kell valamilyen fényforrást vagy fényt sugárzó egyéb testet, ellenkező esetben az általunk elkészített kép teljesen fekete lesz, vagyis nem látunk semmit. A POV-Ray többféle lámpát ismer, amelyet a light_source paranccsal építhetünk be. A legegyszerűbb esetekben a fényforrás helyét és színét kell megadnunk. Típusai: - pontfény - fényszóró - hengeres fény - szórt fény - fény homályosítása - árnyéknélküliség - fénycsoportok - párhuzamos fénynyalábok létrehozása - átvetített fény - testet körülvevő fény - egy tárgy kijelölése fényforrásnak II.1. Pontfény A pontfény az, amit a neve is mutat. Ez a legalapvetőbb fényforrás, nincs mérete, láthatatlan, és mindent egyenlően világít meg a képen, függetlenül attól, hogy milyen messze van a fényforrás. Csak két fontos paramétert tartalmaz: helyzetet és színt. #include"colors.inc" camera { location <0,1,-8> look_at <0,0,0> } background { color rgb <0,0.25,0.5> } light_source {<2,4,-3> color White } sphere { <0,1,2>,2.5 texture { pigment {color rgb <1,0.7,0.3> }} finish { specular.5}} plane { <0,1,0>,-3 pigment { color White }} 14
II.2. Fényszóró Ez egy nagyon hasznos fényforrás, ha ki akarunk emelni vagy meg akarunk világítani valamit. Egyszerűen csak a spotlight kulcsszót kell hozzáadni a pontfény definíciójához, viszont több paramétert tartalmaz. Ezek a sugár, a beesési szög és az élesség. A fényszóró kúp alakú fényt hoz létre, melynek van egy belső és külső kúpja. A belsőben a fény egynemű és világosabb, míg a külsőben sötétebb, és a két kúp közötti rész fokozatosan egy pontba csúcsosodik. A sugár megadja a kúp alakú fény méretét. A radius kulcsszó utáni érték egy fokban megadott szög, melyet a belső kúp alkotója zár be a középponti egyenessel. Pl: radius 10 = a fény a középegyenestől 10 -ban teljes erősségű. A beesési szög meghatározza a kúp alakú fény összméretét. A falloff kulcsszó utáni érték szintén egy fokban megadott szög, melyet a külső kúp széle zár be a középponti egyenessel. Pl: radius 10 falloff 20 = a fény a középegyenestől 10 -ban teljes erősségű, 10-20 -ban gyengébb, 20 - nál nagyobb szögben egyáltalán nincs fény. (A beeső szög mindig nagyobb vagy egyenlő, mint a sugár.) Ha a sugár és a beeső szög értéke közel van egymáshoz vagy egyenlők, akkor az erősség gyorsan változik, vagy a fényszórónak éles a széle. A tightness kulcsszó segítségével az éleket finomíthatjuk. Ha az értéke 0-tól eltérő, hatással van a külső és belső kúpra egyaránt. Alacsonyabb értékek a fényszórót fényessé teszik, a megvilágított foltot kiszélesítik, és élesebbé válnak a színek is. 15
Ezek az értékek 0-100-ig adhatóak. Ha misztikusabb képet szeretnénk, akkor több fényforrást is elhelyezhetünk, akár kék vagy piros fénnyel. #include"colors.inc" camera { location <0,1,-8> look_at <0,0,0> } background {color rgb <0,0.25,0.5> } light_source { <2,5,-3> color White spotlight radius 15 falloff 20 tightness 10 point_at <0,0,0> } sphere { <0,1,2>,2.5 texture { pigment { color rgb <1,0.7,0.3> }} finish { specular.5 }} plane { <0,1,0>,-3 pigment { color White }} II.3. Hengeres fény A pontfény kúp alakú, ami azt jelenti, hogy a hatása megváltozik a távolság csökkentésével, vagy növelésével. Minél messzebb van a fényforrás a tárgytól annál nagyobb sugárra van szükség. Ha viszont azt akarjuk, hogy a sugár és a beeső szög állandó legyen, függetlenül a távolságtól, akkor a hengeres fényforrásra van szükségünk. A cylinder kulcsszó olyan hengeres fényt hoz létre, mely lézersugarakat szimulál, így a kép sokkal tompább. Ugyanúgy működik, mint a pontfény, de a formája nem kúp, hanem henger alakú, hiszen a sugarak egy pontból indulnak, és nem párhuzamosak. A radius, falloff és tightness kulcsszavak ugyanúgy funkcionálnak itt, mint a fényszórónál. (Nagyobb sugár és beeső szög szükséges. Pl : radius 20, falloff 30) #include"colors.inc" background { color rgb <0,0.25,0.5> } camera { location <0,1,-8> look_at <0,0,0> } light_source { <2,4,-3> color White cylinder radius 15 falloff 20 tightness 10 point_at <0,0,0> } sphere { <0,1,2>,2.5 texture { pigment { color rgb <1,0.7,0.3> }} finish { specular.5 }} plane { <0,1,0>,-3 pigment { color White }} 16
II.4. Szórtfény Az előző fényforrások éles árnyékot eredményeznek. Ez azért van, mert maga a fényforrás egy végtelenül pici pont. A tárgyak vagy direkt fényben vannak, (azaz teljesen megvilágítva), vagy nem (azaz teljesen leárnyékoltak). Az életben ez a fajta teljes fény vagy árnyék csak az űrben létezik, ahol a Nap direkt fénye behatol az űr teljes feketeségébe. De itt a Földön a fény visszapattan a tárgyakról és a fényforrásnak is van mérete, kiterjedése, vagyis az árnyékok nem élesek többé. Az area_light kulcsszó egy olyan fényforrást hoz létre, amely téglalap alakú, és olyan, mint egy sík tábla. A szórt fénynek két tengelyen van kiterjedése, ezt jelöli az első két vektor. Ez a két vektor merőleges egymásra ill. meghatározzák a fény hosszát és irányát. Azt is meg kell adnunk, hogy hány fény legyen a sorban. Minél több van, annál finomabb az árnyék, viszont annál tovább tart a kép megjelenítése. Az egész számok megadják a sorok és oszlopok számát: a 3*3-as, vagy 5*5-ös elég. Az adaptive kulcsszó megmondja a programnak, hogy alkalmazkodjon a helyzethez és csak a szükséges fénysugarakat küldje el. Ha ez az érték nincs megadva, akkor sokfelé küld sugarakat, s ez teljesen lelassítja a kép megjelenítését. Értéke csak egész szám lehet, és nem lehet kevesebb, mint 0, viszont az 1 pont megfelelő. A jitter kulcsszóval az árnyékok finomíthatóak. #include"colors.inc" camera { location <0,1,-8> look_at<0,0,0> } background { color rgb <0,0.25,0.5> } light_source { <2,4,-3> color White area_light <5,0,0>,<0,0,5>,5,5 adaptive 1 jitter } sphere { <0,1,2>,2.5 texture { pigment { color rgb <1,0.7,0.3> }} finish { specular.5 }} plane { <0,1,0>,-3 pigment { color White }} 17
Ez egy fehér terület a (2,10,-3) pont körül, 5 egység x-en, 5 egység z-n, ami egy 25-ös négyzet. Két dolog vehető észre: a munkafolyamat sokkal tovább tart, mint a pontfény vagy a fényszóró esetében, viszont eltűntek az éles kontrasztok. II.5. Fény homályosítása Ha valósághű képet szeretnénk, egyáltalán nem az, ha a sík egyenletesen megvilágított, még a távolban is. A valóságban a fény szétszóródik, ahogy halad, ezért csökken a távolban lévő tárgyak megvilágításának képessége. Ha teljes megvilágítást szeretnénk, akkor a fade_distance kulcsszót kell használni, amellyel megadjuk a kívánt távolságot. A fade_power meghatározza a fénytompítás értékét. #include"colors.inc" camera { location <0,1,-8> look_at <0,0,0> } background{ color rgb <0,0.25,0.5> } light_source { <2,3,-3> color White fade_distance 2 fade_power 1 } sphere { <0,1,2>,2.5 texture{pigment{color rgb<1,0.7,0.3>}} finish { specular.5 }} plane { <0,1,0>,-3 pigment { color White }} II.6. Árnyéknélküliség A program képes arra, amire a valóságban nincs példa, azaz olyan háromdimenziós képet hoz létre, amelyen nincsenek árnyékok. Ez a shadowless kulcsszóval érhető el. #include"colors.inc" camera { location<0,1,-8> look_at<0,0,0> } background{ color rgb<0,0.25,0.5>} light_source {<2,4,-3> color White shadowless } sphere {<0,1,2>,2.5 texture {pigment {color rgb<1,0.7,0.3>}} finish { specular.5} } plane {<0,1,0>,-3 pigment { color White } } 18
II.7. Fénycsoportok A light_group parancs lehetővé teszi, hogy olyan fényeket alkossunk, amelyek csak a tárgyak egy részét világítják meg. Ez akkor fontos, ha a képen néhány tárgy sötétté válik az általános fény használatával. A light_group kulcsszóval olyan fényt hozhatunk létre, amely csak a megadott tárgyakat világítja meg. global_settings {assumed_gamma 1.0 } #include"colors.inc" camera {location <-2,1,-5> look_at <0,1,0>} plane { y,0 pigment {color White }} #declare S=sphere {<0,1,0>,1 texture {pigment {rgb <1,0.7,0.3> }} finish {specular.5 }} light_source {<5,5,-5> rgb<0,0,1>} #declare R_light=light_source{ <-5,5,-5> rgb<0.75,0.5,1>} #declare G_light=light_source{ <3,3,-3> rgb<0,1,0>} light_source { R_light } object {S} light_group { light_source { G_light } object { S scale 0.75 translate <0.3,0.5,-1> }} II.8. Párhuzamos fénynyalábok létrehozása Ez a fényforrás hasznos nagyon távoli fényforrások szimulálására, mint például a napfény. Mint a neve is mutatja, a fénysugarakat párhuzamosan bocsátja ki. A parallel kulcsszót bármely fényforrásnál használhatjuk. Ha finomítani szeretnénk az árnyékokat, használjuk a circular kulcsszót. Az orient parancsot hozzáadva a szórt fényhez, szintén finomabb árnyékot érhetünk el. #include"colors.inc" camera { location <0,1,-8> look_at <0,0,0> } background { color rgb <0,0.25,0.5> } light_source { <2,4,-3> color White parallel point_at <0,0,0> } sphere { <0,1,2>,2.5 texture { pigment { color rgb <1,0.7,0.3> }} finish { specular.5 }} plane { <0,1,0>,-3 pigment { color White }} 19
II.9. Átvetített fény Fényt keresztül vetíteni egy tárgyon úgy is el lehet képzelni, mint az árnyékképzés ellentett műveletét. Ekkor csak a keresztülvetített fénysugarak közreműködnek a képen, és bármely tárgy használható, ha azt előtte definiáltuk (#declare paranccsal). Így a kép sötét és csak az árnyék látszik, maga a tárgy nem. A projected_through kulcsszót bármely típusú fényforrással használhatjuk. #include"colors.inc" #declare Sphere=sphere { <0,1,2>,2.5 pigment { color rgb <1,1,1>}} camera { location <0,1,-8> look_at <0,0,0> } background { color rgb <0,0.25,0.5> } light_source { <2,4,-3> color White projected_through { object {Sphere}}} plane { <0,1,0>,-3 pigment { color White }} II.10. Testet körülvevő fény A fény, amelyet egy sötét szobában vagy félhomályban látunk, nem más, mint a tárgyakról visszatükröződő fény. Ez a szobában mindenütt megtalálható, visszapattan a tárgyakról, így egy kicsit megvilágítva azokat is, amelyek nincsenek közvetlenül megvilágítva. Ezt a típusú fényt nem lehet közvetlenül előállítani ebben a programban, bár szimulálására a körülvevő fény segítségével képes, azaz a tárgy felszínén egy pici fényt helyezünk el, akár megvilágított a test, akár nem, így úgy tűnik, mintha a tárgy ragyogna. Az ambient kulcsszóval adhatjuk meg a fény nagyságát, ami 0.0-1.0 ig terjedhet. #include"colors.inc" camera { location<0,1,-8> look_at<0,0,0>} background { color rgb<0,0.25,0.5>} light_source {<2,4,-3> color White} sphere {<0,1,2>,2.5 texture {pigment {color rgb<1,0.7,0.3>}} finish{ambient 0.5 specular.4 diffuse 0.6}} plane {<0,1,0>,-3 pigment {color White}} 20
II.11. Egy tárgy kijelölése fényforrásnak A fényforrás láthatatlan, csak egy hely, ahonnan a fény jön. Nincs mérete vagy formája. Ha azt szeretnénk, hogy maga a fényforrás láthatóvá váljon, akkor használjuk a look_like kulcsszót. Azt is megválaszthatjuk, hogy a forrás milyen tárgy legyen. Például villanykörte alakú vagy lámpaforma alakú. #include"colors.inc" #declare Lightbulb=union{merge{sphere{<0,1,0>,0.6 texture {pigment {color rgb<1,1,1>}}} cylinder {<0,2,1>,<0,2,0>,0.3 translate 0.5*z} texture {pigment {color rgb<1,1,1>} finish {ambient.8 diffuse.6}}}} camera { location <0,1,-8> look_at<0,0,0>} background {color rgb<0,0.25,0.5>} light_source {<0,2,0> color White spotlight radius 18 falloff 25 tightness 10 point_at<0,-5,2> looks_like { Lightbulb } } light_source {<0,3,-8> color White area_light <1,0,0>,<0,1,0>,2,2 adaptive 1 jitter} sphere{<0,-2,2>,2 texture {pigment {color rgb<1,0.7,0.3>}} finish {specular.2}} plane {<0,1,0>,-6 pigment{color White}} 21
III. Kameratípusok A kamera e virtuális világunkban a szemünket helyettesíti. Mindig szükség van egyre, amelyet a koordinátarendszerben szintén el kell helyezni. A POV-Ray-ben 12 különböző kamera van. A vetítés típusától függetlenül meg kell adni a kamera helyét (location), az x-tengely vektorát (right), az y-tengely vektorát (up) és annak a pontnak a koordinátáját, amelyre a kamera néz (look_at). A kamera képe ebben a pontban éles, attól közelebb és távolabb életlen, homályos. Ez a valóságban is így van, sőt a szemünk sem viselkedik másképpen. Típusai: - egyszerű kamera - halszem kamera - hengeres kamera - fókusz kamera - zavart kamera - ultra-széles látószögű kamera - Omnimax kamera - panoráma kamera - perspektív kamera - ortografikus kamera - égbolt kamera - gömb kamera ( A kamera elhelyezkedése ) 22
III.1. Egyszerű kamera Mint a neve is mutatja, ez a legegyszerűbb kameratípus, amelyhez csak két pont megadására van szükség. Az első pont a kamera pontos helyét határozza meg, a második pedig azt, hogy pontosan mi van a kamera látómezejének középpontjában. A parancs formája: camera { location <0,2,-3> look_at <0,1,2> } A fényforrásnál megadott példákban szintén egyszerű kamerákat használtunk. III.2. Halszem kamera Ez egy gömb alakú vetítés, a szöget az angle kulcsszóval adhatjuk meg. A 180 -os szög egy standard halszem, amíg a 360 -os pedig egy szuper halszem alakú, azaz látok mindent élményt hoz létre. Ha ezt a típust használjuk, akkor kör alakú képet kell terveznünk. 180 -os szöggel 360 -os szöggel camera { camera { fisheye fisheye location <0,1,-7> location <0,1,-5.5> look_at <0,1,0> look_at <0,1,0> angle 180 } angle 360 } 23
III.3. Hengeres kamera Ezt a vetítést használva a készített kép egy hengerbe kerül. Négy különböző típusú hengeres vetítés létezik a henger és a nézőpont helyzetétől függően. Az 1-4-ig vehető értékeket a cylinder kulcsszó után kell megadni. A látószög (angle) és az x, y tengely vektorai meghatározzák a kamera irányát és a látható képet. cylinder 1 : függőleges henger, fix nézőpont cylinder 2 : vízszintes henger, fix nézőpont cylinder 3 : függőleges henger, a nézőpont a henger tengelyén megy végig cylinder 4 : vízszintes henger, a nézőpont a henger tengelyén megy végig cylinder 1 cylinder 2 cylinder 3 cylinder 4 Cylinder 1: camera { cylinder 2 location <0,0,-8> right x*5 up y*2 look_at <1,1,0>} Cylinder 2: camera { cylinder 1 location <0,0,-8> right x*5 up y*2 look_at <1,1,0>} Cylinder 3: camera { cylinder 3 location <0,0,-14> right x*5 up y*2 look_at <1,1,0>} Cylinder 4: camera { cylinder 4 location <0,0,-15> right x*5 up y*2 look_at <-1,1,0>} 24
III.4. Fókusz kamera A következő képen szépen látszik, mit is jelent a fókusz kamera. Mindig szükségünk van egy fókuszpontra (focal_point), vagyis arra a pontra, ahol a kamera a legélesebb. Az aperture kulcsszó után kell megadni, hogy milyen közel vagy milyen távol akarjuk, hogy homályos legyen a kép. Az aperture (lencsenyílás) beállítást úgy is felfoghatjuk, mint a fókusz területét befolyásoló adatot. Ha kis értéket adunk meg, akkor a fókusz területe nagy, és fordítva. Ezzel tudjuk irányítani, hogy hol kezdődik a homályosítás a fókusz körül. A blur samples (folt minták) meghatározzák, hogy hány fénysugarat használ minden egyes képponthoz. Alapvetően minél több fénysugarat alkalmazunk, annál jobb minőségű képet tudunk létrehozni, de sokkal tovább is tart a kép megjelenítése a gép számára. Mivel minden kép különböző, ezért kísérleteznünk kell a fókuszponttal, a lencsenyílással és a homály beállításaival. camera { location<0.0,1.0,-10.0> look_at<0.0,1.0,0.0> focal_point<0,1,0> aperture 0.4 blur_samples 20} camera { location<0.0,1.0,-10.0> look_at<0.0,1.0,0.0> focal_point<1,1,-6> aperture 0.4 blur_samples 20} 25
III.5. Zavart kamera A normal kulcsszóval egy egyszerű kamera nagyon könnyen megbolondítható. Ez a parancs minden sugarat megzavar, így a kép úgy fog kinézni, mintha egy torzított vagy hepehupás üvegen, felületen lenne. Nagyon különleges hatásokat érhetünk el vele. A bumps kulcsszót elhelyezve a tárgyak felszínét hepehupássá teszi vagy a wrinkles pedig gyűrtté teszi a tárgyak széleit. Minél nagyobb értékeket adunk meg annál elvontabb képet készíthetünk. (Függelék: a) III.6. Ultra-széles látószögű kamera Ez a vetítés nagyon hasonló a halszem alakúhoz, de itt a kép egy négyszög alakú területre vetítődik kör alakú helyett. Az ultra-wide angle kulcsszó után adhatjuk meg a kívánt szöget - amely lehet akár több is, mint 360. A második képen egy 760 -os szögű vetítés látható, amely egy tapéta mintájára hasonlít. (Függelék: b) 26
III.7. Omnimax kamera Az Omnimax kamera egy 180 -os halszemes vetítés, amely csökkentett függőleges látószöggel rendelkezik. A valóságban ezt a vetítést használják olyan filmek létrehozásánál, amelyek Omnimax színház típusúak. A látvány inkább ellipszis alakú, és az angle kulcsszó nem használható. (Függelék: c) III.8. Panoráma kamera Mint a neve is mutatja, ez egy körkilátós kamera, amely megoldja azt a problémát, amikor a perspektív kamera látószöge eléri a 180 -ot. A panoramic kulcsszóval illeszthetjük be, és az angle kulcsszó után adhatjuk meg a szög nagyságát. (Függelék: d) 27
III.9. Perspektív kamera Mint a neve is mutatja, teljesíti a perspektíva szabályait, azaz ami távol van, kisebbnek és homályosabbnak látszik ahhoz képest, ami közelebb helyezkedik el. A másik fontos dolog, hogy a szemmagasságunk felett lévő dolgokra kisebb szöggel látunk rá, mint a szemmagasság alattiakra. A perspective kucsszóval készíthetünk ilyen (a valóságban szemeinkkel látott) képeket. (Függelék: e) III.10. Ortografikus kamera A perspektív kamerával ellentétben nem teljesíti az előbb leírtakat. Egy merőleges vetítést hajt végre, és minden tárgy akkorának tűnik, amekkora a méretei szerint, nincs torzítás. Például egy henger az ortografikus kamerával mindig téglalapnak látszik. Az orthographic kulcsszót használva érdekes képeket kaphatunk. (Függelék: f) 28
III.11. Égbolt kamera Az égbolt kamera egy speciális kamera, amely megforgatja a képet, már majdnem olyan, mintha a levegőben lebegne. A sky kulcsszó után megadott vektor a forgatás tengelye, jobbra vagy balra dől, majd pedig felfelé vagy lefelé, egyvonalban a megadott vektorral, amíg a point_at-be nem mutat. (Függelék: g) III.12. Gömb kamera Ez a vetítés nagyon hasonlít a halszemvetítéshez, viszont itt, mint a neve is mutatja, a kép egy gömbre van rávetítve. A spherical parancs után az angle kulcsszóval két szöget kell megadnunk: az egyik meghatározza a függőleges, a másik, pedig a vízszintes látószöget. (Természetesen mindkettő fokban értendő.) Ha a függőleges nincs megadva, akkor automatikusan a vízszintes felét veszi. (Függelék: h) 29
IV. Egyszerű testek Ha már van fényforrásunk és kameránk, szükségünk van valamilyen objektumra vagy objektumokra, amelyek a képünket alkotják. A legegyszerűbb testek: a téglatest, a gömb, a kúp, a henger és a sík, melyeket a POV-Ray könnyedén elkészít. IV.1. A téglatest Ez a leggyakrabban használt forma. Téglatesteket a box kulcsszó segítségével hozhatunk létre. Minden téglatest megalkotásához a két legtávolabbi csúcs koordinátáit kell megadni, és természetesen a külső jellemzőit. A téglatestek mindig a koordinátarendszerrel párhuzamosan függőleges és vízszintes élekkel jönnek létre. Ha ezen változtatni szeretnénk, akkor tetszőleges szöggel akár el is forgathatjuk (melyik tengely körül, hány fokkal rotate parancs). Íme egy téglalap és forráskódja: #include"colors.inc" #include"textures.inc" background { color LightWood } box {<-2,-1,0>,<2,1,3> texture{embwood1 scale.4} rotate y*40 finish{specular.4}} camera { location<1,2,-4> look_at <1,-1,2>} light_source {<2,4,-3> color White} Speciális téglatest a kocka. Például: #include"colors.inc" #include"textures.inc" background { color Flesh } box {<-1,-1,-1>,<1,1,1> texture{pigment{candy_cane scale.5}} rotate y*40 finish{specular.4}} camera { location<0,2,-4> look_at <0,-1,2>} light_source {<2,4,-3> color White} 30
IV.2. A gömb Gömb a sphere paranccsal hozható létre, és mindig meg kell határoznunk a gömb középpontjának koordinátáit, a gömb sugarát és azt, hogy milyen optikai szempontból. Lehet színe, áteresztheti vagy visszaverheti a fényt, vagy akár mintát is láthatunk rajta. Ha magasabb szintű képet szeretnénk, akkor rengeteg lehetőséget kínálnak az első részben már bemutatott include fájlok. Például: #include"colors.inc" #include"textures.inc" background { color Goldenrod } sphere { <0,1,2>,2.5 texture {pigment {Bright_Blue_Sky}} finish {specular.4}} camera { location<0,2,-6> look_at <0,1,2>} light_source {<2,4,-3> color White} Ez a gömb a <0,1,2> pontban van és sugara 2.5. IV.3. A kúp Kúpokat a cone parancssal hozhatunk létre. A kúp lehet akár csonka is. A meghatározásához a kúpot határoló két körlap középpontját és a sugarukat kell megadnunk. (Ezek a körlapok párhuzamosak és merőlegesek a kúp tengelyére.) Ha azt akarjuk, hogy egy pontban találkozzanak az alkotók, akkor a sugár értéke 0. Az open kulcsszót írva a második sugár után a kúp nyitottá válik. Például: #include"colors.inc" #include"textures.inc" background { color LightBlue} cone {<0,0,0>,3 <0,3,0>,1 open texture {pigment{color Gold}} finish{specular.5}} camera { location<0,6,-8> look_at <0,-1,2>} light_source {<2,4,-3> color White} 31
IV.4. A henger Hengert a cylinder parancssal készíthetünk. Meg kell adnunk az alapkör és a fedőkör középpontjának koordinátáit, illetve a sugarat. A hengerből cső készíthető, ha szintén az open kulcsszót használjuk. Például: #include"colors.inc" #include"textures.inc" background { color Gray60} cylinder {<0,-1,0>,<0,3,0>,3 open texture {pigment{color DarkTurquoise}} finish{specular.5}} camera { location<0,4,-10> look_at <0,0,2>} light_source {<2,4,-3> color White} IV.5. A sík A plane parancs segítségével végtelen síklapok készíthetőek, amelyek alkalmasak akár egy égbolt, akár egy asztallap ábrázolására. A síkok megadhatóak egy vektor és egy szám segítségével, ahol a vektor a síkra merőleges, a szám, pedig a síknak a koordinátarendszer középpontjától mért távolsága. A vektort mivel annak csak az iránya fontos számunkra egyetlen pont által megadható, ha feltételezzük, hogy helyvektor, azaz a másik végpont az origó. Például két sík között egy gömb: #include"colors.inc" #include"textures.inc" camera { location<0,2,-3> look_at<0,1,3>} light_source {<4,4,1> color White} plane {<0,1,0>,5 texture{shadow_clouds}} sphere {<0,-1.5,6>,3 texture{ pigment {color Yellow}} finish{specular.4}} plane {<0,1,0>,-1 texture {pigment{color VLightGray}}} 32
V. Műveletek Láthatjuk, hogy csak korlátozott számú és fajtájú testet ismer a program, azonban ezek felhasználásával bonyolultabb objektumokat is kialakíthatunk. Ennek módja a CSG (Constructive Solid Geometry, Konstruktív Tömörtest Geometria) alkalmazása lesz, amelynek során a már meglévő testekből hozhatunk létre a halmazműveletek segítségével komplexebb alakzatokat. Tehát használhatjuk az unió (union), a metszet (intersection) és a különbség (difference) műveleteket. A műveletek egymásba ágyazhatók, így tetszőlegesen bonyolult tárgyak hozhatók létre, eléggé sok munkával. V.1. Unió Ez a művelet két vagy több testet összead, egybeolvaszt. Például, ha két vagy több gömböt hozunk létre, amelyeknek közös pontjaik vannak, akkor azok egymásba hatolnak és egyetlen test érzetét keltik. Ha több testből álló átfedő alakzatot együtt szeretnénk használni, közösen forgatni, mozgatni stb., akkor az union parancs segítségével azokat össze kell kapcsolnunk. A union parancs után a kapcsos zárójeleken belül fel kell sorolnunk az összes testet, amelyeket együtt akarunk kezelni. union{sphere{<0,4,0>,1 translate -0.5*x} sphere{<0,4,0>,1 translate 0.5*x} pigment {Yellow} scale <1.25,0.15,2> rotate <15,0,5>}... Itt a közös részek nem láthatóak, hiszen a létrehozott testen belül találhatóak. 33
V.2. Metszet Lehetőség van arra is, hogy a közös pontokat tartsuk meg, vagyis a két test közös részéből egy új testet hozzunk létre. Erre az intersection parancs szolgál. Például itt van két gömb közös része. intersection{sphere{<0,1,0>,1 translate -0.5*x} sphere{<0,1,0>,1 translate 0.5*x} pigment {Yellow}}... V.3. Különbség Két testet úgy is egyesíthetünk egymással, hogy az egyiket csonkoljuk a másikkal. Erre a difference parancs szolgál, amely az első testet megrajzolja, de csak azon a részen, ahol a második test nincsen jelen. A difference esetében nem mindegy, hogy melyik testet írjuk előre s melyiket másodiknak, hiszen az első test a képen megjelenik, a második pedig nem. difference{sphere{<0,1,0>,1 translate -0.5*x} sphere{<0,1,0>,0.8 translate 0.5*x} pigment {Yellow}}} Kicsit zavaró lehet, hogy a modellezett testek üregesek, és amikor valamelyiket csonkoljuk, akkor belelátunk a belsejébe. Ez egy fedőlap készítésével megoldható. 34
VI. Geometriai transzformációk A már előbb említett műveleteken kívül képes a program geometriai transzformációkat is használni. Ezek: az eltolás, az elforgatás, a nyújtás, a tengelyes és középpontos tükrözés. Az eltolás, az elforgatás, a tengelyes és középpontos tükrözés esetén a test és kapott képének méretei megegyeznek, azaz egybevágóak. VI.1. A tengelyes tükrözés Ez nagyon egyszerű transzformáció, hiszen attól függően, hogy melyik tengelyre szeretnénk tükrözni, annak alapján kell megválasztani a koordinátákat, ezért nincs rá adott parancs. Akár mindhárom tengelyre nézve is hajthatunk végre tükrözéseket, mint például itt a képen, így mind a nyolc térnegyedbe került egy-egy gömb. VI.2. A középpontos tükrözés Erre sincs külön parancs, szintén a koordinátákat kell ügyesen megválasztani. A képen az egyforma színnel jelölt gömbök egymás origóra középpontos képei. 35
VI.3. Az eltolás A translate paranccsal hajthatunk végre eltolásokat, azaz a parancs után megadott pontba tolja el a program az adott objektumot vagy objektumokat. Ha ugyanazt a formát szeretnénk többször elmozgatni, akkor használjuk a declare parancsot, amelyben megadjuk a forma tulajdonságait és adunk neki egy nevet, így a későbbiekben csak a névvel hivatkozunk rá. Például:. #declare Ball=sphere{<0,0,0>,2.2 texture {pigment{color Green} finish{ ambient 0.25 diffuse 0.75 phong 1}}} #declare Ball1=sphere{<0,0,0>,2 texture {pigment{color Red} finish{ ambient 0.25 diffuse 0.75 phong 1}}} object { Ball translate<4,0,-4>} object { Ball translate<4,0,4>} object { Ball translate<4,0,12>} object { Ball translate<4,0,24>} object { Ball translate<4,0,36>} object { Ball1 translate<13,0,3>} object { Ball1 translate<13,4,3>} VI.4. A nyújtás Ez nem egybevágósági transzformáció, a méret megváltoztatására szolgál. Nyújthatunk vele, nagyíthatunk vagy akár kicsinyíthetünk is. A POV-Ray-ben ezt mindhárom tengely mentén megtehetjük a scale paranccsal. A parancs után megadott koordinátákkal növelhetjük vagy csökkenthetjük az objektum méretét. Például: scale < 1,1,1 > - nem hajt végre változást scale < 1,0.5,1 > - az y értéket felére csökkenti scale < 2,1,1> - kétszeresére növeli az x értéket scale < 1,1,0.2> - ötödére csökkenti a z értéket #declare Ball=sphere{<0,0,0>,1 texture {pigment{color Green} finish{ ambient 0.15 diffuse 0.85 phong 1}}} object { Ball scale <1,1,1> translate<0,0,0>} object { Ball scale <0.67,1,1> translate<0,0,-3>} object { Ball scale <0.33,1,1> translate<0,0,-6>} object { Ball scale <1,4.6,1> translate<-6,0,0>} object { Ball scale <1,2,1> translate<-3,0,0>} object { Ball scale <1,0.6,1> translate<3,0,0>} object { Ball scale <1,0.3,1> translate<6,0,0>} object { Ball scale <1.5,1,1> translate<0,0,5>} object { Ball scale <2.5,1,1> translate<0,0,10>} 36
VI.5. Elforgatás A rotate paranccsal tud forgatást végrehajtani a program. Az utána megadott koordináták mutatják, hogy melyik tengely körül hány fokkal szeretnénk elforgatni az adott tárgyat. Akár mindhárom tengely körül is megtehetjük. Például: rotate <30,90,45> - a tárgyat az x tengely körül 30 -kal, az y körül 90 -kal és a z körül 45 -kal forgatjuk. A pozitív forgatási irányok: #declare Smarty=sphere{<0,0,0>,1.5 scale <1,0.3,1> translate <6,0,0> texture {pigment{color Green} finish{ ambient 0.25 diffuse 0.75 phong 1}}} #declare Ring=union{ object { Smarty rotate<0,0,0>} object { Smarty rotate<0,30,0>} object { Smarty rotate<0,60,0>} object { Smarty rotate<0,90,0>} object { Smarty rotate<0,120,0>} object { Smarty rotate<0,150,0>} object { Smarty rotate<0,180,0>} object { Smarty rotate<0,210,0>} object { Smarty rotate<0,240,0>} object { Smarty rotate<0,270,0>} object { Smarty rotate<0,300,0>} object { Smarty rotate<0,330,0>}} object {Ring} Ezen transzformációk felhasználásával érdekes formákat hozhatunk létre. Például: 37
VII. Görbék VII.1. A görbevonal Görbéket nem egyszerű feladat létrehozni a POV-Ray programmal, hiszen csak az előbb már bemutatott egyszerű testeket ismeri, illetve az ezekből az unió, a metszet és a különbség műveletekkel létrehozható összetettebb formákat. Még is van egy módszer, amellyel ez a probléma kiküszöbölhető. Apró gömböket vezetünk végig a görbe mentén, hogy meg tudjuk jeleníteni. Az előző részben ha a megadott gömböket szorosan helyezzük egymás mellé eltolással, akkor egy egyszerű görbét (kört) kapunk, viszont ahhoz, hogy egyenletes legyen a felszíne, sok-sok gömbre van szükségünk, amelyeket nehéz egyesével megadni. Nagyon hosszú ideig tartana a koordináták kiválasztása. Ennek megoldására szolgál a következő parancssor: Megadjuk a gömb tulajdonságait egy választott névvel, hogy később csak hivatkoznunk kelljen rá (declare). Megadjuk a keresett kör sugarát (Radius), a kezdeti értéket (Nr) és a végső értéket (EndNr). Ez a gömbök darabszámát jelenti: minél nagyobb, annál több gömb alkotja a görbét, azaz annál egyenletesebb a görbe felülete. A while paranccsal adjuk meg a program feladatát, azaz amíg kisebb a vett érték a végső értéknél, addig forgassa el az x tengely körül a definiált gömböt. Tegye meg ezt minden rákövetkezővel! A feladat végét end paranccsal zárjuk. Például: #declare Ball=sphere{<0,0,0>,0.8 texture {pigment{color BrightGold} finish{ ambient 0.15 diffuse 0.85 phong 1}}} #declare Radius=3.00; #declare Nr=0; #declare EndNr=80; #while (Nr<EndNr) object {Ball translate < Radius,0,0> rotate <0,Nr*360/EndNr,0>} #declare Nr=Nr+1; #end Megforgathatjuk a definiált gömböt az x tengely, vagy akár a z tengely körül is. 38
VII.2. A spirál Ha az előző formát használjuk, és még a z tengely mentén is megforgatjuk egy időben, akkor egy spirálhoz jutunk. Itt az alkotó gömb definiálása után meg kell adnunk a nagy kör sugarát (R_major), a belső kör sugarát (R_minor), a nagy kört alkotó hurkok számát (N_major) és a spirált alkotó gömbök számát (N_minor). Szintén a while parancs után a program feladata, hogy eltolja és megforgassa az előre definiált gömböt. #declare Ball=sphere{<0,0,0>,0.25 texture {pigment{color BrightGold} finish{ ambient 0.15 diffuse 0.85 phong 1}}} #declare R_major=3; #declare R_minor=1; #declare N_major=10; #declare N_minor=400; #declare Nr=0; #declare EndNr=N_major*N_minor; #while (Nr<EndNr) object {Ball translate < R_minor,0,0> rotate <0,0,Nr*360/N_minor> translate < R_major,0,0> rotate < 0,Nr*360/EndNr,0>} #declare Nr=Nr+1; #end VII.3. A csavarvonal Ha a gömbök elforgatásait egymásra helyezzük és valamelyik tengely mentén eltoljuk, akkor egy csavarvonalat kapunk. Az alkotó gömb definiálása után meg kell adnunk a csavarvonal sugarát (Radius), azt, hogy hány csavarból álljon maga a vonal (N_rev), a gömbök számát egy csavaron belül (N_p_rev) és azt, hogy ezek a csavarok milyen távol legyenek egymáshoz képest. Például: #declare Ball=sphere{<0,0,0>,0.25 texture {pigment{color BrightGold} finish{ ambient 0.15 diffuse 0.85 phong 1}}} #declare Radius=3; #declare N_rev=4; #declare N_p_rev=50; #declare H_p_rev=0.7; #declare H=H_p_rev/N_p_rev; #declare Nr=0; #declare EndNr=N_rev*N_p_rev; #while (Nr<EndNr) object {Ball translate < Radius,Nr*H,0> rotate <0,Nr*360/N_p_rev,0>} #declare Nr=Nr+1 #end 39
Ha növeljük a gömbök számát, akkor egyenletes felületet kapunk. #declare N_p_rev=2000; VII.4. A csigavonal Ha ez előző csavarvonalat az origóból indítjuk és a forgatásokat egymás mellé helyezzük, akkor jutunk a csigavonalhoz. #declare Ball=sphere{<0,0,0>,0.40 texture {pigment{color BrightGold} finish{ ambient 0.15 diffuse 0.85 phong 1}}} #declare Radius=0; #declare N_rev=4; #declare N_p_rev=500; #declare D_p_rev=1; #declare D=D_p_rev/N_p_rev; #declare Nr=0; #declare EndNr=N_rev*N_p_rev; #while (Nr<EndNr) object {Ball translate < Radius+Nr*D,0,0> rotate <0,Nr*360/N_p_rev,0>} #declare Nr=Nr+1; #end A csigavonalat nem csak gömbök alkothatják. Például: #declare Ball=sphere{<0,0,0>,0.45 scale <0.7,1.5,1> texture {pigment{color BrightGold} finish{ ambient 0.15 diffuse 0.85 phong 1}}} #declare Radius=0; #declare N_rev=4; #declare N_p_rev=500; #declare D_p_rev=1.4; #declare D=D_ p_rev/n_p_rev; #declare Nr=0; #declare EndNr=N_ rev*n_p_rev; #while (Nr<EndNr) object {Ball rotate < 0,0,Nr*3.5> translate < Radius+Nr*D,0,0> rotate <0,Nr*360/N_p_rev,0>} #declare Nr=Nr+1; #end 40
VII.5. Csigák Az előző példákban az alkotó gömbök mind ugyanolyan méretűek voltak. Most nézzük meg, hogyan lehet folyamatosan csökkenteni a gömbök méretét, a sugarat és a csavarok távolságát. Az alkotó gömb definiálása után meg kell adni az alap sugarát (Radius), a körök számát (NR), egy kört alkotó gömbök számát (NpR), a körök közötti távolságot (HpR) és a körök méretének csökkenő értékét (Scale). #declare Ball=sphere{<0,0,0>,0.5 scale <0.7,1.5,1> texture {pigment{color BrightGold} finish{ ambient 0.15 diffuse 0.85 phong 1}}} #declare Radius=3; #declare NR=9; #declare NpR=100; #declare Scale=0.75; #declare HpR=1; #local Hd=HpR/NpR; #local Scale_p=pow(Scale,1/360); #local Scale_pE=pow(Scale_p,360/NpR); #local Old_S=Scale_pE; #local Old_H=Hd; #declare Nr=0; #declare EndNr=NR*NpR; #while (Nr<EndNr) object {Ball translate < Radius,0,0> scale Old_S translate<0,old_h,0> rotate <0,Nr*360/NpR,0>} #declare Nr=Nr+1; #declare Old_S=Scale_pE*Old_S; #declare Old_H=Old_H+Hd*Old_S; #end Ha a magasságot nullára csökkentjük, akkor egy kapjuk. ammonitesz klasszikus formáját # declare Radius=3.5; #declare NR=15; #declare NpR=50; #declare Scale=0.75; #declare HpR=0; 41
Ha ezeket az objektumokat valamilyen élethű textúrával látjuk el, akkor nagyon valóságos csigákat vagyunk képesek létrehozni. #declare Ball=sphere{<0,0,0>,0.7 scale <1,1.5,1> texture {T_Stone3 scale 1.5} finish{ ambient 0. 15 diffuse 0.85 phong 1}} #declare Radius=1.5; #declare NR=10; #declare NpR=30; #declare Scale=0.78; #declare HpR=1.6; #declare Ball=sphere{<0,0,0>,1 texture {Rusty_Iron} finish{ ambient 0.15 diffuse 0.85 phong 1}} #declare Radius=3; #declare NR=9; #declare NpR=50; #declare Scale=0.79; #declare HpR=1; #declare Ball=sphere{<0,0,0>,1 texture {Sandalwood} finish{ ambient 0.15 diffuse 0.85 phong 1}} #declare Radius=3.5; #declare NR=15; #declare NpR=50; #declare Scale=0.755; #declare HpR=0; 42