Differences

This shows you the differences between two versions of the page.

Link to this comparison view

egc:laboratoare:05 [2017/10/26 01:50]
florin_eugen.iancu [Spatiul de Vizualizare]
egc:laboratoare:05 [2024/11/05 12:26] (current)
andrei.lambru
Line 1: Line 1:
 ====== Laboratorul 05 ====== ====== Laboratorul 05 ======
 +**Video Laborator 5**: https://​youtu.be/​HOv-P8QnEAA\\
 +**Autor**: [[florineugen.iancu@gmail.com | Florin Iancu]]
  
-===== Spatiul Obiect ​=====+===== Spațiul obiectului ​=====
  
-Spatiul obiect ​mai este denumit ​si **SPATIUL ​COORDONATELOR LOCALE**+Spațiul obiectului ​mai este denumit ​și **SPAȚIUL ​COORDONATELOR LOCALE**.
  
-Pentru a putea lucra mai eficient ​si a reutiliza obiectele 3D definite, ​in general fiecare obiect este definit ​intr-un sistem de coordonate propriu. Obiectele simple sau procedurale pot fi definite direct din cod insa majoritatea obiectelor utilizate ​in aplicatiile ​3D sunt specificate ​in cadrul unui program de modelare ​gen **3D Studio Max**, **Maya**, **Blender**etc. Definind independent fiecare obiect 3D, putem sa ii aplicam ​o serie de transformari ​de rotatie, scalare ​si translatie ​pentru a reda obiectul ​in scena 3D. Un obiect ​incarcat ​poate fi afisat ​de mai multe ori prin utilizarea unor **//matrici de modelare//​**, ​cate una pentru fiecare ​instanta ​a obiectului ​initial, ce mentin transformarile ​3D aplicate acestor ​instante.+Pentru a putea lucra mai eficient ​și a reutiliza obiectele 3D definite, ​în generalfiecare obiect este definit ​într-un sistem de coordonate propriu. Obiectele simple sau procedurale pot fi definite direct din cod însă ​majoritatea obiectelor utilizate ​în aplicațiile ​3D sunt specificate ​în cadrul unui program de modelare ​precum ​**3D Studio Max**, **Maya**, **Blender** etc. Definind independent fiecare obiect 3D, putem să îi aplicăm ​o serie de transformări ​de rotație, scalare ​și translație ​pentru a reda obiectul ​în scena 3D. Un obiect ​încărcat ​poate fi afișat ​de mai multe ori prin utilizarea unor **//matrici de modelare//​**, ​câte una pentru fiecare ​instanță ​a obiectului ​inițial, ce mențin transformările ​3D aplicate acestor ​instanțe.
  
-In general, fiecare obiect 3D este definit cu centrul (sau centrul bazei ca in poza de mai jos) in originea propriului ​sau sistem de coordonate, deoarece ​in acest fel pot fi aplicate mai usor transformarile ​de modelare. Astfel, ​rotatia si scalarea ​fata de centrul propriu sunt efectuate ​intotdeauna fata de origine.+În general, fiecare obiect 3D este definit cu centrul (sau centrul bazei ca în poza de mai jos) în originea propriului ​său sistem de coordonate, deoarece ​în acest fel pot fi aplicate mai ușor transformările ​de modelare. Astfel, ​rotația și scalarea ​față ​de centrul propriu sunt efectuate ​întotdeauna față ​de origine.
  
  
-===== Spatiul Lume =====+===== Spațiul lumii =====
  
-Spatiul lume sau **SPATIUL ​COORDONATELOR GLOBALE** ​este reprezentat prin intermediul ​**//matricii ​de modelare//​**, ​aceeasi despre care s-a vorbit ​sus. Matricea se obtine ​printr-o serie de **rotatii**, **scalari** si **translatii**. Prin multiplicarea fiecarui varf al unui obiect (mesh 3D) cu aceasta ​matrice, obiectul va fi mutat din spatiul ​local in spatiul lumeadica se face trecerea de la coordonate locale la coordonate globale.+Transformarea din spațiul obiectului în spațiul lumii sau **SPAȚIUL ​COORDONATELOR GLOBALE** ​se numește transformare de modelare. Despre forma ei matriceală,​ cunoscută sub numele de **//matrice ​de modelare//​**,​ s-a discutat mai sus. Matricea se obține ​printr-o serie de **rotații**, **scalări** și **translații**. Prin înmulțirea fiecărui vertex ​al unui obiect (mesh 3D) cu această ​matrice, obiectul va fi mutat din spațiul ​local în spațiul lumiiadică ​se face trecerea de la coordonate locale la coordonate globale.
  
-Folosind matrici de modelare diferite putem amplasa un obiect ​in scena de mai multe ori, in locatii ​diferite, cu rotatie si scalare ​diferta daca este necesar. Un exemplu este prezentat ​in scena din dreapta.+Folosind matrici de modelare diferite putem amplasa un obiect ​în scenă ​de mai multe ori, în locații ​diferite, cu rotație și scalare ​diferită dacă este necesar. Un exemplu este prezentat ​în scena de mai jos.
  
 {{ :​egc:​laboratoare:​lab05:​use_model_matrix.png?​500 | World Space }} {{ :​egc:​laboratoare:​lab05:​use_model_matrix.png?​500 | World Space }}
  
