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.

Right-hand rule
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 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.

    Note
    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.

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]

szp08 orthographic projection

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]

szp08 perspective projection

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]

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ě budou větší než objekty dále. Rovina reprezentuje plochu obrazovky, na kterou jsou všechny body promítány.

szp08 perspective divide
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í:

Note
Interval obsahuje negace, neboť kamera se dívá do -Z osy, ale tyto hodnoty zadáváme jako kladná čísla.
Note
v rovnici výše je zodpovědné za přepnutí mezi right-handed a left-handed systémem souřadnic v OpenGL.
szp08 depth mapping
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 :

Další zdroje