This shows you the differences between two versions of the page.
ppbg:laboratoare:04 [2024/10/31 01:09] andrei.lambru |
ppbg:laboratoare:04 [2024/11/01 00:22] (current) andrei.lambru |
||
---|---|---|---|
Line 54: | Line 54: | ||
<note tip> | <note tip> | ||
- | În cuvinte, se normalizează coordonatele vârfurilor din spațiul $([-1, 1], [-1, 1], [-1, 1])$ în spațiul $([0, viewport_width], [0, viewport_height], [0,1])$. | + | În cuvinte, se normalizează coordonatele vârfurilor din spațiul $([-1, 1], [-1, 1], [-1, 1])$ în spațiul $([0, viewportWidth], [0, viewportHeight], [0,1])$. |
</note> | </note> | ||
- | Observăm că se proiectează paralel coordonatele vârfurilor pe fața $z=-1$ a cubului. Practic, se păstrează componentele (x, y) ale coordonatelor din vârfuri și putem să consideram că pentru componentele (x, y) se utilizează o transformare fereastră-poartă dintr-o fereastră peste spatiul 2D. | + | Observăm că se proiectează paralel coordonatele vârfurilor pe fața $z=-1$ a cubului. Practic, se păstrează componentele $(x, y)$ ale coordonatelor din vârfuri și putem să consideram că pentru componentele $(x, y)$ se utilizează o transformare fereastră-poartă dintr-o fereastră peste spatiul 2D. |
- | Pentru componenta z, din moment ce nu se poate transforma direct în coordonatele grilei de pixeli, se normalizează între 0 și 1 și se utilizează cu scopul de valore de adâncime în procesul de rasterizare studiat în [[:ppbg:laboratoare:01#testul_de_adancime | laboratorul 1]] :) . | + | Pentru componenta $z$, din moment ce nu se poate transforma direct în coordonatele grilei de pixeli, se normalizează între 0 și 1 și se utilizează cu scopul de valore de adâncime în procesul de rasterizare studiat în [[:ppbg:laboratoare:01#testul_de_adancime | laboratorul 1]] :) . |
==== Procesul de decupare ==== | ==== Procesul de decupare ==== | ||
- | Pe ecran ajung să fie desenate doar suprafețele dintr-un triunghi ce se regăsesc în volumul cubului de latură 2, centrat în originea axelor de coordonate. Cu toate acestea, este posibil ca nu toată suprafața unui triunghi să se afle în volumul cubului, astfel că în procesul de rasterizare trebuie să se realizeze procesări suplimentare pentru a nu se desena în afara grilei de pixeli. Pentru a evita realizarea acestor calcule, putem decupa triunghiurile la limitele volumului și să utilizăm în procesul de rasterizare doar triunghiurile rezultate în urma decupării. Acest mecanism poate genera de la 0 sau pana la 3 triunghiuri. Scenariile în care sunt rezultate 1, 2 și 3 triunghiuri pot fi observate în imaginea de mai jos. | + | Pe ecran ajung să fie desenate doar suprafețele dintr-un triunghi ce se regăsesc în volumul cubului de latură 2, centrat în originea axelor de coordonate. Cu toate acestea, este posibil ca nu toată suprafața unui triunghi să se afle în volumul cubului, astfel că în procesul de rasterizare trebuie să se realizeze procesări suplimentare pentru a nu se desena în afara grilei de pixeli. Pentru a evita realizarea acestor calcule, putem decupa triunghiurile la limitele volumului și să utilizăm în procesul de rasterizare doar triunghiurile rezultate în urma decupării. Scenariile în care acest mecanism produce 1, 2 și 3 triunghiuri pot fi observate în imaginea de mai jos. |
{{ :ppbg:laboratoare:clip.png?400 |}} | {{ :ppbg:laboratoare:clip.png?400 |}} | ||
Line 77: | Line 77: | ||
===== Transformarea de proiecție perspectivă ===== | ===== Transformarea de proiecție perspectivă ===== | ||
- | Definirea unui spațiu finit pe care să îl normalizăm ulterior în grila de pixeli ne oferă o flexibilitate foarte mare. Dezavantajul aplicării directe a acestei abordări este că geometria obiectelor nu se regăsește întotdeauna în interiorul volumului de decupare. De fapt, de cele mai multe ori, obiectele nu se află în acest volum. Astfel, trebuie să aducem noi geometria în acesta printr-o transformare suplimentară. Această transformare poate să fie o transformare de proiecție perspectivă pentru a simula procesul de transport al luminii de pe suprafețele scenei la observator. Tot ce "vede" ochiul uman este lumina, astfel că procesul de desenare a suprafețelor unui obiect pe ecran, simulează procesul de achiziție a luminii care ajunge de pe suprafețele obiectului la ochiul uman :) . Pentru simplitate, vom considera un singur punct de convergență pentru simularea razelor de lumină. Astfel, putem să folosim o transformare perspectivă a coordonatelor vârfurilor pentru a aduce geometria în spațiul de decupare și ulterior pentru a o desena pe ecran. | + | Definirea unui spațiu finit pe care să îl normalizăm ulterior în grila de pixeli ne oferă o flexibilitate foarte mare. Dezavantajul aplicării directe a acestei abordări este că geometria obiectelor nu se regăsește întotdeauna în interiorul volumului de decupare. De fapt, de cele mai multe ori, obiectele nu se află în acest volum. Astfel, trebuie să aducem noi geometria în acesta printr-o transformare suplimentară. Această transformare poate să fie o transformare de proiecție perspectivă pentru a simula procesul de transport al luminii de pe suprafețele scenei la observator. |
- | Volumul proiecției perspectivă este un trunchi de piramidă, frustum. Standard, acest volum este descris cu vârful în originea axelor de coordonate și cu baza orientată de-a lungul axei Z, în sens negativ. Acest volum se normalizează în volumul spațiului de decupare. O reprezentare vizuală a lui se găsește în imaginea de mai jos. | + | Tot ce „vede” ochiul uman este lumina, astfel că procesul de desenare a suprafețelor unui obiect pe ecran simulează procesul de achiziție a luminii care ajunge de pe suprafețele obiectului la ochiul uman :) . Pentru simplitate, vom considera un singur punct de convergență pentru simularea razelor de lumină. Astfel, putem să folosim o transformare perspectivă a coordonatelor vârfurilor pentru a aduce geometria în spațiul de decupare și ulterior pentru a o desena pe ecran. |
+ | |||
+ | Volumul proiecției perspectivă este un trunchi de piramidă, frustum. Standard, acest volum este descris cu vârful în originea axelor de coordonate și cu baza orientată de-a lungul axei $Z$, în sens negativ. Acest volum se normalizează în volumul spațiului de decupare. O reprezentare vizuală a lui se găsește în imaginea de mai jos. | ||
{{ :ppbg:laboratoare:perspective.png?500 |}} | {{ :ppbg:laboratoare:perspective.png?500 |}} | ||
Avem mai multe posibilități de a descrie forma acestui volum, dar în continuare va fi prezentată cea care apare uzual în grafica pe calculator. Pentru descrierea frustumului folosim: | Avem mai multe posibilități de a descrie forma acestui volum, dar în continuare va fi prezentată cea care apare uzual în grafica pe calculator. Pentru descrierea frustumului folosim: | ||
- | * Distanța până la un plan apropiat, pe care se va normaliza fața z=-1 a spațiului de decupare (**near**) | + | * Distanța până la un plan apropiat, pe care se va normaliza fața $z=-1$ a spațiului de decupare (**near**) |
- | * Distanța până la un plan îndepartat, pe care se va normaliza fața z=1 a spațiului de decupare (**far**) | + | * Distanța până la un plan îndepărtat, pe care se va normaliza fața $z=1$ a spațiului de decupare (**far**) |
* Un unghi pentru deschiderea verticală a piramidei (**fovy**) | * Un unghi pentru deschiderea verticală a piramidei (**fovy**) | ||
* Un raport de aspect al porții de afișare, lățime / înălțime, cu ajutorul căruia se poate obține unghiul de deschidere orizontală a piramidei (**aspect**) | * Un raport de aspect al porții de afișare, lățime / înălțime, cu ajutorul căruia se poate obține unghiul de deschidere orizontală a piramidei (**aspect**) | ||
Line 101: | Line 103: | ||
- | Această formula nu poate fi scrisă sub formă matriceală, deoarece este un sistem de ecuații neliniare. După cum vedem, în calcularea componentelor (x', y', z') ale coordonatei obținute în urma transformării de proiecție perspectivă, se utilizează valoarea componentei z a coordonatei pentru care se aplică transformarea. Din acest motiv, este necesar să realizam acest proces în 2 pași: | + | Această formulă nu poate fi scrisă sub formă matriceală, deoarece este un sistem de ecuații neliniare. După cum vedem, în calcularea componentelor $(x', y', z')$ ale coordonatei obținute în urma transformării de proiecție perspectivă, se utilizează valoarea componentei $z$ a coordonatei pentru care se aplică transformarea. Din acest motiv, este necesar să realizăm acest proces în 2 pași: |
- | - Se creează o matrice pentru tranformarea de proiecție perspectivă prin care se aplică formula de mai sus, fără împărțirea componentelor coordonatei rezultate în urma transformării la valoarea componentei z a coordonatei pentru care s-a realizat transformarea. Se utilizează această matrice pentru transformarea de proiecție perspectivă $$ | + | - Se creează o matrice pentru tranformarea de proiecție perspectivă prin care se aplică formula de mai sus, fără împărțirea componentelor coordonatei rezultate în urma transformării la valoarea componentei $z$ a coordonatei pentru care s-a realizat transformarea. Se utilizează această matrice pentru transformarea de proiecție perspectivă $$ |
\begin{bmatrix} | \begin{bmatrix} | ||
{x}'\\ | {x}'\\ | ||
Line 122: | Line 124: | ||
\end{bmatrix} | \end{bmatrix} | ||
$$ | $$ | ||
- | - Împărțirea componentelor (x', y', z') cu valoarea componentei z a coordonatei vârfului pentru care s-a aplicat transformarea | + | - Împărțirea componentelor $(x', y', z')$ cu valoarea componentei $z$ a coordonatei vârfului pentru care s-a aplicat transformarea |
Line 132: | Line 134: | ||
$$ | $$ | ||
- | Pentru a nu fi nevoie să se rețină apriori valoarea componentei z, care poate fi obținută în urma aplicării unui lanț de transformări, astfel că transformarea de proiecție perspectivă se poate afla în interiorul unei matrici compuse dintr-un lanț de transformări, se utilizează un artificiu. Se poate observa că matricea de mai sus este construită astfel încât să păstreze în componenta w', valoarea componentei z, negativă: | + | Pentru a nu fi nevoie să se rețină apriori valoarea componentei $z$, care poate fi obținută în urma aplicării unui lanț de transformări, astfel că transformarea de proiecție perspectivă se poate afla în interiorul unei matrici compuse dintr-un lanț de transformări, se utilizează un artificiu. Se poate observa că matricea de mai sus este construită astfel încât să păstreze în componenta $w'$ , valoarea componentei $z$, negativă: |
Line 151: | Line 153: | ||
<note> | <note> | ||
- | Acest al doilea pas este cunoscut sub numele de **împărțire perspectivă** și este implementat nativ în banda grafică a procesorului. Observăm că această transformare este ultima care se aplică inainte de transformarea coordonatelor din vârfuri în spațiul de decupare. Din acest motiv, înainte de decuparea propriu-zisă, procesorul grafic realizează împărțirea perspectivă automat, hardware sau software în driver-ul companion al procesorului grafic. | + | Acest al doilea pas este cunoscut sub numele de **împărțire perspectivă** și este implementat nativ în banda grafică a procesorului. Observăm că această transformare este ultima care se aplică înainte de transformarea coordonatelor din vârfuri în spațiul de decupare. Din acest motiv, înainte de decuparea propriu-zisă, procesorul grafic realizează împărțirea perspectivă automat, hardware sau software în driver-ul companion al procesorului grafic. |
</note> | </note> | ||
<note tip> | <note tip> | ||
- | Spațiul finit determinat de volumul trunchiului de piramidă ce are vârful în originea axelor de coordonate și baza orientata de-a lungul axei Z, în sens negativ, poartă numele de **spațiu de vizualizare**. În limba engleză, acest spațiu se regăsește sub numele de **view space**. | + | Spațiul finit determinat de volumul trunchiului de piramidă ce are vârful în originea axelor de coordonate și baza orientata de-a lungul axei $Z$, în sens negativ, poartă numele de **spațiu de vizualizare**. În limba engleză, acest spațiu se regăsește sub numele de **view space**. |
</note> | </note> | ||
<note> | <note> | ||
- | Formula de calculare a proiecției perspective pentru coordonata unui vârf, pe planul din apropiere a trunchiului de piramidă, se obține din următoarea observație: conform imaginii de mai jos, se poate vedea că triunghiul determinat de vectorii marcați cu near și y' este asemenea cu cel determinat de vectorii marcați cu -z și y. | + | Formula de calculare a proiecției perspective pentru coordonata unui vârf, pe planul din apropiere a trunchiului de piramidă, se obține din următoarea observație: conform imaginii de mai jos, se poate vedea că triunghiul determinat de vectorii marcați cu $near$ și $y'$ este asemenea cu cel determinat de vectorii marcați cu $-z$ și $y$. |
{{ :ppbg:laboratoare:perspective2.png?600 |}} | {{ :ppbg:laboratoare:perspective2.png?600 |}} | ||
- | Astfel, conform teoremei lui Thales, rezulta că: | + | Astfel, conform teoremei lui Thales, rezultă că: |
$$ | $$ | ||
Line 179: | Line 181: | ||
- | Considerăm că valoarea componentei z este negativă, deoarece o tratăm pe post de distanță și orientarea bazei trunchiului de piramidă este din constructie de-a lungul axei Z, în sens negativ. | + | Considerăm că valoarea componentei $z$ este negativă, deoarece o tratăm pe post de distanță și orientarea bazei trunchiului de piramidă este din construcție de-a lungul axei $Z$, în sens negativ. |
- | Suplimentar, presupunem că avem distanța până la limita de jos, denumită **bottom** și distanța până la limita de sus, denumtiă **top**, a feței din apropiere a frustumului, după cum se poate vedea în imaginea de mai sus. Dorim să normalizăm componenta y din intervalul [bottom, top] în [-1, 1]. Aceasta este o transformare fereastră-poartă. Împreună cu formula anterioara pentru y', obținem că y' este: | + | Suplimentar, presupunem că avem distanța până la limita de jos, denumită **bottom** și distanța până la limita de sus, denumtiă **top**, a feței din apropiere a frustumului, după cum se poate vedea în imaginea de mai sus. Dorim să normalizăm componenta $y$ din intervalul $[bottom, top]$ în $[-1, 1]$. Aceasta este o transformare fereastră-poartă. Împreună cu formula anterioara pentru $y'$, obținem că $y'$ este: |
Line 188: | Line 190: | ||
$$ | $$ | ||
- | Din construcție avem un singur unghi de deschidere verticală a trunchiului de piramidă, astfel că avem aceeași valoare pentru limitele bottom și top: | + | Din construcție, avem un singur unghi de deschidere verticală a trunchiului de piramidă, astfel că avem aceeași valoare pentru limitele bottom și top: |
Line 204: | Line 206: | ||
$$ | $$ | ||
- | Astfel, avem pentru y': | + | Astfel, avem pentru $y'$: |
$$ | $$ | ||
Line 220: | Line 222: | ||
$$ | $$ | ||
- | Daca formula pentru (x, y) reiese din proiectia coordonatelor varfului pe planul din apropiere al trunchiului de piramida, formula pentru componenta z este artificiala si reiese exclusiv din dorinta de a creea o normalizare **neliniara** intre distanta planului din apropiere si distanta planului indepartat. Se doreste ca pentru obiectele din apropiere de planul apropiat, z=-near, sa fie alocat un interval mult mai mare in spatiul de decupare, decat pentru obiectele apropiate de planul z=-far. Din acest motiv, formula standard aleasa initial este: | + | Daca formula pentru $(x, y)$ reiese din proiecția coordonatelor vârfului pe planul din apropiere al trunchiului de piramidă, formula pentru componenta $z$ este artificială și reiese exclusiv din dorința de a creea o normalizare **neliniară** între distanța planului din apropiere și distanța planului îndepărtat. Se dorește ca pentru obiectele din apropiere de planul apropiat, $z=-near$, să fie alocat un interval mult mai mare în spațiul de decupare, decât pentru obiectele apropiate de planul $z=-far$. Din acest motiv, formula standard aleasă inițial este: |
Line 229: | Line 231: | ||
$$ | $$ | ||
- | Parametrii c1 si c2 sunt cei din formula originala. Problema acestei formule este ca nu se imparte la valoarea z, ceea ce inseamna ca pentru z' nu s-ar aplica impartirea perspectiva. Pentru a face uniform procesul de impartire perspectiva, se modifica formula si obtinem versiunea finala: | + | Parametrii $c1$ și $c2$ sunt cei din formula originală. Problema acestei formule este că nu se imparte la valoarea $z$, ceea ce înseamnă că pentru $z'$ nu s-ar aplica împărțirea perspectivă. Pentru a face uniform procesul de împărțire perspectivă, se modifică formula și obținem versiunea finală: |
Line 245: | Line 247: | ||
===== Transformarea de vizualizare ===== | ===== Transformarea de vizualizare ===== | ||
- | Prin transformarea de proiecție perspectivă, descrisă mai sus, putem modifica coordonatele vârfurilor rețelei de triunghiuri pentru a le așeza în spațiul de decupare și de acolo putem desena triunghiurile pe ecran. Cu toate acestea, coordonatele obiectelor noastre nu se regăsesc întotdeauna în spațiul de vizualizare, reprezentat, cum s-a menționat mai sus, de volumul unui trunchi de piramidă cu vârful în originea axelor de coordonate și cu baza orientată de-a lungul axei Z, în sens negativ. În situația în care dorim să desenăm scena dintr-un alt punct de vedere, trebuie să definim conceptul de observator. Proprietățile care definesc un observator sunt: | + | Prin transformarea de proiecție perspectivă, descrisă mai sus, putem modifica coordonatele vârfurilor rețelei de triunghiuri pentru a le așeza în spațiul de decupare și de acolo putem desena triunghiurile pe ecran. Cu toate acestea, coordonatele obiectelor noastre nu se regăsesc întotdeauna în spațiul de vizualizare, reprezentat, cum s-a menționat mai sus, de volumul unui trunchi de piramidă cu vârful în originea axelor de coordonate și cu baza orientată de-a lungul axei $Z$, în sens negativ. În situația în care dorim să desenăm scena dintr-un alt punct de vedere, trebuie să definim conceptul de observator. Proprietățile care definesc un observator sunt: |
- | * O poziție P în spatiu, de unde "privește" obiectele din scenă | + | * O poziție $P$ în spatiu, de unde „privește” obiectele din scenă; |
- | * O direcție F în care "privește" obiectele. Companion acestei direcții, mai este necesar un vector R ce descrie direcția dreapta a observatorului, daca iși rotește direcția în care priveste scena cu 90 de grade față de axa OY și un vector U ce descrie direcția sus a observatorului. Cei 3 vectori sunt ortogonali, mai exact, unghiul dintre oricare 2 vectori din cei 3 este de 90 de grade. | + | * O direcție $\vec{F}$ în care „privește” obiectele. Companion acestei direcții, mai este necesar un vector $\vec{R}$ ce descrie direcția dreaptă a observatorului, daca iși rotește direcția în care priveste scena cu 90 de grade față de axa OY și un vector $\vec{U}$ ce descrie direcția sus a observatorului. Cei 3 vectori sunt ortogonali, mai exact, unghiul dintre oricare 2 vectori din cei 3 este de 90 de grade. |
- | Pe baza acestor informații, putem să creăm o transformare care modifică obiectele din scena, din spațiul în care se află, într-un spațiu în care observatorul are poziția în originea axelor de coordonate și "privește" scena de-a lungul axei Z, în sens negativ. Peste acest spațiu se poate suprapune volumul de vizualizare, utilizat pentru transformarea proiecției perspective. | + | Pe baza acestor informații, putem să creăm o transformare care modifică obiectele din scenă, din spațiul în care se află, într-un spațiu în care observatorul are poziția în originea axelor de coordonate și „privește” scena de-a lungul axei $Z$, în sens negativ. Peste acest spațiu se poate suprapune volumul de vizualizare, utilizat pentru transformarea proiecției perspective. |
Transformarea de vizualizare arată în felul următor: | Transformarea de vizualizare arată în felul următor: | ||
Line 261: | Line 263: | ||
1 | 1 | ||
\end{bmatrix} = \begin{bmatrix} | \end{bmatrix} = \begin{bmatrix} | ||
- | R_x & R_y & R_z & 0 \\ | + | \vec{R}_x & \vec{R}_y & \vec{R}_z & 0 \\ |
- | U_x & U_y & U_z & 0 \\ | + | \vec{U}_x & \vec{U}_y & \vec{U}_z & 0 \\ |
- | F_x & F_y & F_z & 0 \\ | + | \vec{F}_x & \vec{F}_y & \vec{F}_z & 0 \\ |
0 & 0 & 0 & 1 | 0 & 0 & 0 & 1 | ||
\end{bmatrix} | \end{bmatrix} | ||
Line 282: | Line 284: | ||
- | Se poate observa prima transformare aplicată, ultima în lanțul de înmulțiri de matrici, este o translație inversă a coordonatelor poziției observatorului în spațiul 3D, similară cu cea discutată în laboratorul anterior pentru spațiul 2D. A doua transformare aplicată este o rotație. Pentru construcția acestei matrici s-a folosit [[https://ro.wikipedia.org/wiki/Procedeul_Gram%E2%80%93Schmidt | procedeul Gram–Schmidt]]. | + | Se poate observa că prima transformare aplicată, ultima în lanțul de înmulțiri de matrici, este o translație inversă a coordonatelor poziției observatorului în spațiul 3D, similară cu cea discutată în laboratorul anterior pentru spațiul 2D. A doua transformare aplicată este o rotație. Pentru construcția acestei matrici s-a folosit [[https://ro.wikipedia.org/wiki/Procedeul_Gram%E2%80%93Schmidt | procedeul Gram–Schmidt]]. |
<note tip> | <note tip> | ||
- | Spațiul în care se regăsesc: poziția observatorului, vectorii ce descriu direcția de "privire", direcția dreapta și sus, împreună cu coordonatele tuturor obiectelor "privite" de către observator, poartă numele de **spațiu al lumii**. În limba engleză, se întâlnește denumirea de **world space**. | + | Spațiul în care se regăsesc: poziția observatorului, vectorii ce descriu direcția de „privire”, direcția dreapta și sus, împreună cu coordonatele tuturor obiectelor „privite” de către observator, poartă numele de **spațiu al lumii**. În limba engleză, se întâlnește denumirea de **world space**. |
</note> | </note> | ||
===== Transformarea de modelare ===== | ===== Transformarea de modelare ===== | ||
- | Coordonatele vârfurilor din rețeaua de triunghiuri ce descrie suprafața unui obiect se declară inițial într-un spațiu convenabil creării acelui obiect. De exemplu, din laborato. | + | Coordonatele vârfurilor din rețeaua de triunghiuri ce descrie suprafața unui obiect se declară inițial într-un spațiu convenabil creării acelui obiect. |
Pentru a modifica obiectul și a-l așeza sub forma dorită în punctul final din scenă, se folosesc transformările de translație, de modificare a scării și de rotație, discutate în laboratorul anterior, adaptate pentru un spațiu 3D. | Pentru a modifica obiectul și a-l așeza sub forma dorită în punctul final din scenă, se folosesc transformările de translație, de modificare a scării și de rotație, discutate în laboratorul anterior, adaptate pentru un spațiu 3D. | ||
Line 351: | Line 353: | ||
Mecanismul de rotație, studiat în laboratorul trecut, rotește o coordonată a unui punct într-un spațiu 2D cu un unghi a, //în sens trigonometric față de originea axelor de coordonate//. Acest mecanism NU poate fi adaptat direct la un spațiu 3D. | Mecanismul de rotație, studiat în laboratorul trecut, rotește o coordonată a unui punct într-un spațiu 2D cu un unghi a, //în sens trigonometric față de originea axelor de coordonate//. Acest mecanism NU poate fi adaptat direct la un spațiu 3D. | ||
- | Astfel, transformarea de rotație dintr-un spațiu 2D este utilizată într-un spațiu 3D pentru a roti o coordonată într-un singur plan din spațiul 3D. Mai exact într-un plan paralel cu unul din cele 3 planuri ce trec prin originea axelor de coordonate. Există câte o matrice de transformare diferită pentru fiecare din cele 3 planuri. În situația în care dorim sa creăm o transformare de rotație într-un plan oarecare, trebuie să o obținem prin compunerea din mai multe transformari de bază. | + | Astfel, transformarea de rotație dintr-un spațiu 2D este utilizată într-un spațiu 3D pentru a roti o coordonată într-un singur plan din spațiul 3D. Mai exact într-un plan paralel cu unul din cele 3 planuri ce trec prin originea axelor de coordonate. Există câte o matrice de transformare diferită pentru fiecare din cele 3 planuri. În situația în care dorim sa creăm o transformare de rotație într-un plan oarecare, trebuie să o obținem prin compunerea din mai multe transformări de bază. |
Astfel, avem transformarea de rotație într-un plan paralel cu planul XOY: | Astfel, avem transformarea de rotație într-un plan paralel cu planul XOY: | ||
Line 440: | Line 442: | ||
===== Eliminarea din procesul de rasterizare a triunghiurilor obturate ===== | ===== Eliminarea din procesul de rasterizare a triunghiurilor obturate ===== | ||
- | O optimizare suplimentară, pe care o putem realiza în spațiul de decupare, pe lângă cea de decupare propriu-zisă, este să excludem din procesul de rasterizare triunghiurile care sunt complet obturate de altă geometrie. Pentru a nu face o procesare avansată la nivel de rețea de triunghiuri, putem să folosim urmatorul artificiu: | + | O optimizare suplimentară, pe care o putem realiza în spațiul de decupare, pe lângă cea de decupare propriu-zisă, este să excludem din procesul de rasterizare triunghiurile care sunt complet obturate de altă geometrie. Pentru a nu face o procesare avansată la nivel de rețea de triunghiuri, putem să folosim următorul artificiu: |
- | În situția în care desenăm un model 3D etanș, care nu conține nicio gaură în suprafața lui, avem proprietatea că din orice punct am privi geometria, nu îi vom putea vedea niciodată interiorul. Astfel, avem următoarea formă de definire a unui triunghi: pe baza descrierii cu indici din ''vertices'', utilizată în laboratoarele anterioare, sensul în care sunt afișate vârfurile, pe baza ordinii din indici, ne determină noua faptul că privim fațeta față sau fațeta spate a triunghiului. | + | În situția în care desenăm un model 3D etanș, care nu conține nicio gaură în suprafața lui, avem proprietatea că din orice punct am privi geometria, nu îi vom putea vedea niciodată interiorul. Astfel, avem următoarea formă de definire a unui triunghi: pe baza descrierii cu indici din ''vertices'', utilizată în laboratoarele anterioare, sensul în care sunt afișate vârfurile, pe baza ordinii din indici, ne determină nouă faptul că privim fațeta față sau fațeta spate a triunghiului. |
Mai exact, dacă avem descrisă urmatoarea geometrie: | Mai exact, dacă avem descrisă urmatoarea geometrie: | ||
Line 482: | Line 484: | ||
{{ :ppbg:laboratoare:overview.png?600 |}} | {{ :ppbg:laboratoare:overview.png?600 |}} | ||
- | Din spațiul obiectului, prin transformarea de modelare, ce conține un lanț de transformări de translație, de modificare a scării și de rotație, obiectele ajung în spațiul lumii. Din acest spațiu, prin transformarea de vizualizare, conform proprietăților observatorului, obiectele ajung în spațiul de vizualizare, peste care se aplică volumul de proiecție perspectivă, reprezentat de un trunchi de piramidă, centrat în originea axelor de coordonate, cu baza orientată de-a lungul axei Z, în sens negativ. Din acest spațiu, prin transformarea de proiecție perspectivă, obiectele ajung în spațiul de decupare, reprezentat de volumul unui cub, cu latura de dimensiune 2, centrat în originea axelor de coordonate. După procesul de decupare și de eliminare a triunghiurilor obturate, în situația în care dorim acest al doilea proces, prin transformarea coordonatelor din volumul de decupare în poarta de afișare, triunghiurile se transmit la procesul de rasterizare, prin care se desenează suprafețele triunghiurilor în grila de pixeli :) . | + | - Din //spațiul obiectului//, prin **transformarea de modelare**, ce conține un lanț de transformări de translație, de modificare a scării și de rotație, obiectele ajung în //spațiul lumii//; |
+ | - Din //spațiul lumii//, prin **transformarea de vizualizare**, conform proprietăților observatorului, obiectele ajung în //spațiul de vizualizare//; | ||
+ | - Peste //spațiul de vizualizare// se aplică volumul de proiecție perspectivă, reprezentat de un trunchi de piramidă, centrat în originea axelor de coordonate, cu baza orientată de-a lungul axei Z, în sens negativ. Din acest spațiu, prin **transformarea de proiecție** perspectivă, obiectele ajung în //spațiul de decupare//, reprezentat de volumul unui cub, cu latura de dimensiune 2, centrat în originea axelor de coordonate. | ||
+ | - După procesul de decupare și de eliminare a triunghiurilor obturate, în situația în care dorim acest al doilea proces, prin transformarea coordonatelor din volumul de decupare în poarta de afișare, triunghiurile se transmit la procesul de rasterizare, prin care se desenează suprafețele triunghiurilor în grila de pixeli :) . | ||
<note tip> | <note tip> | ||
Line 498: | Line 503: | ||
* După acest pas, puteți utiliza tasta **F** pentru a schimba între desenarea triunghiurilor pentru care se afișeaza fațetele față sau fațetele spate. Dacă alegeți opțiunea să fie afișate doar fațetele spate, ar trebui să puteți vedea interiorul cubului :) : {{ :ppbg:laboratoare:cube2.png?600 |}} | * După acest pas, puteți utiliza tasta **F** pentru a schimba între desenarea triunghiurilor pentru care se afișeaza fațetele față sau fațetele spate. Dacă alegeți opțiunea să fie afișate doar fațetele spate, ar trebui să puteți vedea interiorul cubului :) : {{ :ppbg:laboratoare:cube2.png?600 |}} | ||
- | Bonus: Construiți și desenați un tetraedru care să aibă indicii fiecărui triunghiuri orientați în sens trigonometric, când triunghiul este privit din exterior. Asociați culori diferite fiecărui vârf pentru vedea mai ușor detaliile tetraedrului. | + | Bonus: Construiți și desenați un tetraedru care să aibă indicii fiecărui triunghiuri orientați în sens trigonometric, când triunghiul este privit din exterior. Asociați culori diferite fiecărui vârf pentru a vedea mai ușor detaliile tetraedrului. |