Modelování a projekce
Editovat
Note
|
Homogenní souřadnice, modelovací, pohledová a projekční matice, perspektivní a ortografická projekce. Základní afinní transformace. PV189, PV112 |
Souřadnicové systémy
- Right-hand rule
-
Mnemotechnická pomůcka pro určení orientace os v kartézské soustavě souřadnic. Taky se používá pro určení směru vektorového součinu.
TipOsa X je dána ukazováčkem, osa Y prostředníčkem, osa Z palcem. Pokud Y míří nahoru, pak ano, člověk si u toho může vykroutit ruku, ale alespoň si to zapamatuje. - Kartézská soustava souřadnic
-
Right-handed systém definován třemi kolmými osami. Ve 2D jsou to a . Ve 3D jsou to , a . Jsou na sebe v zájemně kolmé. Počátek je v bodě, kde se protínají všechny osy, označovaném jako .
- Homogenní souřadnice
-
Hack, kdy reprezentujeme souřadnici v 3D prostoru pomocí 4 čísel, abychom mohli zapsat translaci pomocí matice. Využívá se v projektivní geometrii, pro projekci 3D scén na 2D plochu.
Převod z kartézských na homogenní souřadnice: .
Převod z homogenních na kartézské souřadnice: .
Body, kde jsou body v nekonečnu. Využívá se pro popis pohybu k nekonečnu, který se v kartézských souřadnicích nedá popsat.
MVP matice
Important
|
Pro implementaci v OpenGL viz Renderování s využitím GPU. |
Warning
|
Při zápisu matic bacha na to, jestli jsou row-major nebo column-major. Třeba v OpenGL to znamená, že se všechny matice píší v transponované podobě, jelikož OpenGL je column-major a v takovém pořádí jsou i parametery mat2 , mat3 a mat4 V GLSL.
|
- Modelovací matice
-
Převádí souřadnice z prostoru objektu (local space) do prostoru světa (world space). Využívá se pro rotaci (), škálování () a translaci () objektu.
- Pohledová matice / view matrix
-
Převádí souřadnice z prostoru světa (world space) do prostoru před kamerou (camera space). Otáčí světem, aby kamera byla jeho středem. [1]
kde:
-
je vektor, který ukazuje doprava od kamery.
-
je vektor, který ukazuje nahoru od kamery.
-
je vektor, který ukazuje dopředu od kamery.
-
je pozice kamery.
NoteVšimni si, že levá matice je transponovaná a poziční vektor v pravé matici je negovaný. Je to proto, že otáčíme a posouváme celým světem tak, aby kamera byla v počátku, musíme proto provést inverzní operace vůči těm, které chceme provést s kamerou. [1]
-
- Frustum
-
Část 3D tělesa (nejčastěji pyramidy nebo jehlanu) mezi dvěma rovnoběžnými rovinami.
- Projekční matice / projection matrix
-
Převádí souřadnice z prostoru před kamerou (camera space) do clip space.
Používá se zejména ortografická projekce () a perspektivní projekce ().
- MVP matice
-
Pro převod modelu z jeho lokálního prostoru do clip space použijeme:
Projekce
Ortografická projekce
Používáme především k vykreslení 2D scén. Osu Z můžeme využít, abychom jeden sprite schovali za jiný. Nicméně objekty dál od kamery jsou stejně velké jako ty blízko kamery. [1]
Je dána 6 parametry:
-
- levá hranice (X),
-
- pravá hranice (X),
-
- spodní hranice (Y),
-
- horní hranice (Y),
-
- blízká hranice (Z),
-
- daleká hranice (Z).
Společně definují boxík, kde je levý spodní roh a pravý horní roh. Úkolem matice je nasoukat tento boxík do krychle (a navíc flipnou Z, protože OpenGL mění handedness).
kde:
-
obrací osu Z, kvůli přechodu z right-handed do left-handed (týká se OpenGL [3]),
-
definuje velikost kvádru, který se vleze do clip space,
-
posouvá počátek doprostřed kvádru.
Perspektivní projekce
Zmenšuje objekty, které jsou dále od kamery. [1]
Je definována 4 parametry:
-
- field of view (úhel zorného pole) v ose Y,
-
- poměr šířky a výšky okna,
-
- blízká hranice,
-
- daleká hranice.
V matici se vyskytují následující mezihodnoty:
-
,
-
,
-
,
-
.
- Translace frustumu
-
Posouváme špičku frustumu do počátku souřadného systému. [4]
NoteVšimni si, že. Pokud používáme 4-parametrickou verzi, tak je to matice identity a tím pádem není potřeba. - Perspective divide
-
Objekty blíže k rovině budou větší než objekty dále. Rovina reprezentuje plochu obrazovky, na kterou jsou všechny body promítány.
Obrázek 1. Perspective divide [4]V obrázku výše je bod promítnut na rovinu jako . Vznikají tak dva trojúhelníky, které jsou si sobě podobné a proto mají stejné poměry stran. Platí tedy . Pak . Chceme tedy, aby platilo:
Což můžeme vyjádřit v homogenních souřadnicích vyjadřít dělením jako:
- Velikost okna
-
Šířka a výška okna dána pomocí se musí vlézt do intervalu , proto je potřeba provést škálování:
- Přemapování hloubky
-
Chceme zachovat tu schopnost souřadnice nám říct, že něco je před něčím jiným. Potřebujeme proto přemapovat interval na . Jelikož desetinná čísla mají tendenci vytvářet artefakty, chceme aby toto mapování bylo nelineární tak, aby bylo přesnější blíže . Použijeme , kde a jsou konstanty zvoleny pomocí:
NoteInterval obsahuje negace, neboť kamera se dívá do -Z osy, ale tyto hodnoty zadáváme jako kladná čísla. Notev rovnici výše je zodpovědné za přepnutí mezi right-handed a left-handed systémem souřadnic v OpenGL. Obrázek 2. Depth mapping [4]Tedy:
Pokud přepíšeme jako , můžeme opět použít homogenní souřadnice a dělení a získáme:
Výsledná matice je:
Tahle matice funguje pro obecné frustum dané parametry . Pokud dosadíme původní parametry za mezihodnoty:
dostaneme matici, na kterou se trochu lépe kouká: [5]
Základní afinní transformace
Opakování z Lineární algebry II:
- Afinní prostor
-
Trojice , kde je množina bodů, je vektorový prostor (zaměření) a je binární funkce .
- Standardní afinní prostor
-
Je afinní prostor .
- Afinní kombinace bodů
-
Výrazy tvaru , kde a .
- Afinní zobrazení
-
Zobrazení , které zachovává afinní kombinace bodů.
Složení nějakého lineárního zobrazení a translace.
- Translace
-
Pro posun v 2D prostoru podél osy :
Pro posun ve 3D prostoru podél osy :
- Rotace
-
Pro rotaci v 2D prostoru o úhel :
Pro rotaci ve 3D prostoru o úhel :
-
Kolem osy :
-
Kolem osy :
-
Kolem osy :
-
- Škálování / scale
-
Pro škálování v 2D prostoru:
Pro škálování ve 3D prostoru:
- Zkosení / shear (asi taky )
-
Pro zkosení v 2D prostoru vektorem :
Pro zkosení ve 3D prostoru podél plochy :
Podél plochy :
Podél plochy :