-===== Spatiul ​de Vizualizare ​=====+===== Spațiul ​de vizualizare ​=====
  
-Spatiul ​de vizualizare sau **SPATIUL ​CAMEREI** este reprezentat ​de **matricea ​de vizualizare**.+Transformarea din spațiul lumii în spațiul ​de vizualizare sau **SPAȚIUL ​CAMEREI** este cunoscută sub numele ​de transformare ​de vizualizare.
  
-Matricea de modelare ​pozitioneaza ​obiectele ​in scenain spatiul lume. Dar o scena poate fi vizualizata ​din mai multe puncte de vedere. Pentru aceasta ​exista ​transformarea de vizualizare. +<​hidden>​ 
-Daca intr-o scena avem mai multe obiecte, fiecare obiect are o matrice de modelare ​diferita ​(care l-a mutat din spatiul obiect in spatiul ​lume), ​insa toate obiectele au aceeasi ​matrice de vizualizare. Transformarea de vizualizare este definita ​pentru ​intreaga scena.+Forma ei matriceala poartaeste reprezentat de **matricea de vizualizare**. 
 +</​hidden>​ 
 + 
 +Matricea de modelare ​poziționează ​obiectele ​în scenăîn spațiul lumii. Dar o scenă ​poate fi vizualizată ​din mai multe puncte de vedere. Pentru aceasta ​există ​transformarea de vizualizare. 
 +Dacă într-o scenă ​avem mai multe obiecte, fiecare obiect are o matrice de modelare ​diferită ​(care l-a mutat din spațiul obiectului în spațiul ​lume), ​însă ​toate obiectele au aceeași ​matrice de vizualizare. Transformarea de vizualizare este definită ​pentru ​întreaga scenă.
  
 {{ :​egc:​laboratoare:​lab05:​word_view_space.png | World Space and View Space}} {{ :​egc:​laboratoare:​lab05:​word_view_space.png | World Space and View Space}}
  
-In spatiul lume camera poate sa fie considerata ​ca un obiect ​avand cele 3 axe locale OX, OY, OZ (vezi poza). Matricea de vizualizare se poate calcula folosind ​functia ​''​glm::​lookAt''​.+În spațiul lumii, ​camera poate să fie considerată ​ca un obiect ​având ​cele 3 axe locale OX, OY, OZ (vezi poza). Matricea de vizualizare se poate calcula folosind ​funcția ​''​glm::​lookAt''​.
  
 <code cpp> <code cpp>
Line 34: Line 40:
  
 <​note>​ <​note>​
-{{ :​egc:​laboratoare:​asdf.png?​700 | World Space and View Space}}+{{ :​egc:​laboratoare:​asdf.png?​500 | World Space and View Space}}
 \\ \\
  
-Ox,Oy,Oz sunt axele sistemului de coordonate ​al lumii (spatiul ​scenei 3D). Punctul O nu este marcat ​in imagine. +Ox,Oy,Oz sunt axele sistemului de coordonate ​ale lumii (spațiul ​scenei 3D). Punctul O nu este marcat ​în imagine. 
-O’x’,​O’y’,​O’z’ sunt axele sistemului de coord. ​al observatorului (spatiul ​de vizualizare). Punctul O’ nu este marcat ​in imagine (este inauntrul ​aparatului).+O’x’,​O’y’,​O’z’ sunt axele sistemului de coordonate ​al observatorului (spațiul ​de vizualizare). Punctul O’ nu este marcat ​în imagine (este înăuntrul ​aparatului).
  
-Vectorul forward este directia in care observatorul ​privestesi este de asemenea normala la planul de vizualizare (baza piramidei de volumului de vizualizare, ​marcata ​cu contur portocaliu). Vectorul right este directia ​dreapta din punctul de vedere al observatorului. Vectorul ​¬up este directia ​sus din punctul de vedere al observatorului.+Vectorul ​**forward** este direcția în care observatorul ​priveșteși este de asemenea normala la planul de vizualizare (planul fiind baza volumului de vizualizare, ​ce seamănă cu o piramidă și este marcat ​cu contur portocaliu). Vectorul ​**right** este direcția ​dreapta din punctul de vedere al observatorului. Vectorul ​**up** ​este direcția ​sus din punctul de vedere al observatorului.
  
-In imagine, observatorul este un pic inclinatin mod intentionatin jos, fata de propriul sistem de axe. Cand observatorul este perfect aliniat cu axele, right coincide cu +x’, up coincide cu +y’, iar forward coincide cu -z’. ​In imagine, se poate vedea ca up nu coincide cu +y’, iar forward nu coincide cu -z’.+În imagine, observatorul este un pic înclinatîn mod intenționatîn jos, față ​de propriul sistem de axe. Când observatorul este perfect aliniat cu axele, right coincide cu +x’, up coincide cu +y’, iar forward coincide cu -z’. ​În imagine, se poate vedea că up nu coincide cu +y’, iar forward nu coincide cu -z’.
 </​note>​ </​note>​
  
