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.
Tip
Osa 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 x a y. Ve 3D jsou to x, y a z. Jsou na sebe v zájemně kolmé. Počátek je v bodě, kde se protínají všechny osy, označovaném jako 0.
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: (x,y,z)→(x,y,z,1).
Převod z homogenních na kartézské souřadnice: (x,y,z,w)→(wx,wy,wz).
Body, kde w=0 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.
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 M
Převádí souřadnice z prostoru objektu (local space) do prostoru světa (world space). Využívá se pro rotaci (R), škálování (S) a translaci (T) objektu.
M=T⋅R⋅S
Pohledová matice / view matrix V
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
Vš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. Doslovný překlad je “komolý jehlan”
Projekční matice / projection matrix P
Převádí souřadnice z prostoru před kamerou (camera space) do clip space.
Používá se zejména ortografická projekce (Portho) a perspektivní projekce (Ppersp).
MVP matice
Pro převod modelu z jeho lokálního prostoru do clip space použijeme:
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:
left - levá hranice (X),
right - pravá hranice (X),
bottom - spodní hranice (Y),
top - horní hranice (Y),
near - blízká hranice (Z),
far - daleká hranice (Z).
Společně definují boxík, kde je (left,bottom,−near) levý spodní roh a (right,top,−far) pravý horní roh. Úkolem matice Portho je nasoukat tento boxík do krychle (−1,−1,−1)→(1,1,1) (a navíc flipnou Z, protože OpenGL mění handedness).
FOVy - field of view (úhel zorného pole) v ose Y,
aspect - poměr šířky a výšky okna,
near - blízká hranice,
far - daleká hranice.
V matici Ppersp se vyskytují následující mezihodnoty:
top=near⋅tan(2FOVy),
bottom=−top,
right=top⋅aspect,
left=−right.
Translace frustumu
Posouváme špičku frustumu do počátku souřadného systému. 3
T=100001000010−2left+right−2bottom+top01
Note
Vš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ě near budou větší než objekty dále. Rovina near reprezentuje plochu obrazovky, na kterou jsou všechny body promítány.
V obrázku výše je bod (x,y,z) promítnut na rovinu near jako (x′,y′,near). Vznikají tak dva trojúhelníky, které jsou si sobě podobné a proto mají stejné poměry stran. Platí tedy neary′=zy. Pak y′=zy⋅near. Chceme tedy, aby platilo:
x′=zx⋅neary′=zy⋅near
Což můžeme vyjádřit v homogenních souřadnicích vyjadřít dělením w jako:
D=near0000near00001−10000
Velikost okna
Šířka a výška okna dána pomocí left,right,bottom,top se musí vlézt do intervalu (−1.0,1.0), proto je potřeba provést škálování:
S=right−left20000top−bottom20000100001
Přemapování hloubky
Chceme zachovat tu schopnost souřadnice z nám říct, že něco je před něčím jiným. Potřebujeme proto přemapovat interval (−near,−far) na (−1.0,1.0). Jelikož desetinná čísla mají tendenci vytvářet artefakty, chceme aby toto mapování bylo nelineární tak, aby bylo přesnější blíže near. Použijeme −zc1+c2, kde c1 a c2 jsou konstanty zvoleny pomocí:
Note
Interval (−near,−far) obsahuje negace, neboť kamera se dívá do -Z osy, ale tyto hodnoty zadáváme jako kladná čísla.
Note
−z v rovnici výše je zodpovědné za přepnutí mezi right-handed a left-handed systémem souřadnic v OpenGL.