Hlavní navigace

Vykreslujeme 3D scény s POV-Ray

26. 2. 2008
Doba čtení: 13 minut

Sdílet

Dnes začíná na Root.cz nový seriál o programu POV-Ray, který slouží k vykreslování trojrozměrných scén v té nejvyšší kvalitě. Postupně si vysvětlíme všechny možnosti POV-Raye, včetně tvorby animací a propojení s modelovacími programy. Můžete se těšit na dokonalou grafiku a spoustu ukázkových obrázků.

Obsah

1. Úvodní informace o programu POV-Ray
2. Podporované platformy
3. Co značí termíny „raytracing“ a „raycasting“?
4. Podpůrné nástroje pro POV-Ray aneb co budeme k práci potřebovat
5. Tvoříme první prostorovou scénu
6. Spuštění raytraceru a vytvoření výsledného obrázku
7. Literatura a zajímavé odkazy na Internetu
8. Obsah následující části tohoto seriálu

1. Úvodní informace o programu POV-Ray

Program POV-Ray spadá do kategorie takzvaných raytracerů, což jsou aplikace určené pro vykreslování trojrozměrných scén s důrazem na co nejvyšší kvalitu výsledku. V souvislosti s raytracery se někdy hovoří i o fotorealis­tické grafice, což je však poněkud zavádějící, protože s pomocí raytracingu lze vytvářet i obrázky zcela nesouvisející s realitou (což je ostatně mnohem zajímavější a snad i přínosnější, než se stále dokola snažit v počítači vymodelovat reálný svět).

POV-Ray je pro mnoho uživatelů poněkud zvláštní tím, že vlastně neobsahuje žádný interaktivní editor či modelář pomocí kterého by se trojrozměrné scény mohly jednoduše vytvářet. Celá scéna je popsána v textovém souboru poměrně jednoduchým, ale přitom expresivním jazykem, který syntakticky připomíná Céčko nebo Javu. Takto popsanou scénu POV-Ray přečte, provede vykreslení (rendering) a výsledek uloží ve formě rastrového obrázku o předem zadaném rozlišení.

Pokud budete mít dostatek trpělivosti nebo rychlý procesor, je možné s pomocí POV-Raye například vytvářet obrázky o rozlišeních a barevných hloubkách, které několikanásobně převyšují možnosti grafické karty instalované v počítači (ve skutečnosti vlastně vůbec grafickou kartu pro běh tohoto programu nepotřebujeme). Podstatou své práce a vlastně i celkovou filozofií se POV-Ray blíží například TeXu – i tento program je totiž určen pro produkci co nejkvalitnějších výsledků (absolutní přesnost souřadnic atd.) a také pracuje dávkovým způsobem, tj. načte předem vytvořený dokument a po zpracování uloží výsledek v předem očekávaném formátu bez použití grafického uživatelského rozhraní. Podobné je to i s „trvanlivostí“ použitých scén: i dnes je totiž v POV-Rayi možné zpracovat scény vytvořené před více než deseti lety, což je při rychlosti vývoje počítačové grafiky docela úspěch.

povray0101

I takové „vychytávky“ jako polostíny, je možné v současných raytracerech vykreslit

Pokud jste se nyní zalekli, že pro používání POV-Raye je nutné se naučit nějaký specializovaný jazyk a program ovládat magickými přepínači zadávanými z příkazové řádky, můžu vás poněkud uklidnit – dnes existuje poměrně velké množství podpůrných nástrojů, včetně specializovaných editorů (KPovModeler, Moray) nebo pluginů do takových slavných programů jako je Blender. Pro plné ovládnutí POV-Raye a využití všech jeho možností se však naučení jeho jazyka nevyhneme, i proto ostatně vznikl tento seriál.

Pro mnoho uživatelů je důležitá i licence, pod kterou je POV-Ray dodávaný. Jedná se o vlastní licenci, kterou si lze přečíst buď na domovských stránkách tohoto programu, nebo je uložena v souboru povlegal.doc. V jednoduchosti je možné říci, že vývojový tým dává programátorům i uživatelům velkou volnost při zacházení s programem i jeho zdrojovým kódem (ten je mimochodem velmi poučný a srozumitelný), požaduje však, aby na světě existoval pouze jeden standardní POV-Ray dodávaný jako celek, což je celkem pochopitelná filozofie zabraňující tomu, aby program získal špatnou pověst jen tím, že někdo bude distribuovat například pouze spustitelný soubor s raytracerem bez dokumentace nebo dalších pomocných souborů.

povray0102

Hra se světlem procházejícím mříží

2. Podporované platformy