-Vectorul "​up"​ se proiecteaza in planul de vizualizare,​ cu directia ​de proiectie paralela ​cu normala la planul de vizualizare. ​Proiectia ​acestuia ​da directia ​axei verticale a planului de vizualizare.+Vectorul "​up"​ se proiectează în planul de vizualizare,​ cu direcția ​de proiecție paralelă ​cu normala la planul de vizualizare. ​Proiecția ​acestuia ​dă direcția ​axei verticale a planului de vizualizare.
  
-In spatiul lume camera poate fi considerata ​un simplu obiect 3D asupra ​caruia aplicam transformarile ​de rotatie si translatieDaca in spatiul lume, camera poate fi pozitionata ​oriunde ​si poate avea orice orientare, ​in spatiul ​de vizualizare (spatiul ​observator) camera este intotdeauna pozitionata in (0,0,0), si priveste in directia ​OZ negativa.+În spațiul lumii camera poate fi considerată ​un simplu obiect 3D asupra ​căruia aplicăm transformările ​de rotație și translațieDacă în spațiul lumii, camera poate fi poziționată ​oriunde ​și poate avea orice orientare, ​în spațiul ​de vizualizare (spațiul ​observator) camera este întotdeauna poziționată în (0,​0,​0) ​și privește în direcția ​OZ negativă.
  
-Matricea de vizualizare ​contine transformari ​de rotatie si translatie, la fel ca si matricea de modelare. De aceea, ​daca tinem scena pe loc si mutam camera, sau daca tinem camera pe loc si rotim/translatam ​scena, ​obtinem acelasi ​efect:+Matricea de vizualizare ​conține transformări ​de rotație și translație, la fel ca și matricea de modelare. De aceea, ​dacă ținem ​scena pe loc și mutăm ​camera, sau dacă ținem ​camera pe loc și rotim/translatăm ​scena, ​obținem același ​efect:
  
 <​note>​ <​note>​
Line 56: Line 62:
 </​note>​ </​note>​
  
-Totusi, cele doua matrici au scopuri diferite. Una este folosita ​pentru ​pozitionarea ​obiectelor ​in scena, iar cealalta ​pentru vizualizarea ​intregii ​scene din punctul de vedere al camerei.+Totuși, cele două matrici au scopuri diferite. Una este folosită ​pentru ​poziționarea ​obiectelor ​în scenă, iar cealaltă ​pentru vizualizarea ​întregii ​scene din punctul de vedere al camerei.
  
 <​note>​ <​note>​
-**Exemplu:​** ​Daca vrem sa ne uitam pe axa **OX**(lume) din pozitia ​(3, 5, 7) codul corespunzator ​pentru ​functia ​glm::lookAt este:+**Exemplu:​** ​Dacă vrem să ne uităm ​pe axa **OX**(lume) din poziția ​(3, 5, 7) codul corespunzător ​pentru ​funcția ​glm::lookAt este:
  
 <code cpp> <code cpp>
Line 66: Line 72:
 </​note>​ </​note>​
  
-===== Spatiul de Proiectie ​=====+===== Proiecții ​=====
  
 +După aplicarea transformării de vizualizare,​ în spațiul de vizualizare,​ camera se află în origine și privește înspre **–OZ**. Pentru a putea vizualiza pe ecran această informație este necesar să se facă proiecția spațiului vizualizat de cameră într-un spațiu 2D. Cum spațiul vizibil al camerei poate fi de diferite feluri, cel mai adesea trunchi de piramida (**proiecție perspectivă**) sau paralelipiped (**proiecție ortografică**),​ în OpenGL este necesară trecerea într-un spațiu final numit spațiu de proiecție ce reprezintă un **//cub//** centrat în origine cu dimensiunea 2, deci coordonatele X, Y, Z între -1 și +1.
  
-Dupa aplicarea transformarii ​de vizualizare,​ in spatiul de vizualizare camera se afla in origine si priveste inspre **–OZ**. Pentru a putea vizualiza pe ecran aceasta informatie ​este necesar sa se faca proiectia spatiului vizualizat de camera intr-un spatiu ​2D. Cum spatiul vizibil al camerei poate fi de diferite feluri, cel mai adesea trunchi de piramida (**proiectie perspectiva**) sau paralelipiped (**proiectie ortografica**) in OpenGL este necesara trecerea intr-un spatiu final numit spatiu de Proiectie ce reprezinta un **//cub//** centrat in origine cu dimensiunea 2deci coordonatele X, Y, Z intre +si -1.+Din spațiul ​de proiecție ​este foarte ușor matematic să obținem proiecția finală ​2D pe viewport fiind nevoie doar să mapăm informația din cubul [-1,1] scalată corespunzător pe viewport-ul definit de aplicație.
  
