marp | theme |
---|---|
true |
my_style |
Nikola Bebić
- 3d model: gomila primitiva
- koji su pak gomila tačaka (vektora) u 3D prostoru, sa bojom ili teksturom
- 2d tačke (pikseli) na ekranu sa bojom
- model transform - model u prostoru
- world transform - prostor pred kamerom
- perspective transform - kamera na ekran
- rasterization - sve to u piksele
- matrice
- mnoεženje matrica
- u matematici, član
$A^n$ - za nas: niz od 2, 3, ili 4 broja određenog tipa (najčešće
float
) - GPU ima specijalnu podršku za njih
- sabiranje, oduzimanje
- množenje matricama
- ima svoje
$(x, y, z, w)$ koordinate -
$w = 0$ ili$w = 1$ - drugačije zapisano kao
- objekte treba da "postavimo" na svoj položaj u svetu
- pomeramo koordinatne sisteme, što će se odraziti na sve objekte (i podobjekte) nakon toda
- svaka transformacija je linearna: možemo je predstaviti kao matricu
- transformacije primenjujemo množenjem sa odgovarajućom matricom
- širenje, skupljanje, preslikavannje oko neke ose
- množenje svake ose nekim skalarom
glScalef( sx, sy, sz );
- pomeranje za određen vektor
$(t_x,t_y,t_z)$
glTranslatef( tx, ty, tz );
- rotacija oko vektora
$(x, y, z)$ za ugao$\theta$ - komplikovano ...
- specijalni slučajevi - oko koordinatnih osa
glRotatef( theta, x, y, z );
- oko
$x$ -ose: $$
R_x(\theta) = \begin{bmatrix} 0 & 0 & 0 & 0\ 0 & \cos\theta & -\sin\theta & 0\ 0 & \sin\theta & \cos\theta & 0\ 0 & 0 & 0 & 1 \end{bmatrix}
$$
$\tau_A \circ \tau_B = \tau_{A \cdot B}$ - iz asocijativnosti množenja matrica i vektora
- možemo transformacije "akumulirati" tako što množimo odgovarajuće matrice
- stek matrica
$\Rightarrow$ brzo možemo menjati transformacije
- treba naš svet da pozicioniramo pred kameru
- kamera uvek stoji u
$(0, 0, 0)$ i gleda ka$-z$ gluLookAt( ex, ey, ez, lx, ly, lz, ux, uy, uz)
- uvek je prva transformacija koju radimo - da bi bila poslednja primenjena
- perspektiva - bliže stvari su veće
- blize stvari zaklanjaju dalje
- frustrum - deo sveta koji vidimo
- FoV, aspect ratio, ...
gluPerspective( fov, aspect, zNear, zFar )
- od
$[-afz, afz]\times[-fz,fz]\times[-z_n,-z_f]$ - do
$[-a,a]\times[-1,1]\times[-1,1]$ , ali pazeći na perspektivu
- delimo
$x$ i$y$ sa$z$ - homogenous divide:
$\mathrm{hdiv}(x,y,z,w)=(\frac xw,\frac yw, \frac zw, 1)$ - stavimo
$w = -z$
- od trougla na 2D ekranu treba doći do pojedinačnih tačaka
- problemi:
- koje tačke "zahvata" svaki trougao?
- šta je ispred/iza?
- šta je koje boje / teksture?
- ...
- metoda 1: "edge walking"
- loša paralelizacija, komplikovan algoritam
- metoda 2: "brute force"
- može se paralelizovati
- mnogo optimizocija
- odredimo bounding-box (brzo)
- izračunamo jednačine linija za svaku stranicu
- za svaki piksel u BB:
- proverimo da li pripada
- šta je ispred, a šta iza?
- poseban "sloj" za čuvanje daljine
- tačka se crta samo ako je
$z_t(x, y) > z_{buf}(x, y)$
- problem: ne zavisi linearno nakon projekcije
-
$1/z$ zavisi linearno! - možemo iskoristiti homogenizaciju od ranije
- linearna interpolacija izmedju temena
- nije idealno, ali sta god
- uopštenje čitavog ovog procesa
- vertex shader: 3D do 2D
- fragment shader: 2D do pixel (fragment)
- ...
- teško da se uradi kako treba
- razni "otprilike" modeli:
- Phongov model