This shows you the differences between two versions of the page.
egc:laboratoare:05 [2017/10/26 01:53] florin_eugen.iancu |
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 general, fiecare 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 lume, adica 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 lumii, adică 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 scena, in 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 37: | Line 43: | ||
\\ | \\ | ||
- | 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 priveste, si este de asemenea normala la planul de vizualizare (planul fiind baza volumului de vizualizare, ce seamana cu o piramida si este marcat 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 inclinat, in mod intentionat, in 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 translatie. Daca 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ție. Dacă î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 2, deci coordonatele X, Y, Z intre +1 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 definit. Biblioteca **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ție. Proiecț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 proiectie. Proiectia 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 a 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 a 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 perspectiva, dupa 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 video, in 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 aplicatiei. In 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()'' | ||