-Din spatiul ​de proiectie este foarte usor matematic sa obtinem proiectia finala 2D pe viewport fiind nevoie doar sa mapam informatia din cubul [-1,1] scalata corespunzator pe viewport-ul definit de aplicatie.+==== Matricea ​de proiecție ====
  
-==== Matricea ​de Proiectie ====+Trecerea din spațiul ​de vizualizare în spațiul de proiecție se face tot utilizând o matrice, denumită **matrice de proiecție**,​ calculată în funcție de tipul de proiecție definit. Biblioteca **GLM** oferă funcții de calcul pentru cele mai utilizate 2 metode de proiecție în aplicațiile 3D, anume: proiecția **perspectivă** și **ortografică**
  
-Trecerea ​din spatiul ​de vizualizare ​in spatiul de proiectie se face tot utilizand o matrice, denumita ​**matrice ​de proiectie**, calculata in functie ​de tipul de proiectie definitBiblioteca **GLM** ofera functii de calcul pentru cele mai utilizate 2 metode de proiecte in aplicatiile 3D, anume: proiectia **perspectiva** si **ortografica**+Datele (vertecșii ​din spațiul ​de vizualizare) sunt înmulțite cu **matricea ​de proiecție** pentru a se obține pozițiile corespunzătoare din spațiul ​de proiecție.
  
-Datele (varfurile din spatiul de vizualizare) sunt inmultite cu **matricea de proiectie** pentru a se obtine pozitiile corespunzatoare din spatiul de proiectie.+==== Proiecția ortografică ====
  
-==== Proiectia Ortografica ==== +În proiecția ortografică ​observatorul este plasat la infinit. ​Distanța până ​la geometrie nu influențează proiecția și deci nu se poate determina vizibil din proiecțieProiecția ortografică păstrează ​paralelismul liniilor din scenă.
- +
-In proiectia ortografica ​observatorul este plasat la infinit. ​Distanta pana la geometrie nu influenteaza proiectia si deci nu se poate determina vizibil din proiectieProiectia ortografica pastreaza ​paralelismul liniilor din scena.+
  
 {{ :​egc:​laboratoare:​lab05:​ortographic_view.png | Ortographic Projection }} {{ :​egc:​laboratoare:​lab05:​ortographic_view.png | Ortographic Projection }}
  
-Proiectia ortografica ​este definita ​de latimea si inaltimea ​ferestrei de vizualizare ​cat si distantei ​de vizualizare dintre planul **din apropiere** ​si planul **din departare**. In afara acestui volum obiectele nu vor mai fi vazute ​pe ecran.+Proiecția ortografică ​este definită ​de lățimea și înălțimea ​ferestrei de vizualizare ​cât și distanței ​de vizualizare dintre planul **din apropiere** ​și planul **din depărtare**. În afara acestui volum obiectele nu vor mai fi văzute ​pe ecran.
  
 {{ :​egc:​laboratoare:​lab05:​ortographic_matrix.png | Ortographic Matrix }} {{ :​egc:​laboratoare:​lab05:​ortographic_matrix.png | Ortographic Matrix }}
  
-Matricea de proiectie ​poate fi calculata utilizand functia ​''​glm::​ortho''​ unde punctele **left, right, bottom, top** sunt relative ​fata de centrul ferestrei (0, 0) si definesc **inaltimea** si **latimea ​ferestrei de proiectie**+Matricea de proiecție ​poate fi calculată utilizând funcția ​''​glm::​ortho''​ unde punctele **left, right, bottom, top** sunt relative ​față ​de centrul ferestrei (0, 0) și definesc **înălțimea** și **lățimea ​ferestrei de proiecție**
  
 <code cpp> <code cpp>
Line 95: Line 100:
 </​code>​ </​code>​
  
-==== Proiectia Perspectiva ​====+==== Proiecția perspectivă ​====
  
-Proiectia perspectiva ​este reprezentata ​de un trunchi de piramida ​(frustum) definit prin cele 2 planuri, **cel din apropiere** ​si **cel din departare**, cat si de deschiderea unghiurilor de vizualizare pe cele 2 axe, OX si OY. In proiectia perspectiva distanta pana la un punct din volumul de vizualizare ​influenteaza proiectia.+Proiecția perspectivă ​este reprezentată ​de un trunchi de piramidă ​(frustum) definit prin cele 2 planuri, **cel din apropiere** ​și **cel din depărtare**, cât și de deschiderea unghiurilor de vizualizare pe cele 2 axe, OX și OY. În proiecția perspectivă distanța până ​la un punct din volumul de vizualizare ​influențează proiecția.
  
 {{ :​egc:​laboratoare:​lab05:​perspective_view.png | Perspective View }} {{ :​egc:​laboratoare:​lab05:​perspective_view.png | Perspective View }}
  