Raytracer POV-Ray se mimo jiné značně rozšířil i díky tomu, že je ho možné provozovat na širokém spektru různých počítačových systémů, což ostatně vychází i z toho, že se jedná o program, který pro svoji činnost nevyžaduje ani grafické uživatelské rozhraní ani žádný specializovaný hardware typu grafického akcelerátoru. První verze, které ještě byly napsány v čistém céčku, byly dostupné především pro Amigy (jak jinak tomu ostatně mohlo u graficky orientovaného programu být?), PC s DOSem a procesorem 386 či vyšším (na 286kách jsem musel použít poněkud chudší raytracer Vivid), Macintoshe (i pro ty s procesory Motorola 680×0) a také pro prakticky všechny unixové systémy.

povray0103

Testovací scéna vykreslená ještě v době DOSu na počítači s procesorem 486

Nejnovější verzi raytraceru je možné provozovat na Linuxu, systémech Microsoft Windows (od Windows 95 a Windows NT), všech novějších Macintoshích a prakticky všech unixových systémech, které obsahují překladač jazyka C++ a základní knihovny – nemusí být ani dostupné žádné grafické prostředí, což je ideální pro tvorbu „renderovacích farem“, tj. mnoha počítačů spojených do sítě, které pouze provádí výpočty a výsledky své práce, tj. vykreslené scény posílají do řídicího počítače ve formě rastrového obrázku (známá je například renderovací farma použitá při tvorbě filmu Titanic).

povray0104

Toto opravdu není fotka, ale scéna vykreslená v POV-Rayi

3. Co značí termíny „raytracing“ a „raycasting“?

Raycasting neboli vrhání paprsků je často užívanou metodou pro vykreslení prostorových scén v případě, kdy nemáme k dispozici hardwarový akcelerátor nebo je scéna složená z těles, která se složitě převádí na polygony (může se jednat o implicitní plochy, uložení objemu ve formě voxelů atd.). Nejčastěji se můžeme s raycastingem setkat v různých programech typu CAD, které důsledně využívají CSG (Constructive Solid Geometry), neboli konstruktivní geometrii těles, což je způsob vytváření složitějších těles pomocí jednoduchých základních trojrozměrných tvarů (typicky koule, kužele, válce, toroidu a roviny/polopros­toru), které jsou navzájem kombinovány pomocí operací sjednocení, průniku a rozdílu. S CSG se poměrně detailně seznámíme v dalších částech tohoto seriálu.

Princip metody raycastingu je poměrně jednoduchý: představme si pozorovatele, který stojí před stínítkem představovaným plochou (rastrového) displeje, za kterým je umístěna celá sledovaná scéna, včetně světelných zdrojů. Jakým způsobem je možné scénu vykreslit tak, aby se zobrazila na stínítku ve formě různě obarvených pixelů? Způsobů je samozřejmě více, ovšem raycasting je postavený na jednoduché myšlence. Z pozice pozorovatele budeme do scény vysílat pomyslné paprsky a zjišťovat, která tělesa tyto paprsky protnou.

Pokud nebudeme brát v úvahu průhlednost těles, bude nás zajímat ten průsečík, který se nachází nejblíže k pozorovateli, protože ostatní průsečíky nejsou z jeho pozice viditelné (jsou skryté dalšími tělesy). Kolik paprsků se však má vysílat a jakým směrem? Základním principem je vyslat jeden paprsek pro každý pixel displeje, čímž je automaticky určen i jeho směr. Ovšem jsou možné i jiné způsoby, kterými se nyní nebudeme zabývat, abychom se nevěnovali nyní nepodstatným detailům.

povray0105

Termín „fotorealistická grafika“ nevznikl náhodou…

Po výpočtu průsečíku paprsku s nejbližším povrchem je ještě nutné provést výpočet světelných poměrů v místě průsečíku. Vytvoří se tedy další pomyslné paprsky, které směřují k jednotlivým světelným zdrojům a zjišťuje se odchylka těchto paprsků od normálového vektoru popř. od odraženého paprsku (tvorba odlesků – „prasátek“). Také se zjišťuje, zda jsou vůbec světelné zdroje z daného místa viditelné, čímž se ve vykreslované scéně automaticky vytváří stíny. Může samozřejmě nastat situace, že primární paprsek neprotne žádné těleso – v tomto případě je příslušný pixel obarven nastavenou barvou pozadí.

Ukažme si na jednoduchém příkladu, jak výpočet průsečíku probíhá. Předpokládejme, že se ve scéně nachází jedna koule popsaná rovnicí:
(x-x0)2+(y-y0)2+(z-z0)2-r2=0
kde [x0, y0, z0] je souřadnice středu koule a r je její poloměr.

