Differences

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

Link to this comparison view

egc:laboratoare:05 [2019/10/27 12:27]
andrei.lambru
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]]
  
-===== Spațiul ​Obiect ​=====+===== Spațiul ​obiectului ​=====
  
-Spațiul ​obiect ​mai este denumit și **SPAȚIUL COORDONATELOR LOCALE**+Spațiul ​obiectului ​mai este denumit și **SPAȚIUL COORDONATELOR LOCALE**.
  
-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 ​gen **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.+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.
  
 Î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. Î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.
  
  
-===== Spațiul ​Lume =====+===== Spațiul ​lumii =====
  
-Spațiul lume sau **SPAȚIUL COORDONATELOR GLOBALE** ​este reprezentat prin intermediul ​**//matricii ​de modelare//​**, ​aceeași despre care s-a vorbit ​sus. Matricea se obține printr-o serie de **rotații**,​ **scalări** și **translații**. Prin multiplicarea ​fiecărui vertex al unui obiect (mesh 3D) cu această matrice, obiectul va fi mutat din spațiul local în spațiul ​lume, adică 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 î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 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 }}
  
-===== Spațiul de Vizualizare ​=====+===== Spațiul de vizualizare ​=====
  
-Spațiul de vizualizare sau **SPAȚIUL 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 poziționează obiectele în scenă, în spațiul ​lume. Dar o scenă poate fi vizualizată din mai multe puncte de vedere. Pentru aceasta există transformarea de vizualizare. +<​hidden>​ 
-Dacă într-o scenă avem mai multe obiecte, fiecare obiect are o matrice de modelare diferită (care l-a mutat din spațiul ​obiect ​în spațiul lume), însă toate obiectele au aceeași matrice de vizualizare. Transformarea de vizualizare este definită pentru întreaga scenă.+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}}
  
-În spațiul ​lume 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''​.+Î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 38: Line 44:
  
 Ox,Oy,Oz sunt axele sistemului de coordonate ale lumii (spațiul scenei 3D). Punctul O nu este marcat în 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 (spațiul de vizualizare). Punctul O’ nu este marcat în imagine (este înăuntrul 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 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. 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.
Line 47: Line 53:
 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. 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.
  
-În spațiul ​lume camera poate fi considerata ​un simplu obiect 3D asupra căruia aplicăm transformările de rotație și translație. Dacă în spațiul ​lume, 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ă.+Î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 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: 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:
Line 66: Line 72:
 </​note>​ </​note>​
  
-===== Spațiul de Proiecție =====+===== Proiecții =====
  
- +După aplicarea transformării de vizualizare,​ în spațiul de vizualizarecamera 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.
-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 ​perspectiva**) 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.+
  
 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 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.
  
-==== Matricea de Proiecție ====+==== Matricea de proiecție ====
  
 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 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ă**
Line 79: Line 84:
 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 (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.
  
-==== Proiecția ​Ortografică ====+==== Proiecția ​ortografică ====
  
 Î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ă. Î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ă.
Line 95: Line 100:
 </​code>​ </​code>​
  
-==== Proiecția ​Perspectivă ====+==== Proiecția ​perspectivă ====
  
 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. 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.
Line 101: Line 106:
 {{ :​egc:​laboratoare:​lab05:​perspective_view.png | Perspective View }} {{ :​egc:​laboratoare:​lab05:​perspective_view.png | Perspective View }}
  
-Matricea de proiecție în acest caz poate fi calculată cu ajutorul funcției ''​glm::​perspective''​ ce primește ca și 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.+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 }}
Line 110: Line 119:
 {{ :​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) =====
  
 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. 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.
Line 127: Line 136:
 ===== Aplicarea Transformărilor de Modelare, Vizualizare și Proiecție ===== ===== Aplicarea Transformărilor de Modelare, Vizualizare și Proiecție =====
  
-Aplicarea trasformărilor de **Modelare, Vizualizare și Proiecție** se face prin înmulțirea fiecărui vertex 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 137: Line 146:
 </​note>​ </​note>​
  
-===== Transformări de Camera ​=====+===== Transformări de Cameră ​=====
  
 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**. 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**.
Line 149: Line 158:
   * translațiile **față/​spate** se calculează utilizând vectorul **forward** (direcția de vizualizare sau proiecția acestuia în 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)
   * translațiile sus/jos se calculează utilizând vectorul local Up sau cel mai adesea **direcția OY globală** (''​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)''​)
-  * 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**+  * 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 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 229: Line 238:
  
   - Descarcăți [[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]]
-  - Să se implementeze camera de tip First Person (fisierul __LabCamera.h__) +  - Să se implementeze camera de tip First Person (fișierul __lab_camera.h__) 
-  - Să se implementeze camera de tip Third Person (fisierul __LabCamera.h__)  +  - Să se implementeze camera de tip Third Person (fișierul __lab_camera.h__)  
-  - Să se completeze funcțiile de translație ale camerei din ''​Laborator5::​OnInputUpdate()''​ +  - Să se completeze funcțiile de translație ale camerei din ''​Lab5::​OnInputUpdate()''​ 
-  - Să se completeze funcțiile de rotație ale camerei din ''​Laborator5::​OnMouseMove()''​+  - Să se completeze funcțiile de rotație ale camerei din ''​Lab5::​OnMouseMove()''​
   - Să se deseneze încă 2 obiecte în scena 3D având rotația/​scalarea/​translația diferite   - Să se deseneze încă 2 obiecte în scena 3D având rotația/​scalarea/​translația diferite
-    * Aveți grijă să setați matricea de modelare de fiecare dată înainte de desenare +    * aveți grijă să setați matricea de modelare de fiecare dată înainte de desenare 
-    * Utilizați ''​glm::​translate()'',​ ''​glm::​rotate()''​ și ''​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 proiecție perspectivă/​ortografică   - Schimbare proiecție perspectivă/​ortografică
     * **tasta O** face trecerea în proiecție ortografică     * **tasta O** face trecerea în proiecție ortografică
egc/laboratoare/05.1572172057.txt.gz · Last modified: 2019/10/27 12:27 by andrei.lambru
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