# Základy 3D grafiky

## 3D grafika

- princip
	- objekty modelovány ne 3D
	- výsledek převedený na 2D
- oba procesy mohou být úzce provázány
	- např. počítačové hry (XNA, DirectX, OpenGL)
- oba procesy mohou být oddělené
	- příprava 3D dat provedena v prvním nástroji
	- zobrazení na 2D provedeno druhým nástrojem
	- např. filmový průmysl
+ typické užití
	+ počítačové hry a filmový průmysl
	+ augmented reality
	+ vizualizace terénu (např. Google Earth)
	+ vizualizace strojírenských součástek
	+ vizualizace architektonických budov
	+ vizualizace medicínských dat
	+ ...

### Programování 3D aplikací

- různé přístupy dle výsledné aplikace

**1. přístup**
- programuji pouze rozhraní mezi modelovací a zobrazovaní komponentou
- nejjednodušší
- 3D data připravý někdo jiný, zobrazení provede standardní prohlížeč

**2. přístup**
- provádím vytváření 3D objektů, zobrazování neřeším
- připravím 3D objekty (nehybné, interaktivní), rozmístím je v prostoru
- výsledkem scéna, kterou zobrazí standardní prohlížeč

**3. přístup**
- řeším zobrazování 3D objektů
- řeším, jak bude vypadat scéna
	- chci zvýšit realističnost, přehlednost či výkon
	- mohu použít 3D knihovny

**Souřadný systém scény**
- kartézský souřadný systém
	- natočení os bývá aplikačně závislé
	- osa z někdy bývá vodorovná, jindy vertikální, často také ve směru od/do tradiční 2D roviny
- točivost systému
	- jakým směrem probíhá rotace o kladný úhel okolo os x, y, z
	- levotočivý a pravotočivý systém

**3D objekty**
- získávány z databáze 3D objektů nebo vlastním vytvořením
- databáze 3D objektů
	- volné i komerční
	- volné často omezené, komerční často drahé
	- nejjednodušší způsob získání, často nejlevnější
	- modely podléhají licencím
	- často obsahují skrytý watermark
- vlastní tvorba 3D modelu
	- tvorba složitějších modelů je časově náročná
	- základní principy
		- 3D skenování
			- oskenování reálného objektu 3D skenerem či systémem kamer
			- výsledkem zašumělá množina bodů ve 3D
			- data je nutné zpracovat
		- 3D modelování

### 3D modelování

- lze použít dostupné modelovací nástroje
	- technicky orientované (CAD)
	- graficky orientované
- objekty bývají modelovány
	- skládáním z jednodušších objektů
	- rotací 2D křivky okolo osy (tzv. resolve)
	- vytažením 2D křivky
	- manipulací s primitivy, ze kterých je objekt vymodelován

**Jednoduché objekty**
	- válec, kvádr, kužel, koule, ...
	- snadno vymodelovatelné

**Složité objekty**
- reprezentovány množinou primitiv (body, úsečky, trojúhelník, čtyřúhelník, ...)
- mohou vzniknout převodem analyticky vyjádřených objektů
- mohou vzniknou rotací kolem osy (váza, láhev, hřebík, ...)
- Beziérův plát - zobecnění Beziérovy křivky (určen 4x4 vrcholy)
- kvalita na výstupu je určena velikostí primitiv po jejich transformaci na 2D grafiku
	- využívá se analytických popisů objektů
	- technika Level of Detail (LOD)
		- více modelů pro jeden objekt (vybere se nejvhodnější)

**Čtyřúhelníkové sítě**
- přirozenější pro strojírenství, GIS, ...
- vrcholy čtyřúhelníku nemusí ležet na rovině
- pro zobrazení je čtyřúhelník automaticky rozdělen na 2 trojúhelníky

**Trojúhelníkové sítě**
- množina trojúhelníků
- trojúhelník zadán třemi vrcholy
	- může zdegenerovat na úsečku nebo bod
	- nezdegerovaný korektně reprezentuje rovinu
- souřadnice ve floatech
- nejčastěji specifikována dvojicí seznamů
	- seznam vrcholů
	- seznam trojúhelníků

**Izolované body a hrany**
- občas je potřeba do scény přidat izolované body nebo hrany
- body a hrany mají 0 rozměr
- je potřeba je
	- modelovat jako objekty ve 3D s danou velikostí ve fyzických jednotkách
		- modelování bodů ve 3D
			- trojúhelník/čtyčúhelník se natáčí k pozorovateli (tzv. billboard)
			- 3D objekt
		- modelování hran ve 3D = válec
	- zobrazit jako překryvnou vrstvu při ve výsledném 2D obrázku
		- 3D scéna zobrazena, přes výsledný obraz nakresleny 2D objekty