Výpočet průsečíku paprsku s koulí je poměrně snadný, což mimochodem výrazně urychlí všechny výpočty a tím i dobu zobrazování scény (proto byly obrázky s koulemi při prezentaci možností raytracingu velmi často používány). Pro zjištění, zda paprsek protíná kouli je potřeba zjistit přesnou pozici průsečíku paprsku s jejím povrchem. V rovnici paprsku:

R(t)=A+tq

musíme pro zadané hodnoty A (pozice pozorovatele) a q (směr paprsku) zjistit hodnotu parametru t. Bude-li hodnota kladná, je povrch viditelný (před kamerou/pozoro­vatelem). Bude-li hodnota záporná, je povrch neviditelný (za kamerou). Přesnou hodnotu parametru t zjistíme dosazením rovnice paprsku do rovnice popisující kouli. Ve skutečnosti se může stát, že nám vyjdou dvě hodnoty t, popř. jedna hodnota (dvojitý kořen) či rovnice nebude mít reálné kořeny. To je v pořádku, neboť to odpovídá možným vzájemným postavením paprsku a koule:
  1. dva kořeny – paprsek kouli protíná, samozřejmě ve dvou místech
  2. jeden kořen – paprsek se koule pouze dotkl, tj. je tečný k povrchu
  3. žádný reálný kořen – paprsek kouli zcela minul

Velkým problémem zůstává potažení koule či jiného obecného tvaru texturou. Pro běžná tělesa se používá promítání textury z vhodně zvoleného tělesa. U koule není zcela zřejmé, které promítací těleso se má použít. Kvůli topologicky „nekompatibilním“ tvaru povrchu koule s tvarem plošné textury je však zřejmé, že textura bude nanesena s velkou chybou, především na vzniklých „pólech“. Tento problém nastává pouze u dvoudimenzi­onálních textur nanášených na povrch tělesa. U třídimenzio­nálních textur tento problém není zřetelný, což je jeden z důvodů, proč se v POV-Rayi často pracuje s třídimenzio­nálními procedurálními texturami.

povray0106

Odlesky na kovu a skleněné povrchy byly vždy doménou raytracerů

Raytracing, neboli zpětné sledování paprsku vznikl jednoduchým a přitom z hlediska vizuálních výsledků významným rozšířením předchozí metody. Sledování paprsku vrhaného od pozorovatele do scény totiž nekončí už po nalezení průsečíku s nejbližším tělesem, ale pokračuje sledováním dalších paprsků, odvozených podle odrazivosti a průhlednosti (přesněji řečeno lomových vlastností) nalezeného tělesa. Na barvě tělesa se tedy podílejí světelné příspěvky vypočtené s pomocí obecně většího počtu paprsků.

První test průsečíku (primárního) paprsku s plochou tělesa je proveden stejným způsobem jako u raycastingu. Jediný rozdíl spočívá v tom, že je po výpočtu průsečíku spočítán odraz a lom paprsku na povrchu tělesa a výpočet probíhá rekurzivně s dále vzniklými paprsky, které se nazývají sekundární paprsky. Hloubka rekurze musí být omezena, aby výpočet skončil v konečném čase. Pro reálné scény většinou postačí volit tři až čtyři odrazy. Už při této hloubce rekurze lze docílit fotorealistického zobrazení celé scény.

Při výpočtu světelných poměrů na povrchu tělesa potřebujeme znát orientaci normálového vektoru v místě průsečíku paprsku s povrchem. Problém potažení povrchu texturou je stejně složitý jako v metodě vrhání paprsku.

4. Podpůrné nástroje pro POV-Ray aneb co budeme k práci potřebovat

Pro POV-Ray existuje mnoho nástrojů, které mohou ulehčit práci při modelování scény nebo návrhu textur. Mezi nejpovedenější programy patří Moray a KPovModeler, který, jak již jeho název napovídá, je určen pro prostředí KDE. Také je možné použít například Blender nebo 3D Studio, pro které existuje převodní utilita.

povray0107

Prostředí programu Moray

Nejlepších výsledků však dosáhneme při přímém zápisu scény do textového souboru. Že se nejedná o nic těžkého, se přesvědčíme v dalších odstavcích a především v navazujících částech seriálu. Co tedy budeme skutečně potřebovat? Především dobrý textový editor, který by měl podporovat zvýraznění syntaxe pro POV-Ray. To je případ Vimu nebo Emacsu, ovšem je možné použít prakticky jakýkoli editor, masochisté například Notepad.

povray0108

Prostředí programu KPovModeler