-Matricea de proiectie in acest caz poate fi calculata ​cu ajutorul ​funectiei ​''​glm::​perspective''​ ce primeste ​ca si parametri deschiderea unghiului de vizualizare pe orizontala ​(**Field of View - FoV**), raportul dintre ​latimea ai inaltimea ​ferestrei de vizualizare (**aspect ratio**), ​cat si distanta pana la cele 2 planuri zFar si zNear.+Matricea de proiecție în acest caz poate fi calculată ​cu ajutorul ​funcției ​''​glm::​perspective''​ ce primește ​ca parametri deschiderea unghiului de vizualizare pe orizontală ​(**Field of View - FoV**), raportul dintre ​lățimea și înălțimea ​ferestrei de vizualizare (**aspect ratio**), ​cât și distanța până ​la cele 2 planuri zFar și zNear. 
 + 
 +<code cpp> 
 +glm::mat4 Projection = glm::​perspective(float fov, float aspect, float zNear, float zFar); 
 +</​code>​
  
 {{ :​egc:​laboratoare:​lab05:​perspective_matrix.png | Perspective Matrix }} {{ :​egc:​laboratoare:​lab05:​perspective_matrix.png | Perspective Matrix }}
  
-In cazul proiectiei perspectivadupa inmutirea ​coordonatelor din spatiul ​view, componenta w a fiecarui ​vertex este diferita, ceea ce inseamna ca spatiul ​de proiecte ​nu e acelasi ​pentru fiecare ​varf. Pentru a aduce toti vectorii ​in acelasi spatiu ​se imparte ​fiecare ​componenta ​a vectorului rezultat cu **componenta w**. Aceasta operatie ​este realizata ​automat de placa videoin cadrul unei aplicatii ​fiind nevoie doar de inmultirea ​cu matricea de proiectie.+În cazul proiecției perspectivădupă înmuțirea ​coordonatelor din spațiul ​view, componenta w a fiecărui ​vertex este diferită, ceea ce înseamnă că spațiul ​de proiecție ​nu e același ​pentru fiecare ​vertex. Pentru a aduce toți vectorii ​în același spațiu ​se împarte ​fiecare ​componentă ​a vectorului rezultat cu **componenta w**. Această operație ​este realizată ​automat de procesorul graficîn cadrul unei aplicații ​fiind nevoie doar de înmulțirea ​cu matricea de proiecție.
  
  
 {{ :​egc:​laboratoare:​lab05:​perspective_correction.png | Normalized Device Coordinate Space }} {{ :​egc:​laboratoare:​lab05:​perspective_correction.png | Normalized Device Coordinate Space }}
  
-Volum de vizualizare ​perspectiva ​(**stanga**) si rezultatul ​obtinut ​(**dreapta**) ​in urma aplicarii transformarii ​de proiectie ​asupra geometriei din scena+Volum de vizualizare ​perspectivă ​(**stânga**) și rezultatul ​obținut ​(**dreapta**) ​în urma aplicării transformării ​de proiecție ​asupra geometriei din scenă
  
-===== Spatiul Coordonatelor ​de Dispozitiv Normalizate ​(NDC) =====+===== Spațiul coordonatelor ​de dispozitiv normalizate ​(NDC) =====
  
-Dupa aplicarea ​transformarilor ​de **Modelare**,​ **Vizualizare** ​si **Proiectie** iar apoi **divizarea cu W** a vectorilor, se obtine spatiul ​de coordonate normalizate (**NDC**) reprezentat de un CUB centrat ​in origine (0, 0, 0) cu latura 2. Informatia ​din acest cub se poate proiecta foarte ​usor pe orice suprafata ​2D de desenare ​definita ​de utilizator.+După aplicarea ​transformărilor ​de **Modelare**,​ **Vizualizare** ​și **Proiecție** iar apoi **divizarea cu W** a vectorilor, se obține spațiul ​de coordonate normalizate (**NDC**) reprezentat de un CUB centrat ​în origine (0, 0, 0) cu latura 2. Informația ​din acest cub se poate proiecta foarte ​ușor pe orice suprafață ​2D de desenare ​definită ​de utilizator.
  
 {{ :​egc:​laboratoare:​lab05:​NDC.png | Normalized Device Coordinate Space }} {{ :​egc:​laboratoare:​lab05:​NDC.png | Normalized Device Coordinate Space }}
  
-Exemplu rezultat al proiectiei in coordonate dispozitiv normalizate (**NDC**). ​Proiectie ​**ortografica** (stanga), **perspectiva** (dreapta)+Exemplu rezultat al proiecției în coordonate dispozitiv normalizate (**NDC**). ​Proiecție ​**ortografică** (stânga), **perspectivă** (dreapta)
  
 {{ :​egc:​laboratoare:​lab05:​NDC2.png?​700 | Normalized Device Coordinate Space }} {{ :​egc:​laboratoare:​lab05:​NDC2.png?​700 | Normalized Device Coordinate Space }}
  
