Obsah
1. Popis prostorových objektů v počítačové grafice a POV-Rayi
2. Základní způsoby reprezentace prostorových těles
3. Hraniční reprezentace těles
4. Objemová reprezentace
5. Popis povrchů těles pomocí polygonů
6. Parametrická reprezentace
7. Přímkové plochy a šablonování
8. Rotační šablonování
9. Obsah další části seriálu
1. Popis prostorových objektů v počítačové grafice a POV-Ray
Mnoho objektů zpracovávaných a zobrazovaných v počítačové grafice (například právě za pomoci POV-Raye) má charakter trojrozměrného tělesa, tedy útvaru, který zaujímá určitý objem v prostoru. V tomto smyslu můžeme na tělesa používaná v počítačové grafice nahlížet také jako na množinu geometrických bodů ležících v trojrozměrném prostoru, které splňují určitá kritéria. Pokud například nadefinujeme relaci sousednosti bodů v trojrozměrném prostoru, lze za trojrozměrné těleso považovat sjednocení dvou navzájem disjunktních množin, tedy množiny vnitřních bodů a množiny hraničních bodů (podobný princip lze samozřejmě uplatnit i pro dvourozměrnou plochu).
Různými způsoby reprezentace tělesa se snažíme více či méně efektivně popsat buď množinu vnitřních bodů (objemová reprezentace) nebo množinu hraničních bodů (hraniční reprezentace). Při zadávání souřadnic bodů (včetně koncových bodů vektorů, vrcholů polygonů apod.) v trojrozměrném prostoru můžeme použít pravotočivý nebo levotočivý souřadný systém. V dalším textu budeme beze ztráty obecnosti uvažovat levotočivý souřadný systém, protože právě ten je použit v programu POV-Ray (což je pro mnoho uživatelů včetně mě docela zvláštní, protože většina programů používá pravotočivý souřadný systém – změna souřadného systému je však poměrně jednoduchá).
Levotočivý souřadný systém použitý v POV-Rayi
Pod pojmem reprezentace objektů chápeme matematický model objektů (těles) uložený v paměti počítače nebo v externím souboru. V počítačové grafice se pracuje s modely trojrozměrných těles, které lze reprezentovat mnoha různými způsoby. Při výběru vhodného způsobu reprezentace těles v reálných aplikacích jsme ovlivněni celou řadou různých faktorů, například způsobem vytváření či získávání geometrických a topologických informací o tělesech, charakterem použitých algoritmů, výpočetními a paměťovými nároky, morfologickou a topologickou složitostí těles, programovou a technickou podporou při vykreslování a návazností na další aplikace (datovou kompatibilitou) atd. V neposlední řadě musíme brát v úvahu i možnosti, rychlost a kvalitu vykreslování modelu tělesa uloženého v dané reprezentaci – to se samozřejmě týká i POV-Raye, který při vykreslování používá metodu raytracingu.
Existují i kombinované způsoby popisu scény, v nichž se současně využívá objektů uložených v různých reprezentacích. Jednou z motivací pro použití kombinovaných modelů je využití výhod obou (nebo více) reprezentací v jedné scéně. Na druhé straně může vést použití kombinovaného popisu k neefektivitám při optimalizaci vyhodnocování scény. Z kombinovaných reprezentací se nejčastěji používá analytický popis objemu tělesa v kombinaci s hraniční reprezentací těles rovinnými ploškami či parametrickými plochami (v POV-Rayi je tato kombinace poměrně často využívána), ale existují i další alternativy. Další možností je kombinace parametrického modelu těles s částicovými systémy. Tato kombinace se používá například v pokročilejších aplikacích virtuální reality, ve kterých jsou pevná tělesa ve scéně vykreslena pomocí parametricky zadaných objektů a částicové systémy se používají pro zobrazení různých přírodních fenoménů, například ohně, kouře nebo deště.
Pravotočivý souřadný systém použitý v mnoha dalších aplikacích
Další možností často používanou v praxi je převod dat o tělesech mezi různými reprezentacemi. Tato možnost (někdy nutnost) vychází z rozdílných požadavků na strukturu dat v různých částech procesu zpracování. Při získávání dat lze například využít několika typů 3D scannerů, které produkují data buď ve formě množiny samostatných prostorových bodů, výškového pole (height-field) nebo trojúhelníkové sítě (triangular network). Dalším zdrojem dat mohou být zařízení typu CT (Computer Tomography – počítačová tomografie) nebo MR (Magnetic Resonance – magnetická rezonance), jejichž výstupem je soustava rovinných řezů tělesem.
Pro další zpracování lze využít CAD programů pracujících s analytickým popisem scény (většinou s CSG reprezentací a/nebo NURBS plochami) a pro výsledné vykreslení se často využívá reprezentace tělesa množinou plošných polygonů, neboť ty lze přímo vykreslit s využitím existujícího technického vybavení – grafických akcelerátorů. Pokud se pro vykreslení použije POV-Ray, není nutné převod na plošné polygony provádět, neboť by to bylo kontraproduktivní – POV-Ray totiž dokáže přímo pracovat s CSG, rotačními plochami a mnoha dalšími parametrickými plochami.
Vykreslení této scény na Amize 500 ve standardním rozlišení by trvalo přes 40 hodin!
2. Základní způsoby reprezentace prostorových těles
Mezi tři základní způsoby reprezentace prostorových těles patří:
- Hraniční reprezentace – těleso je popsáno svým povrchem, který může mít kromě geometrických vlastností zadané například i optické vlastnosti povrchu (barva, průhlednost, odrazivost, index lomu, textura apod.). V POV-Rayi se tato reprezentace používá především pro vykreslení objektů vyexportovaných z jiných aplikací, například 3D editorů, protože ruční tvorba těchto objektů není snadná.
- Objemová reprezentace – těleso je popsáno svým objemem, tj. výčtem těch částí prostoru, které tvoří hmotu (vnitřek) tělesa. Podobně jako u hraniční reprezentace, i u této reprezentace je možné kromě vlastní informace o obsazeném prostoru zadávat další informace vztahující se k vnitřní oblasti tělesa, například průhlednost nebo barvu jednotlivých částí prostoru. V POV-Rayi je podporováno především CSG a následně i implicitní plochy. Tyto možnosti reprezentace prostorových těles budou podrobně popsány v následující části tohoto seriálu, protože tvoří velmi důležitou součást POV-Raye a raytracerů vůbec.
- Procedurální reprezentace – těleso není přímo zadáno geometrickými daty, jako v předchozích dvou reprezentacích, ale algoritmem, který umožní vypočítat povrch tělesa, objem tělesa nebo další (i statistické) informace o tělese. Mezi dva nejpoužívanější způsoby procedurální reprezentace patří použití fraktálů a částicových systémů. V POV-Rayi není možné tento způsob (kromě jedné, zato však poměrně důležité výjimky) plnohodnotně použít. Z tohoto důvodu si necháme podrobnější popis procedurální reprezentace do některého z dalších částí tohoto seriálu.
Pomocí takzvaného dopředného sledování paprsku lze i v POV-Rayi dosáhnout efektu lomu světla na krystalu
3. Hraniční reprezentace těles
Hraniční reprezentace těles (Boundary representation, zkráceně též B-rep.) patří v současné době k nejpoužívanějším způsobům pro popis těles v počítačové grafice. Mezi hlavní důvody vedoucí k používaní hraniční reprezentace patří poměrně jednoduché datové struktury využívané pro popis geometrie tělesa, přímočaré a rychlé zobrazení s využitím široce používaných 3D API (programových rozhraní pro aplikace, mezi které patří zejména OpenGL, Direct3D, GKS), podpora ze strany CAD/CAM systémů a poměrně velká nezávislost na měřítku zobrazení (zejména v porovnání s rastrovou objemovou reprezentací). Také existují rozsáhlé programové knihovny umožňující práci s hierarchicky uspořádanou scénou, ve kterých jsou využity různé metody pro rozdělení a zpracování prostorové scény, například KD-stromy, BSP-stromy, portály nebo hierarchické mřížky.
Mezi další přednosti této reprezentace patří skutečnost, že dnes již existují různá zařízení umožňující získávání trojrozměrných dat o reálných tělesech. Mezi tato zařízení patří i výše uvedené optické 3D skenery, které mohou po základním zpracování získaných dat vygenerovat pravidelnou či nepravidelnou trojúhelníkovou síť (TIN) představující povrch snímaného tělesa.
Použitím metod reprezentace těles ve scéně pomocí popisu jejich hranice musíme vyřešit netriviální otázku, jakým způsobem se bude povrch těles (ten chápeme jako hranici mezi tělesem a volným prostorem či jiných tělesem) popisovat a jak se budou definovat optické vlastnosti těles.
Mezi obvyklé způsoby popisu těles, které jsou v POV-Rayi podporovány, patří rozložení celého povrchu na rovinné plošky (polygony, viz odstavec Polygonální reprezentace), parametrické plochy (viz odstavec Parametrická reprezentace) či použití přímkových ploch (viz odstavec Přímkové plochy a šablonování). Dalším, poměrně novým způsobem, je popis povrchu pomocí elementárních orientovaných rovinných plošek – takzvaných surfelů. Ten však prozatím není v POV-Rayi implementován.
Tato reprezentace se často vzhledem ke své jednoduchosti využívá v mnoha typech aplikací, například CAD systémech, počítačových hrách a aplikacích virtuální reality. Při zpracování dat popisujících prostorová tělesa však mohou při použití této reprezentace nastat určité problémy vycházející z faktu, že v hraniční reprezentaci není vždy jednoduché či možné rozhodnout, která část prostoru leží uvnitř tělesa a která vně; dokonce je možné vytvořit „zborcené“ těleso, které nemůže v reálném světě existovat.
U hraniční reprezentace nejčastěji vycházíme z předpokladu, že plošky (což jsou obvykle trojúhelníky nebo plošné polygony) či pláty tvoří uzavřená tělesa. Při porušení tohoto předpokladu (například vlivem chyby při editaci tělesa) může docházet k různým anomáliím při editaci tvaru tělesa nebo při následném vykreslování (renderingu).
Kromě toho je u těles popsaných mnoha pláty potenciální nebezpečí vzniku děr (holes) na místech, kde se mají jednotlivé pláty napojovat. Tyto díry vznikají buď vlivem nedovoleného propojení plátů (takzvané T-spoje) nebo vlivem zaokrouhlovacích chyb při výpočtech souřadnic vrcholů plátů, kdy může nastat situace, že se hranice sousedních plátů přestanou dotýkat nebo se naopak vzájemně protínají. U těles popsaných parametrickými plochami je navíc zapotřebí řešit plynulé navazování jednotlivých plátů na sebe, jinak by nemusela být zaručena požadovaná spojitost povrchu modelovaného tělesa. Řešení tohoto problému je v případě POV-Raye ponecháno na uživateli popř. na použitém modelovacím programu.
Jeden ze symbolů 3D graficky – čajová konvice z Utahu – vykreslená v POV-Rayi a reprezentovaná parametrickými plochami
4. Objemová reprezentace
Popis těles objemem je metodou kvalitativně (a mnohdy i kvantitativně) zcela odlišnou od hraniční reprezentace. Při použití této metody neexistují, na rozdíl od hraniční reprezentace, problémy při rozhodování, zda daný bod v prostoru leží uvnitř či vně tělesa. U popisu těles objemem navíc úplně odpadají potíže při vyhodnocování průchodu světla průhlednými objekty ve scéně. Při analytickém popisu (což je jedna z variant objemového popisu těles) se také snadno zjišťuje normálový vektor k povrchu tělesa v každém bodě povrchu, která je v mnoha algoritmech potřebná pro výpočet osvětlení, viditelnosti či pro různé simulace.
Objemová reprezentace pomocí objemových elementů (voxelů) je využívána především v souvislosti s metodami pro získávání trojrozměrných dat o tělesech, především CT a MR. Zařízení CT a MR produkují trojrozměrná data ve formě rovinných řezů tělesem, které lze přímočarým způsobem převést na objemové elementy. Problémem však zůstává vytváření a následná editace složitějších těles a scén. Jedním z možných řešení tohoto problému je použití CSG modelu, který je v POV-Rayi i dalších raytracerech velmi oblíbený. Další způsob spočívá ve využití implicitních ploch (blobs, metaballs), kterým se budeme podrobněji věnovat v dalších částech tohoto seriálu, jelikož se jedná o velmi silnou modelovací techniku.
Tento model jsem vytvořil z implicitních ploch (blobs, metaballs), čtyř toroidů a tří válců
5. Popis povrchů těles pomocí polygonů
Základním způsobem popisu hranice těles je polygonální reprezentace, tj. popis povrchu pomocí sady polygonů. Jednou z největších výhod polygonální reprezentace je skutečnost, že algoritmy pro zobrazování konvexních plošných polygonů resp. pouze trojúhelníků vedou k použití několika lineárních interpolátorů, které je poměrně snadné programově a především technicky realizovat. To je také důvod, proč většina dnes používaných grafických akcelerátorů podporuje vykreslování těles reprezentovaných polygony.
Polygonální reprezentace nachází své uplatnění v časově kritických nebo real-time aplikacích, jako je například virtuální realita, počítačové hry, trojrozměrné internetové aplikace a některé CAD systémy (to jsme si ostatně řekli v předchozích kapitolách). Poměrně rychlé jsou i výpočty průsečíku paprsku s trojúhelníkem, a proto se někdy v metodě sledování paprsku (jednoduchý raycasting popř. jeho rekurzivní verze raytracing implementovaný v POV-Rayi) místo výpočtu průsečíku paprsku se složitým objektem tento objekt převádí do polygonální reprezentace a výpočty průsečíků se provádějí s trojúhelníky popř. s mnohoúhelníky.
Samotná polygonální reprezentace není příliš vhodná pro modelování, protože poskytuje velmi málo informací o struktuře celého tělesa a cílená modifikace geometrie modelu (kromě lokálních změn) je poměrně složitá. Z tohoto důvodu používají modelovací programy v čase editace reprezentaci odlišnou, například NURBS plochy, implicitní plochy či základní tělesa s CSG operacemi. Pro výstup z modelovacího programu jsou však data konvertována buď na jednotlivé trojúhelníky nebo na sítě trojúhelníků (TIN), u kterých využíváme totožných vrcholů u několika trojúhelníků – i tyto entity POV-Ray obsahuje.
Jako příklad můžeme uvést trojrozměrné modely používané ve virtuální realitě. Tyto modely jsou většinou vytvářeny pomocí modelářů pracujících s NURBS plochami nebo CSG reprezentací, přičemž síť trojúhelníků je z nich vygenerována až při ukončení editace a exportu dat trojrozměrné scény. Výhoda tohoto přístupu spočívá v tom, že výstupní trojúhelníková síť může být vygenerována ve více variantách lišících se svou složitostí a tedy i množstvím detailů (LOD – level of detail).
Mezi nevýhody polygonální reprezentace patří paměťová náročnost, zejména u zaoblených modelů nebo modelů s velkou úrovní detailu, kdy může být pro popis tělesa zapotřebí značného množství trojúhelníků. Další nevýhodou je složité mapování textur a dále vznik takzvaného geometrického aliasu, kdy se při velké změně měřítka mohou objevit díry nebo přesahy v tělese vzniklé numerickou chybou při počítání poloh vrcholů tělesa. POV-Ray však obsahuje techniky, které do značné míry dokážou těmto chybám předejít.
Utah teapot podruhé, nyní v polygonální reprezentaci (jeho povrch je popsán sítí trojúhelníků)
6. Parametrická reprezentace
Při vyjádření hranice tělesa pomocí parametrické reprezentace je povrch tělesa rozdělen na elementární části povrchu nazývané pláty či záplaty. Výsledná plocha (povrch) tělesa se získá navázáním těchto plátů na sebe. Každý z plátů je přitom vyjádřen bodovou rovnicí. V počítačové grafice se nejčastěji používají bodové rovnice, které jako své bázové funkce obsahují polynomy nízkého stupně, protože tyto jsou snadno diferencovatelné a lze provádět rychlé výpočty hodnot těchto funkcí pomocí Hornerova schématu, kde jsou použity pouze jednoduché a rychlé operace sčítání a násobení.
V POV-Rayi je možné přímo používat i Bézierovy bikubické plochy
Pro účely počítačové grafiky i dalších (například fyzikálních či estetických) požadavků je důležité zaručit spojitost napojení dvojice plátů. Rozlišujeme dva druhy spojitosti – parametrickou C a geometrickou G spojitost. Dva pláty mají napojení C0, mají-li společnou hranu, která je křivkou třídy alespoň C0 (parametrická křivka Q(t) je třídy Cn, má-li ve všech svých bodech spojité derivace do řádu n. Označení Cn se nazývá parametrická spojitost křivky).
Dva pláty mají spojité napojení C1, pokud mají společnou jednu stranu a mají-li shodné parciální derivace ve všech bodech společné strany prvního i druhého plátu. Dva pláty mají spojité napojení G1, mají-li společnou hranu, která je křivkou spojitosti alespoň G1 (pro zaručení geometrické spojitosti G1 je zapotřebí zachovat alespoň spojitou změnu tečen, nikoli celých tečných vektorů, jak je tomu u spojitosti C1) a jsou-li parciální derivace podél této strany ve směru napojení lineárně závislé s koeficientem k>0, který se spojitě mění podél této společné strany.
V současnosti se v počítačové grafice používá několik typů parametrických ploch, které se liší jak svými geometrickými vlastnostmi, tak i implementační, výpočetní a paměťovou náročností. POV-Ray umožňuje přímo použít Bézierovy bikubické pláty, které se intuitivně modelují a jsou snadno diferencovatelné. Mezi jejich další výhody patří jednoduchý a rychlý výpočet bodů na ploše. Bézierovy plochy však neumožňují přesně modelovat povrch základních kvadrik (koule, elipsoid, válec a kužel), nelze vytvořit offsetovou plochu (offsetová plocha je plocha kopírující v určité vzdálenosti svou tvořicí plochu; příkladem může být objekt vytvořený z plechu, kde plech by se modeloval právě pomocí dvojice offsetových ploch) a nejsou invariantní vůči perspektivnímu promítání.
Také podmínky pro hladké navázání jednotlivých plátů mohou být v některých případech poněkud omezující (mimo jiné z tohoto důvodu se jako nejjednodušší plochy pro modelování používají Bézierovy bikubické pláty stupně 3), protože bikvadratické Bézierovy pláty stupně 2 neposkytují dostatečný „stupeň volnosti“ při modelování). Proto se Bézierovy plochy používají v jednodušších modelovacích systémech, popřípadě v systémech virtuální reality pro vykreslování těles s využitím LOD (Level Of Detail). V POV-Rayi lze při specifikaci Bézierova plátu určit i přesnost výpočtu a nepřímo tím ovlivnit LOD.
Studie různých typů procedurálních textur napodobujících dřevo
7. Přímkové plochy a šablonování
Při reprezentaci tělesa pomocí přímkových ploch je povrch tělesa (podobně jako při reprezentaci tělesa pomocí parametrických ploch) rozdělen na jednotlivé pláty, jejichž spojením vzniká povrch výsledného tělesa. Tyto pláty jsou potom představovány přímkovými plochami, což jsou plochy, které se v jednom ze směrů skládají z úseček. Příkladem takovéto plochy může být například válcová plocha, hranol, krychle apod. Existují dva základní způsoby, jak získat přímkovou plochu:
- První způsob spočívá ve vytažení základního tvaru (takzvané profilové křivky) ve směru řídicího vektoru z nenulové délky. Již zmiňovaná válcová plocha může být vytvořena právě tímto způsobem, kdy základním tvarem je kružnice a řídicí vektor je kolmý na rovinu, kde tato kružnice leží. Profilová křivka může být buď uzavřená nebo otevřená.
- Druhý způsob spočívá v propojení dvou okrajů přímkové plochy, přičemž okraje mohou být reprezentovány libovolnou křivkou. Pokud jsou například okraje přímkové plochy zadány dvěma kružnicemi s rozdílným poloměrem, které neleží ve stejné rovině, vznikne jejich propojením přímková plocha ve tvaru komolého kužele.
Model ryby složený z různých typů objektů vykreslený v POV-Rayi
V obou případech je možno tyto operace chápat jako translační šablonování po úsečce. V prvním případě jde o šablonování s profilovou křivkou, která nemění svůj tvar. V druhém případě profilová křivka svůj tvar mění. Kombinace a rozšíření obou přístupů, tedy translační šablonování po obecné křivce s měnící se profilovou křivkou se nazývá potahování (skinning).
Translačním šablonováním obecné křivky (základního tvaru) po úsečce získáme přímkovou plochu. V některých dnešních CAD systémech, kde jsou přímkové plochy využívány, se jako základní tvar (profilová křivka) používají buď parametrické křivky (Bézierovy kubické křivky, B-splajny nebo NURBS křivky) nebo kuželosečky (kružnice, elipsa, kruhový oblouk). Posunutím kružnice lze vytvořit válcovou plochu, posunem úsečky obdélník nebo kosodélník, posunem čtverce hranol atp. Výsledná plocha tedy má neměnný profil v řezu kolmém na trajektorii.
Jiným typem šablonování je posun měnícího se profilu po úsečce. Přímková plocha (ruled surface), kterou tímto postupem získáme, je určena dvěma stranami, vznikne tedy spojením dvou křivek Q0(t) a Q1(t) úsečkami resp. ploškami (t je parametr křivek). Obě křivky musí být buď současně uzavřené nebo současně otevřené. Také je důležitá vzájemná orientace křivek (směr růstu parametru t) v prostoru.
Rozšířené přímkové plochy vytvořené v POV-Rayi
Mezi hlavní výhody použití přímkových ploch pro reprezentaci těles patří především jednoduchost a názornost při zadávání jednotlivých plátů, protože v tomto případě uživatel může navrhovat profil křivky v jednoduchém 2D editoru a teprve poté se provede vygenerování celého plátu (v POV-Rayi lze jako profilovou křivku použít buď lomenou čáru nebo spline křivku). Další výhodou je jednoduchý a rychlý převod těchto ploch na polygonální nebo trojúhelníkovou síť s možností následného vykreslení využívajícího podpory grafických akcelerátorů.
Určitou nevýhodou této reprezentace je obtížné vytváření složitěji tvarovaných těles, kdy není vždy jednoduché najít vhodné křivky, pomocí kterých by se vytvořily pláty vymezující část tělesa. Proto se reprezentace těles pomocí přímkových ploch používá současně s dalšími typy reprezentace, typicky s parametrickými plochami, které byly popsány v předchozí části (příkladem takového systému je například známý CAD program AutoCAD firmy AutoDesk).
Příklad těles vytvořených pomocí rotačního šablonování (SOR)
8. Rotační šablonování
Další možností tvorby těles je rotační šablonování, které se používá v mnoha CAD/CAM systémech pro tvorbu rotačních těles – SOR – Surfaces Of Revolution. Rotační tělesa se modelují tak, že se zvolí profilová křivka (která může být buď uzavřená nebo otevřená) a osa rotace. Profilová křivka je potom orotována okolo zvolené osy rotace. Tímto způsobem lze vytvořit jak osově souměrné kvadriky, tak i složitější tělesa nebo jejich části (toroidy, vázy, svícny apod.).
Rotační šablonování je v POV-Rayi samozřejmě plně podporováno – je možné například rotovat spline křivku nebo lomenou čáru (polyčáru) a vytvořit tak různé vázy či složitější rotační předměty. Konkrétně se jedná o objekt nazvaný lathe, který si v dalších částech seriálu podrobněji popíšeme. Pro složitější úpravy je možné použít například specializovaný editor (modelovací program) Spillin.
Lom světelných paprsků na tělese vytvořeném pomocí rotačního šablonování (SOR)
9. Obsah další části seriálu
V následující části tohoto seriálu si popíšeme způsob vytváření scén v POV-Rayi, včetně použití konstruktivní geometrie těles (CSG). Uvidíme, že se scény sice musejí popisovat formátem, který se podobá programovacímu jazyku (například Céčku nebo Javě), ve skutečnosti je však samotný zápis poměrně jednoduchý a snadno pochopitelný. Také si ukážeme několik demonstračních příkladů.