# 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]$