-Exemplu vizualizare **spatiu ​NDC** din directia ​camerei (**stanga**) si **proiectia** corespunzatoare ​pentru un anumit viewport (**dreapta**)+Exemplu vizualizare **spațiu ​NDC** din direcția ​camerei (**stânga**) și **proiecția** corespunzătoare ​pentru un anumit viewport (**dreapta**)
  
  
-===== Aplicarea ​Transformarilor ​de Modelare, Vizualizare ​si Proiectie ​=====+===== Aplicarea ​Transformărilor ​de Modelare, Vizualizare ​și Proiecție ​=====
  
-Aplicarea ​trasformarilor ​de **Modelare, Vizualizare ​si Proiectie** se face prin inmultirea fiecarui varf al geometriei din scena cu cele 3 matrici calculate.+Aplicarea ​trasformărilor ​de **Modelare, Vizualizare ​și Proiecție** se face prin înmulțirea fiecărui vertex ​al geometriei din scenă ​cu cele 3 matrici calculate.
  
 <code cpp> <code cpp>
Line 134: Line 143:
  
 <​note>​ <​note>​
-In cadrul laboratorului trebuie doar sa calculam ​aceste matrici ​si sa le trimitem ca parametru ​functiei ​de randare ''​RenderMesh''​. ​Inmultirile ​respective sunt executate pe placa video in cadrul programului vertex shader ce va fi introdus ​incepand ​cu laboratorul ​urmator.+În cadrul laboratorului trebuie doar să calculăm ​aceste matrici ​și să le trimitem ca parametru ​funcției ​de randare ''​RenderMesh''​. ​Înmulțirile ​respective sunt executate pe procesorul grafic în cadrul programului vertex shader ce va fi introdus ​începând ​cu laboratorul ​următor.
 </​note>​ </​note>​
  
-===== Transformari ​de Camera ​=====+===== Transformări ​de Cameră ​=====
  
-Implementarea unei camere ​in cadrul unei aplicatii ​3D depinde de cerintele aplicatieiIn practica ​cele mai utilizate tipuri de implementari ​de camera ​sunt: **First person** ​si **Third person**.+Implementarea unei camere ​în cadrul unei aplicații ​3D depinde de cerințele aplicațieiÎn practică ​cele mai utilizate tipuri de implementări ​de cameră ​sunt: **First person** ​și **Third person**.
  
 ==== First-person Camera ==== ==== First-person Camera ====
  
-Camera de tipul **First-person** presupune faptul ​ca scena 3D este vizualizata ​din perspectiva ochilor unui observator, adesea uman. Constrangerile ​de implementare sunt urmatoarele:+Camera de tipul **First-person** presupune faptul ​că scena 3D este vizualizată ​din perspectiva ochilor unui observator, adesea uman. Constrângerile ​de implementare sunt următoarele:
  
-=== Translatia ​camerei First-person ===+=== Translația ​camerei First-person ===
  
-  * translatiile ​**fata/spate** se calculeaza utilizand ​vectorul **forward** (directia ​de vizualizare sau proiectia ​acestuia ​in planul orizontal XOZ) +  * translațiile ​**față/spate** se calculează utilizând ​vectorul **forward** (direcția ​de vizualizare sau proiecția ​acestuia ​în planul orizontal XOZ) 
-  * translatiile ​sus/jos se calculeaza utilizand ​vectorul local Up sau cel mai adesea **directia ​OY globala** (''​glm::​vec3(0,​ 1, 0)''​) +  * translațiile ​sus/jos se calculează utilizând ​vectorul local Up sau cel mai adesea **direcția ​OY globală** (''​glm::​vec3(0,​ 1, 0)''​) 
-  * translatiile ​dreapta/stanga ​se calculeaza ​folosind vectorul local **right** (ce se poate obtine si prin operatia ​de **cross product** ​intre vectorii **forward** ​si **up**)sau folosind ​proiectia ​acestuia pe planul orizontal **XOZ**+  * translațiile ​dreapta/stânga ​se calculează ​folosind vectorul local **right** (ce se poate obține și prin operația ​de **cross product** ​între ​vectorii **forward** ​și **up**) sau folosind ​proiecția ​acestuia pe planul orizontal **XOZ**
  
 <code cpp> <code cpp>
Line 155: Line 164:
 </​code>​ </​code>​
  
-=== Rotatia ​camerei First-person ===+=== Rotația ​camerei First-person ===
  
-  * rotatiile ​se fac pastrand ​observatorul pe loc si modificand directia in care priveste ​acesta +  * rotațiile ​se fac păstrând ​observatorul pe loc și modificând direcția în care privește ​acesta 
-  * pentru ​rotatia ​**stanga/dreapta**, vectorii **forward** respectiv **right** se pot calcula prin aplicarea ​transformarii ​de rotatie in jului axei OY globale. Se poate roti si in jurul axei **OY locale** (**vectorul up**), ​insa in in general nu prea are aplicabilitate ​practica +  * pentru ​rotația ​**stânga/dreapta**, vectorii **forward** respectiv **right** se pot calcula prin aplicarea ​transformării ​de rotație în jului axei OY globale. Se poate roti și în jurul axei **OY locale** (**vectorul up**), ​însă în general nu prea are aplicabilitate ​practică 
-  * **vectorul up** se poate recalcula folosind **cross product** ​intre **right** ​si **forward**+  * **vectorul up** se poate recalcula folosind **cross product** ​între ​**right** ​și **forward**
 <code cpp> <code cpp>
 forward = RotateWorldOY(angle) * forward; forward = RotateWorldOY(angle) * forward;
