Differences

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

Link to this comparison view

egc:laboratoare:05 [2019/10/28 13:15]
ovidiu.dinu [First-person Camera]
egc:laboratoare:05 [2023/11/08 21:51] (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 Obiect =====
Line 5: Line 7:
 Spațiul obiect mai este denumit și **SPAȚIUL COORDONATELOR LOCALE**. Spațiul obiect 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 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.+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.
Line 12: Line 14:
 ===== Spațiul Lume ===== ===== Spațiul Lume =====
  
-Spațiul lume sau **SPAȚIUL COORDONATELOR GLOBALE** ​este reprezentat prin intermediul ​**//matricei ​de modelare//​**, ​aceeași despre care s-a vorbit ​mai 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 obiect în spațiul lume 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 lume, 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 de mai jos. 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.
Line 20: Line 22:
 ===== 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 lume în spațiul de vizualizare sau **SPAȚIUL CAMEREI** este cunoscută sub numele de transformare de vizualizare. 
 + 
 +<​hidden>​ 
 +Forma ei matriceala poartaeste ​reprezentat de **matricea de vizualizare**. 
 +</​hidden>​
  
 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. 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.
Line 66: Line 72:
 </​note>​ </​note>​
  
-===== Spațiul de Proiecție ===== +===== 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. 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.
Line 102: Line 107:
  
 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. 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 184: Line 193:
 <code cpp> <code cpp>
 glm::vec3 forward = ... glm::vec3 forward = ...
-glm::vec4 newVec = glm::​vec4(forward, ​0.0);+glm::vec4 newVec = glm::​vec4(forward, ​1.0);
 </​code>​ </​code>​
   * Dacă vrem să rotim vectorul "​forward"​ în jurul **axei OY globale** atunci facem astfel:   * Dacă vrem să rotim vectorul "​forward"​ în jurul **axei OY globale** atunci facem astfel:
Line 190: Line 199:
  
 // get the rotate vec4 vector // get the rotate vec4 vector
-glm::vec4 newVector = glm::​rotate(glm::​mat4(1.0f),​ angle, glm::​vec3(0,​ 1, 0)) * glm::​vec4(forward, ​0);+glm::vec4 newVector = glm::​rotate(glm::​mat4(1.0f),​ angle, glm::​vec3(0,​ 1, 0)) * glm::​vec4(forward, ​1);
  
 // 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 (fișierul ​__LabCamera.h__) +  - Să se implementeze camera de tip First Person (fișierul ​__lab_camera.h__) 
-  - Să se implementeze camera de tip Third Person (fișierul ​__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
egc/laboratoare/05.1572261302.txt.gz · Last modified: 2019/10/28 13:15 by ovidiu.dinu
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