Uživatelé systému Microsoft Windows mohou využít editor (či spíše celé IDE) dodávané přímo k POV-Rayi. Při provozování na Windows 98 má sice nějaké mušky, ale na vyšších verzích Windows již funguje bez chyby. Ovládání je jednoduché – vytvoří se nový soubor, zapíše se celá scéna, vybere rozlišení a posléze se stlačí klávesová zkratka Alt+G nebo příslušná ikona. Druhým vyžadovaným programem je samotný POV-Ray a třetím prakticky libovolný prohlížeč obrázků.

povray0109

Prostředí dodávané s POV-Rayem pro Windows

5. Tvoříme první prostorovou scénu

Pro získání základního přehledu o tom, jakým způsobem je prostorová scéna popsána, si ukážeme poměrně jednoduchý demonstrační příklad. Jedná se o scénu obsahující jeden uzavřený objekt (toroid, anuloid) pokrytý texturou se dvěma vrstvami, dvojici světelných zdrojů a kameru (pozorovatele). Prozatím není zapotřebí přesně pochopit, co jednotlivé příkazy znamenají (jsou ostatně okomentovány), vše si do podrobností vysvětlíme v dalších dílech seriálu.

// ------------------------------------------------------------
// Jednoduchá scéna s uzavřeným objektem, dvojicí světel
// a jednou kamerou (pozorovatelem)
//
// Založeno na souboru původně vytvořeném Danem Farmerem (leden 2002)
//
// rendering lze spustit příkazem: povray +W800 +H600 +B100 +FN +D +Iscena1.pov +Oscena1.png
// (pro náhled postačí zadat povray scena1.pov)
// ------------------------------------------------------------

// globální nastavení parametrů scény
global_settings {
    assumed_gamma 2.2
}

// nastavení kamery (pozorovatele)
camera {
    location  <0, 20, -15>               // pozice kamery
    look_at   <0, -2,   0>               // bod, na který kamera směřuje
}

// první (silnější) světelný zdroj s bílou barvou
light_source {
    <-50, 100, -80>                      // pozice světelného zdroje
    color rgb 1                          // barva světla (všech tří složek)
}

// druhý (slabší) světelný zdroj
light_source {
    <250, 25, -100>                      // pozice světelného zdroje
    color red 0.85 green 0.53 blue 0.10  // barva světla
}

// jediný objekt ve scéně: torus (anuloid)
torus {
    7.0, 4.0                             // geometrické informace
                                         // (poloměry celého toroidu a "trubky")

    // spodní (podkladová) textura se základním vzorkem
    texture {
        pigment {                        // definice vzorku textury
           bozo                          // typ vzorku
           color_map {                   // dvě barvy, které se na vzorku střídají
            [0.0 0.4  color red 0.36 green 0.20 blue 0.09  color red 0.36 green 0.20 blue 0.09 ]
            [0.4 1.01 color red 0.858824 green 0.576471 blue 0.439216 color red 0.858824 green 0.576471 blue 0.439216]
            }
            scale <4, 0.15, 0.15>        // změna měřítka (velikosti) namapovaného vzorku
            rotate 45*y
        }
    }

    // horní textura, která přidává jemnější vzorek
    texture {
        finish {                         // vlastnosti materiálu
            phong 1                      // intenzita a
            phong_size 100               // velikost odlesků
            brilliance 3                 // míra změny odlesků s úhlem dopadu světelných paprsků
            ambient 0.2                  // ambientní složka (pro simulaci všesměrového světla)
            diffuse 0.8                  // difúzní složka (pro simulaci směrového světla)
        }
        pigment {                        // definice vzorku textury
            wood                         // typ vzorku
            turbulence 0.025
            color_map {                  // čtyři barvy, které se ve vzorku střídají
                [0.00 0.15 color red 0.42 green 0.26 blue 0.15 color red 0.85 green 0.53 blue 0.10 ]
                [0.15 0.40 color red 0.85 green 0.53 blue 0.10 color rgbf 1 ]
                [0.40 0.80 color rgbf 1  color red 0.85 green 0.53 blue 0.10 ]
                [0.80 1.01 color red 0.85 green 0.53 blue 0.10 color red 0.42 green 0.26 blue 0.15 ]
            }
            scale <3.5, 1, 1>            // změna měřítka a natočení vzorku
            translate -50*y
            rotate 1.5*z
        }
    }
}



// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 

6. Spuštění raytraceru a vytvoření výsledného obrázku