Line 166: Line 175:
 </​code>​ </​code>​
  
-  * rotatia ​**sus/jos** se poate face rotind vectorii **forward** respectiv **up** ​ ​in ​jurul vectorului **axei OX** adica ** vectorul right** (right ​ramane ​constant)+  * rotația ​**sus/jos** se poate face rotind vectorii **forward** respectiv **up** ​în jurul vectorului **axei OX** adică ​** vectorul right** (right ​rămâne ​constant)
 <code cpp> <code cpp>
 forward = RotateLocalOX(angle) * forward; forward = RotateLocalOX(angle) * forward;
Line 173: Line 182:
  
 <note tip> <note tip>
-Matricile de rotatie ​necesare se pot calcula folosind ​functia ​''​glm::​rotate''​+Matricile de rotație ​necesare se pot calcula folosind ​funcția ​''​glm::​rotate''​
  
 <code cpp> <code cpp>
Line 179: Line 188:
 </​code>​ </​code>​
  
-  * primul parametru ​reprezinta ​o **matrice de modelare** asupra ​careia aplicam ​transformarea ​specificata. Atunci ​cand nu avem o transformare ​precedenta ​se porneste ​de la matricea identitate ''​glm::​mat4(1.0f)''​ \\  +  * primul parametru ​reprezintă ​o **matrice de modelare** asupra ​căreia aplicăm ​transformarea ​specificată. Atunci ​când nu avem o transformare ​precedentă ​se pornește ​de la matricea identitate ''​glm::​mat4(1.0f)''​ \\  
-  * **rotationAxis** este axa fata de care rotim. ​In cazul nostru pentru ​rotatia fata de **OX** este vectorul **right**, pentru ​rotatia fata de **OZ** este vectorul **forward**,​ sau ''​glm::​vec3(0,​ 1, 0)''​ pentru ​rotatia fata de **OY global** \\  +  * **rotationAxis** este axa față ​de care rotim. ​În cazul nostru pentru ​rotația față ​de **OX** este vectorul **right**, pentru ​rotația față ​de **OZ** este vectorul **forward**,​ sau ''​glm::​vec3(0,​ 1, 0)''​ pentru ​rotația față ​de **OY global** \\  
-  * intrucat ​vectorii ​utilizati ​sunt ''​glm::​vec3'' ​cand facem inmultirea ​va trebui ​sa construim un vector de 4 componente ca sa putem inmulti ​cu matricea de 4x4. Puteti ​construi vectorul astfel: \\+  * întrucât ​vectorii ​utilizați ​sunt ''​glm::​vec3'' ​când facem înmulțirea ​va trebui ​să construim un vector de 4 componente ca să putem înmulți ​cu matricea de 4x4. Puteți ​construi vectorul astfel: \\
 <code cpp> <code cpp>
 glm::vec3 forward = ... glm::vec3 forward = ...
 glm::vec4 newVec = glm::​vec4(forward,​ 1.0); glm::vec4 newVec = glm::​vec4(forward,​ 1.0);
 </​code>​ </​code>​
-  * Daca vrem sa rotim vectorul "​forward" ​in jurul **axei OY globale** atunci facem astfel:+  * Dacă vrem să rotim vectorul "​forward" ​în jurul **axei OY globale** atunci facem astfel:
 <​code>​ <​code>​
  
Line 193: Line 202:
  
 // extract the vec3 vector and then normalize it // extract the vec3 vector and then normalize it