- 3D grafické knihovny běžně podporují oba přístupy

**Kamera**
- bod jejího umístění
- bod, na který se dívá
- vektor natočení vůči EC (Up)
- zorné pole - Field of View (FOVx, FOVy)
- přední ořezová rovina (near clipping)
	- bližší objekty jsou ignorovány
- zadní ořezová rovina (far clipping)
	- vzdálenější objekty jsou ignorovány
	- urychlení vykreslování
- typy kamer
	- ortogonální
		- kolmé promítání
		- velikost zobrazení objektu nezávisí na jeho vzdálenosti od kamery
		- vhodné pro technické zobrazování
	- perspektivní
		- paprsky se sbíhají
		- velikost zobrazení objektu závisí na jeho vzdálenosti od kamery
		- napodobuje lidské vnímání světa
- zobrazovaný prostor (view frustum)
	- kvádr pro ortogonální kameru
	- komolý jehlan pro perspektivní kameru

#### Zobrazení scény

- různé zobrazovací techniky
- **drátěný model** (wireframe)
	- vypočte 2D pozice crcholů
	- spojí 2D vrcholy 2D úsečkami
	- nejjednodušší a nejrychlejší
	- dívám se skrz objekty (můžu s nimi manipulovat)
- **jednobarevné plošné zobrazení**
	- zakryté plošky nejsou vidět
	- 2D obrazce se vyplní jednou barvou
	- velmi rychlé
	- vhodné např. pro schématická CAD zobrazení
	- využívá se v kombinaci se zobrazením obrysových hran
- **konstantní stínování**
	- obdoba jako jednobarevné plošné zobrazení
	- jas trojúhelníků zavislý na dopadajícím světle (je potřeba definovat světla)
	- velmi rychlé

**Normála**
- normálový vektor = vektor kolmý k povrchu
- pro trojúhelníkové sítě ji 3D grafické knihovny vypočítají obvykle samy
- vrcholy trojúhelníků musá být zadávány v konzistentním pořadí
	- po/proti směru hodinových ručiček (CW/CCW)

**Světla**
- důležité pro složitější zobrazovací přístupy
- pro scénu nezbytné nadefinovat alespoň jeden zdroj světla
- pro každé se specifikuje jeho barva (obvykle RGB)
- modely zdrojů světla
	- **rovnoběžné**
		- definováno směrem
		- paprsky na scénu dopadají rovnoběžně
	- **bodové**
		- definováno pozicí ve scéně
		- paprsky se šíří všemi směry od pozice
	- **kuželové**
		- reflektor (spotlight)
		- paprsky se šíří ve směru kužele
	- **ambientní** (roztýlené)
		- definováno pouze barvou
		- přichází ze všech směrů
		- bez něj jsou části bez světla černé

**Materiály objektů**
- určují, jak objekt odráží světlo
- nejčastěji definovány třemi parametry
	- matný (difúzní) odraz
		- část dopadajícího světla se pohltí
		- část se odrazí ve všech směrech
		- často definováno pro každou barvu zvlášť
	- lesklý (spekulární, zrcadlový) odraz
		- část dopadajícího světla se pohltí  
		- část dopadajícího světla se odrazí dle zákona odrazu
	- rozptýlený odraz
		- pracuje pouze s rozptýleným (ambientním) světlem

**Stínování**
- Goraud [Guró] stínování
	- také smooth shading
	- jas barvy se na ploše 2D trojúhelníku mění v závislosti na dopadajícím světle
- Sofistikovanější stínování
	- např. Phongovo stínování
	- náročnost výpočtů na pozadí
	- není běžně implementováno

**Fotorealistické modelování**
- **1. možnost**
	- reálné objekty modelovány velmi jemnou sítí
	- každý trojúhelník má přiřazenu jednu barvu
	- vysoce neefektivní
- **2. možnost**
	- parametry difúzního odrazu v libovolném bodě trojúhelníku uloženy ve 2D barevné textuře
	- velmi rychlé a rozšířené

**Textura**
- mnoho významů a použití
- pro naše účely: textura = bitmapový obrázek
- typicky čtvercové o hraně mocniny 2
	- 128x128, 256x256, 512x512
- obsahem může být
	- uměle vygenerovaný obrázek
	- reálná fotografie

### 3D formáty

**Binární**
- VTK, OBJ, X (DirectX), ...

**Textové**
- VTK, OBJ, STL, PLY, COLLADA (.dae), X, X3D, VRML, XAML

Různá složitost formátů
- některé pouze jeden objekt, jiné celé systémy
- některé pouze statické scény, jiné dynamické
+ některé formáty požadují kameru jako součást popisu