Scénu máme uloženou v souboru scena1.pov, nyní tedy před námi stojí ten nejdůležitější úkol – provést její vykreslení neboli rendering. Výsledkem bude obrázek uložený v některém podporovaném výstupním grafickém formátu. V předchozích verzích programu POV-Ray se jednalo o formát Targa (jde o soubory s koncovkou .tga, viz též samostatný článek), dnes je nejčastějším výstupním formátem PNG, taktéž popsaný v samostatném článku či BMP. Formát JPEG doporučuji používat s rozmyslem, protože při komprimaci bude docházet k poškození ostrých hran a ani komprimační poměr nemusí být u uměle vytvářených obrázků příznivý. V dalších částech tohoto seriálu se touto problematikou a způsoby řešení ještě budeme podrobněji zabývat.

V současnosti POV-Ray dokáže na téměř všech podporovaných platformách při renderingu vykreslovat už hotovou část obrázku současně i na obrazovku, což se hodí zejména při tvorbě náhledových obrázků. Při paralelním renderingu na více počítačích (například bez připojeného monitoru) nebo dlouhotrvajících tvorbách animací je samozřejmě možné toto vykreslování zcela vypnout. Takže naším prvním cílem bude vytvoření rastrového obrázku s případným vykreslením tohoto obrázku i do okna v grafickém uživatelském rozhraní. Z příkazové řádky je nutné zadat následující příkaz (předpokládám, že soubor scena1.pov je uložen v pracovním adresáři):

povray +W800 +H600 +B100 +FN +D +Iscena1.pov +Oscena1.png 

Význam jednotlivých parametrů:

Parametr Význam parametru
+W800 šířka výsledného obrázku uvedená v pixelech
+H600 výška výsledného obrázku uvedená v pixelech
+B100 velikost bufferu použitého při zápisu části obrázku na disk
+FN volba formátu výsledného souboru
+D povolení výstupu do samostatného grafického okna
+Iscena1.pov název souboru, ve kterém je zapsána vstupní scéna
+Oscena1.png název výsledného obrázku

Parametrů je možné zadat mnohem více, ty nejčastěji používané lze dokonce uložit do samostatných konfiguračních souborů. Nám však pro začátek budou stačit parametry uvedené v předchozí tabulce.

povray0110

Výsledná scéna získaná raytracingem

7. Literatura a zajímavé odkazy na Internetu

Princip raycastingu a raytracingu je popsán v téměř každé knize, která se zabývá principy počítačové grafiky. Z česky psané literatury jsou to zejména publikace J. Žáry, B. Beneše a jejich spoluautorů. Dále se jedná o knihu Computer Graphics – Principles and Practise, která je téměř povinnou četbou zájemců o počítačovou grafiku a lze ji sehnat v mnoha fakultních knihovnách.

  1. Foley J., Dam van A., Feiner S., Hughes J.: Computer Graphics – Principles and Practice (Second Edition)
    Addison-Wesley, Reading, Massachusetts, 1990, ISBN 0–201–12110–7
  2. Žára J., Beneš B., Felkel P.: Moderní počítačová grafika
    Computer Press, Praha, 1998, ISBN 80–7226–049–9
  3. Žára J., Limpouch A., Beneš B., Werner T.: Počítačová grafika – principy a algoritmy
    Grada, Praha, 1992, ISBN 80–85623–00–5
  4. The POV-Ray Cyclopedia:
    http://www.spi­ritone.com/~en­glish/cyclope­dia/index.html
  5. POV-Ray New Ring:
    http://webrin­g.povray.org/
  6. Animations with POV-Ray:
    http://www.f-lohmueller.de/pov_tut/­animate/pov_a­nie.htm
  7. The POV-Ray Objects Collection:
    http://objects­.povworld.org/
  8. POV-Ray Texture Library 4.0:
    http://texlib­.povray.org/
  9. The Official Moray Homepage: A Wireframe Modeller for POV-Ray 3.x:
    http://www.stmuc­.com/moray/
  10. KPovModeler:
    http://www.kpov­modeler.org/
  11. Spilin editor:
    http://www.flashnet­.it/users/fn027571/s­pil/main.html
povray0111

Několikanásobné odrazy a lomy světla nepředstavují pro raytracery vůbec žádný problém

root_podpora

8. Obsah následující části tohoto seriálu

Ve druhé části seriálu o raytraceru POV-Ray se ještě budeme věnovat spíše teorii, nežli praktickým ukázkám. Řekneme si, jakým způsobem je možné v počítačové grafice reprezentovat prostorová tělesa a které z těchto reprezentací je možné v POV-Rayi přímo využít. Pokud jste doposud pracovali s některými jednoduššími 3D editory nebo i programy typu CAD, budete možná příjemně překvapeni, co všechno POV-Ray dokáže.

Byl pro vás článek přínosný?

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.