-forward = glm::​normalize(glm::​vec3(newVector);​+forward = glm::​normalize(glm::​vec3(newVector));
  
 </​code>​ </​code>​
Line 200: Line 209:
  
 <note important>​ <note important>​
-Dupa ce ati facut calculele de rotatie aveti grija sa pastrati ​vectorii ​normalizati+După ce ați făcut ​calculele de rotație aveți grijă să păstrați ​vectorii ​normalizați
 <code cpp> <code cpp>
 glm::vec3 vector = ... glm::vec3 vector = ...
Line 209: Line 218:
 ==== Third-person Camera ==== ==== Third-person Camera ====
  
-In cazul camerei de tip Third-person **observatorul** se muta in jurul unui obiect de interes, ce reprezinta intotdeauna ​centrul ​atentiei. Deci rotatiile ​se fac intr-un mod diferit+În cazul camerei de tip Third-person **observatorul** se mută în jurul unui obiect de interes, ce reprezintă întotdeauna ​centrul ​atenției. Deci rotațiile ​se fac într-un mod diferit
  
-=== Rotatia ​Camerei Third-person ===+=== Rotația ​Camerei Third-person ===
  
-  * se translateaza ​observatorul pe directia ​de vizualizare ​in punctul de interes (target) +  * se translatează ​observatorul pe direcția ​de vizualizare ​în punctul de interes (target) 
-  * se aplica rotatia ​de tip **First-person** ​specifica +  * se aplică rotația ​de tip **First-person** ​specifică 
-  * se traslateaza ​observatorul ​inapoi ​pe noua directie ​de vizualizare cu aceasi distanta+  * se traslatează ​observatorul ​înapoi ​pe noua direcție ​de vizualizare cu aceeași distanță
  
 <note important>​ <note important>​
-In laborator ​aveti variabila distanceToTarget care retine distanta pana la punctul ​fata de care rotim+În laborator ​aveți ​variabila distanceToTarget care reține distanța până ​la punctul ​față ​de care rotim
 </​note>​ </​note>​
  
  
-=== Translatia ​Camerei Third-person ===+=== Translația ​Camerei Third-person ===
  
-Pozitia ​camerei depinde de pozitia ​punctului de interes. Astfel, ​miscarea ​punctului de interes va  determina ​si translatia ​camerei ​in mod corespunzator.+Poziția ​camerei depinde de poziția ​punctului de interes. Astfel, ​mișcarea ​punctului de interes va  determina ​și translația ​camerei ​în mod corespunzător.
  
-===== Cerinte ​laborator =====+===== Cerințe ​laborator =====
  
-  - Descarcati ​[[https://​github.com/​UPB-Graphics/​Framework-EGC/​archive/​master.zip|framework-ul de laborator]] +  - Descarcăți ​[[https://​github.com/​UPB-Graphics/​Framework-EGC/​archive/​master.zip|framework-ul de laborator]] 
-  - Sa se implementeze camera de tip First Person (fisierul __LabCamera.h__) +  - Să se implementeze camera de tip First Person (fișierul __lab_camera.h__) 
-  - Sa se implementeze camera de tip Third Person (fisierul __LabCamera.h__)  +  - Să se implementeze camera de tip Third Person (fișierul __lab_camera.h__)  
-  - Sa se completeze ​functiile ​de translatie a camerei din ''​Laborator5::​OnInputUpdate()''​ +  - Să se completeze ​funcțiile ​de translație ale camerei din ''​Lab5::​OnInputUpdate()''​ 
-  - Sa se completeze ​functiile ​de rotatie a camerei din ''​Laborator5::​OnMouseMove()''​ +  - Să se completeze ​funcțiile ​de rotație ale camerei din ''​Lab5::​OnMouseMove()''​ 
-  - Sa se deseneze ​inca 2 obiecte ​in scena 3D avand rotatia/scalarea/translatia ​diferite +  - Să se deseneze ​încă ​2 obiecte ​în scena 3D având rotația/scalarea/translația ​diferite 
-    * Aveti grija sa setati ​matricea de modelare de fiecare ​data inainte ​de desenare +    * aveți grijă să setați ​matricea de modelare de fiecare ​dată înainte ​de desenare 
-    * Utilizati ​''​glm::​translate()'',​ ''​glm::​rotate()'' ​si ''​glm::​scale()''​ pentru a construi o matrice de modelare pentru fiecare obiect. +    * utilizați ​''​glm::​translate()'',​ ''​glm::​rotate()'' ​și ''​glm::​scale()''​ pentru a construi o matrice de modelare pentru fiecare obiect 
-  - Schimbare ​proiectie perspectiva/ortografica +  - Schimbare ​proiecție perspectivă/ortografică 
-    * **tasta O** face trecerea ​in proiectie ortografica +    * **tasta O** face trecerea ​în proiecție ortografică 
-    * **tasta P** face trecerea ​in proiectie perspectiva +    * **tasta P** face trecerea ​în proiecție perspectivă 
-  - Sa se modifice FoV-ul camerei ​in cazul proiectiei ​persepective +  - Să se modifice FoV-ul camerei ​în cazul proiecției ​persepective 
-    * folositi ​2 taste pentru a modifica pozitiv ​si negativ FoV-ul+    * folosiți ​2 taste pentru a modifica pozitiv ​și negativ FoV-ul
     * se va folosi ''​OnInputUpdate()''​     * se va folosi ''​OnInputUpdate()''​
-  - Sa se modifice ​latimea si/sau inaltimea ​ferestrei de proiectie in cazul proiectiei ​ortografice+  - Să se modifice ​lățimea și/sau înălțimea ​ferestrei de proiecție în cazul proiecției ​ortografice
     * se va folosi ''​OnInputUpdate()''​     * se va folosi ''​OnInputUpdate()''​
  
egc/laboratoare/05.1508971844.txt.gz · Last modified: 2017/10/26 01:50 by florin_eugen.iancu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0