# 8. Modelování a projekce (100%)
###### tags: `grafika`, `PV112`
:::warning
* Homogenní souřadnice
* Modelovací, pohledová a projekční matice
* Perspektivní a ortografická projekce
* Základní afinní transformace
:::
## Homogenní souřadnice
* Homogenní souřadnice umožňují reprezentovat n-dimenzionální bod n+1 hodnotami.
* Základ pro projektivní geometrii, která je široce použita pro projekci třírozměrných scén do dvourozměrné roviny obrazu.
* Umožňují reprezentovat všechny grafické operace pomocí násobení matic.
* Další dimenze v matici souřadice umožňuje translaci
Pro vytvoření 2D homogenních souřadnic stačí k souřadnicím $(x, y)$ přidat třetí proměnnou $w$.
Tedy bod v kartézských souřadnicích $(x,y)$ odpovídá bodu $(X*w, Y*w, w)$ v homogenních souřadnicích.
Převod z homogenních souřadnic na kartézské probíhá následovně:
$x = X/w$
$y = Y/w$
* $w$=0 znamená, že bod je v nekonečnu
> **Příklad**
> 1. Bod $(1,2)$ je v homogenních souřadnicích je $(1,2,1)$
> 2. Bod se pohybuje k nekonečnu:
> V kartézských souřadnících zapíšeme jako nesmyslných $(\infty,\infty)$
> V homogenních souřadnicích je to jednoduše $(1,2,0)$
---
## Modelovací, pohledová a projekční matice
* M = Modelovací (Model)
* V = Pohledová (View)
* P = Projekční (Projection)
Dohromady slouží k přenesení bodu z 3D prostoru do 2D prostoru kamery která jej sleduje.
### Modelovací matice
Umisťuje objekt do prostoru.
Skládá se z Translace (Translation) $T$, Rotace (Rotation) $R$ a Měřítka (Scale) $S$
\begin{align*}
M = T \cdot R \cdot S
\end{align*}
Matice viz [Základní afinní transformace](#Základní-afinní-transformace)
### Pohledová matice
Kontroluje způsob náhledu na scénu, tedy kde a jakým směrem se dívá kamera
Maticový zápis užívá:
* left - směr vektoru od kamery doleva
* up - směr vektoru od kamery nahoru
* forward - směr kamery
* position - pozice kamery
Matice $\left[\begin{array}{cc} left_x & up_x & forward_x & position_x \\ left_y & up_y & forward_y & position_y \\ left_z & up_z & forward_z & position_z \\ 0 & 0 & 0 & 1\end{array}\right]$
V nádstavbových knihovnách OpenGl funkce LookAt, která používá parametry:
* pozice pozorovatele (eye),
* bod do kterého se kamera dívá (center)
* směr nahoru pozorovatele (up) (definující orientaci pozorovatele).
### Projekční matice
Určuje vizualní deformaci prostoru podle způsobu promítání kamery
Ortoografická a perspektivní projekce
---
## Ortografická projekce
Rovnoběžné promítání
Prostor je definovaný kvádrem, tedy šesti parametry $(right, left, far, near, top, bottom)$, které definují ořezávací roviny.
Matice $\left[\begin{array}{cc} \frac{2}{right - left} & 0 & 0 & -\frac{right+left}{right-left} \\ 0 & \frac{2}{top - bottom} & 0 & -\frac{top+bottom}{top-bottom} \\ 0 & 0 & \frac{2}{far - near} & -\frac{far+near}{far-near} \\ 0 & 0 & 0 & 1\end{array}\right]$
## Perspektivní projekce
Perspektivní projekce slouží pro přirozeně vypadající promítnutí 3D objektu na 2D obrazovku
Často definováno čtyřmi paramery:
* $FOV$ - pohledový úhel
* $aspect$ - poměr výšky a šířky pohledového jehlanu
* $near$ - pozice přední ořezávací roviny
* $far$ - pozice zadní ořezávací roviny
![](https://i.imgur.com/qYujGWe.png =250x)
pro matici třeba následující parametry:
* $\displaystyle top = near \cdot tan \left(\frac{\pi}{180} \cdot FOV/2\right)$
* $\displaystyle bottom = -top$
* $\displaystyle right = top \cdot aspect$
* $\displaystyle left = -right$
![](https://i.imgur.com/If8g1tn.png =240x)
Matice $\left[\begin{array}{cc} \frac{2\cdot near}{right - left} & 0 & \frac{right+left}{right-left} & 0\\ 0 & \frac{2\cdot near}{top - bottom} & \frac{top+bottom}{top-bottom} & 0 \\ 0 & 0 & \frac{far + near}{far - near} & -\frac{2 \cdot far \cdot near}{far-near} \\ 0 & 0 & -1 & 0\end{array}\right]$
---
## Základní afinní transformace
Mezi základní affinní transformace patří:
### Translace
2D Matice $\left[\begin{array}{cc} 1 & 0 & x \\ 0 & 1 & y \\ 0 & 0 & 1 \end{array}\right]$
3D Matice $\left[\begin{array}{cc} 1 & 0 & 0 & x \\ 0 & 1 & 0 & y \\ 0 & 0 & 1 & z \\ 0 & 0 & 0 & 1\end{array}\right]$
### Rotace
2D Matice $\left[\begin{array}{cc} cos(\theta) & -sin(\theta) & 0 \\ sin(\theta) & cos(\theta) & 0 \\ 0 & 0 & 1 \end{array}\right]$
3D Matice
* Kolem X $\left[\begin{array}{cc} 1 & 0 & 0 & 0 \\ 0 & cos(\theta) & -sin(\theta) & 0 \\ 0 & sin(\theta) & cos(\theta) & 0 \\ 0 & 0 & 0 & 1\end{array}\right]$
* Kolem Y $\left[\begin{array}{cc} cos(\theta) & 0 & sin(\theta) & 0 \\ 0 & 1 & 0 & 0 \\ -sin(\theta) & 0 & cos(\theta) & 0 \\ 0 & 0 & 0 & 1\end{array}\right]$
* Kolem Z $\left[\begin{array}{cc} cos(\theta) & -sin(\theta) & 0 & 0 \\ sin(\theta) & cos(\theta) & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1\end{array}\right]$
### Scale
2D Matice $\left[\begin{array}{cc} x & 0 & 0 \\ 0 & y & 0 \\ 0 & 0 & 1 \end{array}\right]$
3D Matice $\left[\begin{array}{cc} x & 0 & 0 & 0 \\ 0 & y & 0 & 0 \\ 0 & 0 & z & 0 \\ 0 & 0 & 0 & 1\end{array}\right]$
### Zkosení
2D Matice $\left[\begin{array}{cc} 1 & x & 0 \\ y & 1 & 0 \\ 0 & 0 & 1 \end{array}\right]$
3D Matice $\left[\begin{array}{cc} 1 & Y_x & Z_x & 0 \\ X_y & 1 & Z_y & 0 \\ X_z & Y_z & 1 & 0 \\ 0 & 0 & 0 & 1\end{array}\right]$