Differences

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

Link to this comparison view

egc:teme:2022:03 [2022/12/19 00:02]
andrei.lapusteanu
egc:teme:2022:03 [2022/12/20 12:14] (current)
andrei.lapusteanu [Minor edit] Changed "Jucătorul" to "Jucător" in section "Construcția scenei"
Line 1: Line 1:
-<​hidden>​ 
 ======= Tema 3 - SkiFree 3D ======= ======= Tema 3 - SkiFree 3D =======
    
Line 16: Line 15:
 <​html>​ <​html>​
 <p style="​text-align:​center;​margin:​auto;">​ <p style="​text-align:​center;​margin:​auto;">​
-<iframe width="​600" height="​315"​ src="​https://​www.youtube.com/​embed/​wGcWqHtiNZQ"​ title="​YouTube video player"​ frameborder="​0"​ allow="​accelerometer;​ autoplay; clipboard-write;​ encrypted-media;​ gyroscope; picture-in-picture"​ allowfullscreen></​iframe>​+<iframe width="​560" height="​315"​ src="​https://​www.youtube.com/​embed/​wGcWqHtiNZQ"​ title="​YouTube video player"​ frameborder="​0"​ allow="​accelerometer;​ autoplay; clipboard-write;​ encrypted-media;​ gyroscope; picture-in-picture"​ allowfullscreen></​iframe>​
 </p> </p>
 </​html>​ </​html>​
Line 24: Line 23:
 Scena 3D va fi formată din: Scena 3D va fi formată din:
   * Terenul jocului (panta de ski)   * Terenul jocului (panta de ski)
-  * Jucătorul+  * Jucător
   * Obstacole și elemente colectabile   * Obstacole și elemente colectabile
   * Surse de lumină atașate obiectelor 3D   * Surse de lumină atașate obiectelor 3D
  
-<​note>​Este permisă importarea de mesh-uri create ​din aplicații de modelare 3D.</​note>​+<​note>​Este permisă importarea de mesh-uri create ​în aplicații de modelare 3D.</​note>​
  
 === Terenul jocului === === Terenul jocului ===
  
-Personajul se deplasează în lume (schiază pe pantă) și astfel își modifică coordonatele globale în lume. Obstacolele și cadourile ​stau fixe în scenă.+Personajul se deplasează în lume (schiază pe pantă) și astfel își modifică coordonatele globale în lume. Obstacolele și cadourile ​rămân la poziții ​fixe în scenă.
  
-Terenul va fi realizat ​cu un pătrat mare pe care va fi aplicată o textură ce se repetă.+Terenul va fi realizat ​folosind ​un pătrat ​(quad) ​mare pe care va fi aplicată o textură ce se repetă.
  
-Pentru a nu fi nevoie ​să generăm pătrate noi în timp ce se deplasează jucătorul pe pantă, pătratul va fi desenat în poziția jucătorului. Astfel, terenul stă lipit de personaj.+Pentru a nu fi nevoiți ​să generăm pătrate noi în timp ce se deplasează jucătorul pe pantă, pătratul va fi desenat în poziția jucătorului. Astfel, terenul stă lipit de personaj.
  
 Iluzia de mișcare a terenului sub personaj va fi dată de modificarea coordonatelor textură a terenului. Această modificare constă într-un deplasament aplicat tuturor UV-urilor mesh-ului terenului. Pentru a nu modifica mesh-ul terenului se trimite la shader-ul ce desenează terenul o uniformă de tipul vec2 ce reprezintă deplasamentul coordonatelor textură. Este important ca viteza cu care se modifică UV-urile să fie la fel cu viteza personajului,​ pentru ca un pixel din imagine să rămână la poziție fixă în lume. Iluzia de mișcare a terenului sub personaj va fi dată de modificarea coordonatelor textură a terenului. Această modificare constă într-un deplasament aplicat tuturor UV-urilor mesh-ului terenului. Pentru a nu modifica mesh-ul terenului se trimite la shader-ul ce desenează terenul o uniformă de tipul vec2 ce reprezintă deplasamentul coordonatelor textură. Este important ca viteza cu care se modifică UV-urile să fie la fel cu viteza personajului,​ pentru ca un pixel din imagine să rămână la poziție fixă în lume.
Line 46: Line 45:
 În următorul GIF este prezentată scena jocului dintr-un punct fix. Se observă generarea și ștergerea obstacolelor,​ faptul că terenul rămâne cu centrul la poziția jucătorului,​ precum și modalitatea prin care sunt modificate coordonatele de textură ale pantei pentru a reda iluzia de mișcare. În următorul GIF este prezentată scena jocului dintr-un punct fix. Se observă generarea și ștergerea obstacolelor,​ faptul că terenul rămâne cu centrul la poziția jucătorului,​ precum și modalitatea prin care sunt modificate coordonatele de textură ale pantei pentru a reda iluzia de mișcare.
  
-{{ :​egc:​teme:​2022:​egc_2022_t3_terrain_tex_anim.gif?​400 |}}+{{ :​egc:​teme:​2022:​egc_2022_t3_terrain_tex_anim.gif?​550 |}} 
 + 
 +<​note>​ 
 +Precum se observă și în animația de mai sus, terenul trebuie să aibă un unghi de înclinare, obiectele se vor genera pe această pantă înclinată. În demo am setat un unghi de înclinare de 30°. 
 +</​note>​
  
 === Jucătorul === === Jucătorul ===
  
-**Jucătorul** este format din cel puțin 3 paralelipipede (corp și cele două schiuri) – configurația se poate crea folosind primitivele disponibile în framework. Mesh-urile care alcătuiesc jucătorul ​trebui ​create astfel încât obiectul de tip jucător să poată fi translatat și rotit ca o singură unitate (mesh-urile să fie “ancorate” unele de celelalte). Mesh-urile ce alcătuiesc jucătorul nu trebuie texturate.+**Jucătorul** este format din cel puțin 3 paralelipipede (corp și cele două schiuri) – configurația se poate crea folosind primitivele disponibile în framework. Mesh-urile care alcătuiesc jucătorul ​trebuie ​create astfel încât obiectul de tip jucător să poată fi translatat și rotit ca o singură unitate (mesh-urile să fie “ancorate” unele de celelalte). Mesh-urile ce alcătuiesc jucătorul nu trebuie texturate ​(în mod obligatoriu).
  
 === Obstacole === === Obstacole ===
Line 67: Line 70:
 === Collectibles (cadouri) === === Collectibles (cadouri) ===
  
-În demo, obiectul de tip **collectible** a fost imaginat sub forma unui **cadou** pe care jucătorul îl poate colecta. Obiectul trebuie alcătuit dintr-un singur mesh de tip cub. Este obligatorie texturarea acestui ​tip de obiect.+În demo, obiectul de tip **collectible** a fost imaginat sub forma unui **cadou** pe care jucătorul îl poate colecta. Obiectul trebuie alcătuit dintr-un singur mesh de tip cub. Este obligatorie texturarea acestui obiect.
  
-Următoarea imagine prezintă tipurile de obiecte implementate în demo. De la stanga ​la dreapta se poate observa câte un exemplu de: jucător, copac, stâlp de iluminat, piatră și cadou.+Următoarea imagine prezintă tipurile de obiecte implementate în demo. De la stânga ​la dreapta se poate observa câte un exemplu de: jucător, copac, stâlp de iluminat, piatră și cadou.
  
 {{ :​egc:​teme:​2022:​egc_2022_t3_obiecte_3d.png?​500 |}} {{ :​egc:​teme:​2022:​egc_2022_t3_obiecte_3d.png?​500 |}}
Line 83: Line 86:
 Nu este necesar ca jucătorul să urmărească îndeaproape direcția dictată de către cursor. Este suficient ca acesta să se deplaseze stânga/​dreapta în niște limite impuse. Spre exemplu, în demo, direcția de deplasare a jucătorului poate fi controlată într-un interval de ±45°. Nu este necesar ca jucătorul să urmărească îndeaproape direcția dictată de către cursor. Este suficient ca acesta să se deplaseze stânga/​dreapta în niște limite impuse. Spre exemplu, în demo, direcția de deplasare a jucătorului poate fi controlată într-un interval de ±45°.
  
-Următorul GIF ilustrează controlul direcției de deplasare a jucătorului ​folsind ​poziția cursorului pe viewport.+Următorul GIF ilustrează controlul direcției de deplasare a jucătorului ​folosind ​poziția cursorului pe viewport.
  
 {{ :​egc:​teme:​2022:​egc_2022_t3_mouse_input_anim_v2.gif?​500 |}} {{ :​egc:​teme:​2022:​egc_2022_t3_mouse_input_anim_v2.gif?​500 |}}
Line 93: Line 96:
 ===== Poziționarea camerei ===== ===== Poziționarea camerei =====
  
-Camera va fi de tip perspectivă și va urmări jucătorul. Nu există o configurație impusă asupra poziționării acesteia atât timp cât camera implementată este de tip third person. În demo a fost aleasă o configurație a camerei similară jocului clasic – vă recomandăm această variantă – o perspectivă de tip third person din spatele jucătorului ar fi generat ​probleme deoarece obstacolele generate la run-time s-ar fi instanțiat în mod vizibil în fața acestuia (efect de “pop-in”).  ​+Camera va fi de tip perspectivă și va urmări jucătorul. Nu există o configurație impusă asupra poziționării acesteia atât timp cât camera implementată este de tip third person. În demo a fost aleasă o configurație a camerei similară jocului clasic – vă recomandăm această variantă – o perspectivă de tip third person din spatele jucătorului ar fi cauzat ​probleme deoarece obstacolele generate la run-time s-ar fi instanțiat în mod vizibil în fața acestuia (efect de “pop-in”).  ​
  
 ===== Generarea de obstacole și elemente colectabile ===== ===== Generarea de obstacole și elemente colectabile =====
Line 103: Line 106:
   * Algoritmul pentru generarea obstacolelor trebuie să ofere rezultate satisfăcătoare independent de direcția de deplasare a jucătorului   * Algoritmul pentru generarea obstacolelor trebuie să ofere rezultate satisfăcătoare independent de direcția de deplasare a jucătorului
  
-=== Coliziuni ===+===== Coliziuni ​=====
  
 Veți avea de implementat coliziuni între jucător și obstacole și între jucător și cadouri. Veți avea de implementat coliziuni între jucător și obstacole și între jucător și cadouri.
Line 119: Line 122:
 ===== Iluminare ===== ===== Iluminare =====
  
-Iluminare ​se va face prin trei tipuri de iluminare+Iluminarea scenei ​se va implementa folosind 3 tipuri de surse de lumină, anume
-  * Lumina va veni de la o sursă de lumină ​directională. Acest tip de iluminare emite lumina de aceeasi intensitate pentru ​toate obiectele din scena(ex. Soare). Nu este neaparată nevoie de reprezentarea sursei de lumina ​print-un obiect, însă se va verifica existența acesteia. ​Pentru aceasta puteti folosi o sursa de lumina punctiforma,​ care nu foloseste factor ​de atenuare+  * lumină ​**direcțională** va ilumina ​toate obiectele din scenă cu aceeași intensitate ​(ex. Soare). Nu este neapărat nevoie de reprezentarea sursei de lumină ​print-un obiect, însă se va verifica existența acesteia. ​Specific luminii ​de tip direcțional este faptul că vectorul luminii incidente (L) nu depinde ​de poziția luminii (precum în cazul luminilor de tip point și spot)Așadar, pentru fiecare fragment, iluminarea va fi calculată folosind același vector L (corespunzător direcției luminii). De exemplu, se poate alege ca lumina direcțională să aibă direcția sursei de lumină orientată direct în joc (perpendicular pe XoZ), așadar, direcția s-ar seta astfel: <code cpp>​glm::​vec3(0.f,​ -1.f, 0.f);</​code>​ 
-  * Stâlpii de iluminat vor emite două lumini de tip **spotlight** care vor porni din "​becurile"​ obiectului, respectiv din marginile paralelipiedului superior. Lumina trebuie ​sa se observe pe suprafata ​zăpezii. De asemenea, orice obiect care trece pe sub stalpul ​de iluminat va primi lumina aferenta "​becului"​ din stalp+  * Stâlpii de iluminat vor emite două lumini de tip **spotlight** care vor porni din "​becurile"​ obiectului, respectiv din marginile paralelipiedului superior. Lumina trebuie ​să se observe pe suprafața ​zăpezii. De asemenea, orice obiect care trece pe sub stâlpul ​de iluminat va fi iluminat de spot
-  * Colectabilele ​și pomii vor avea o sursa de lumina ​**punctiformă** de diverse culori poziționată ​undeva ​în scheletul ​obiectului. Componentele unei surse de lumină pot avea aceeasi ​culoare aleasă ​aleator ​sau dintr-o gamă mai larga de culori, ​însa NU toate obiectele vor emite aceeași culoare. În plus, fiecare sursă de lumină punctiformă va avea o arie de acoperire pentru lumina emisă, ​lucru controlat print-un factor de atenuare ​constrans ​de distanta ​dintre obiectul luminat și sursa de lumină. ​+  * Elementele colectabile ​și copacii ​vor avea o sursă ​de lumină ​**punctiformă**de diverse culoripoziționată în interiorul sau apropierea ​obiectului. Componentele unei surse de lumină pot avea aceeași ​culoare aleasă ​aleatoriu ​sau dintr-o gamă mai largă ​de culori, ​însă ​NU toate obiectele vor emite aceeași culoare. În plus, fiecare sursă de lumină punctiformă va avea o arie de acoperire pentru lumina emisă, ​fapt controlat print-un factor de atenuare ​constrâns ​de distanța ​dintre obiectul luminat și sursa de lumină. 
 + 
 +<note important>​Intensitatea luminilor de tip point și spot **trebuie** atenuată pe baza distanței (dintre sursă și punctul în care se calculează iluminarea). Lumina de tip direcțional **nu** trebuie atenuată.  
 + 
 +Precum este prezentat în demo, implementarea voastră trebuie să suporte **randarea mai multor surse de lumină în același frame!** 
 +</​note>​
  
 ===== Calcul și afișare scor ===== ===== Calcul și afișare scor =====
Line 132: Line 140:
 În continuare sunt prezentate câteva detalii referitoare la desfășurarea jocului care nu au fost acoperite în secțiunile anterioare: În continuare sunt prezentate câteva detalii referitoare la desfășurarea jocului care nu au fost acoperite în secțiunile anterioare:
   * După pornire, jocul este în desfășurare atât timp cât nu a fost detectată o coliziune cu un obstacol   * După pornire, jocul este în desfășurare atât timp cât nu a fost detectată o coliziune cu un obstacol
-  * În cazul în care s-a detectat o colizune ​între jucător și obstacol, obiectul de tip jucător este oprit din deplasare iar scorul este afișat în consolă. Este necesară implementarea unui funcționalități de resetare a jocului (de exemplu, la apăsarea unui taste) +  * În cazul în care s-a detectat o coliziune ​între jucător și obstacol, obiectul de tip jucător este oprit din deplasare iar scorul este afișat în consolă. Este necesară implementarea unui funcționalități de resetare a jocului (de exemplu, la apăsarea unui taste) 
-  * În cazul în care s-a detectat o colizune ​între jucător și obiect colectabil, scorul este incrementat iar obiectul colectabil este șters de pe ecran+  * În cazul în care s-a detectat o coliziune ​între jucător și obiect colectabil, scorul este incrementat iar obiectul colectabil este șters de pe ecran
  
 ===== Funcționalități obligatorii (150 puncte) ===== ===== Funcționalități obligatorii (150 puncte) =====
  
   * Texturare + asamblare obiecte 3D (55p)   * Texturare + asamblare obiecte 3D (55p)
-    * Desenare teren (15p) +    * Desenare teren înclinat ​(15p) 
-      * Desenare pătrat teren (5p)+      * Desenare pătrat ​(quad) ​teren (5p)
       * Modificare UV-uri pentru a reda efectul deplasării (10p)       * Modificare UV-uri pentru a reda efectul deplasării (10p)
-    * Cadouri (10p+    * Cadouri (8p
-    * Copaci (10p+    * Copaci (8p
-    * Stâlpi (10p+    * Stâlpi ​de iluminat ​(8p
-    * Jucător (10p+    * Jucător (8p) 
-  * Iluminare 40p +    * Pietre (8p
 +  * Iluminare ​(40p
     * Iluminare direcțională (10p)     * Iluminare direcțională (10p)
-    * Iluminare de tip spot de la stâlpi ​(15p) +    * Iluminare de tip spot atașată stâlpilor ​de iluminat ​(15p) 
-    * Iluminare ​copaci ​si cadouri ​(15p) +    * Iluminare ​punctiformă atașată copacilor ​si cadourilor ​(15p) 
-  * Gameplay ​(55p) +  * Elemente de gameplay ​(55p) 
-    * Deplasare jucător (10p)+    * Deplasare ​și orientare ​jucător (10p)
     * Coliziune jucător-obstacole (10p)     * Coliziune jucător-obstacole (10p)
     * Coliziune jucător-cadouri (7.5p)     * Coliziune jucător-cadouri (7.5p)
Line 160: Line 169:
 ===== Exemple de funcționalități bonus ===== ===== Exemple de funcționalități bonus =====
  
-  * Personajul să încetinească după coliziunea cu un obstacol, obstacolul să dispară și să îi scadă din viață jucătorului+  * Personajul să încetinească după coliziunea cu un obstacol, obstacolul să dispară și să îi scadă din viață jucătorului ​+ implementarea unui sistem de vieți precum și afișarea numărului de vieți rămase pe ecran (sub forma unui UI)
   * Mai multe tipuri de obstacole de același fel (mai mulți copaci sau mai multe pietre)   * Mai multe tipuri de obstacole de același fel (mai mulți copaci sau mai multe pietre)
-  * Cadouri cu scor diferit și care oferă jucătorului diferite abilități (să sară, să schieze mai repede etc.)+  * Cadouri cu scor diferit și care oferă jucătorului diferite abilități (să sară, să schieze mai repedeetc.)
   * Pomii să aibă mai multe surse de lumină (ca un brad împodobit),​ culorile luminilor să varieze în timp   * Pomii să aibă mai multe surse de lumină (ca un brad împodobit),​ culorile luminilor să varieze în timp
   * Coroana copacilor să sufere o deformare în timp prin intermediul vertex shader-ului (efect bătaie vânt)   * Coroana copacilor să sufere o deformare în timp prin intermediul vertex shader-ului (efect bătaie vânt)
  
-<note warning>​Orice ​funționalitate suplimentară implementată (care nu este inclusă în cerințele obligatorii) poate fi considerată ca punctaj bonus dacă este suficient de complexă. Funcționlitățile bonus se iau în considerare doar dacă funcționalitățile obligatorii au fost realizate.</​note>​+<note warning>​Orice ​funcționalitate suplimentară implementată (care nu este inclusă în cerințele obligatorii) poate fi considerată ca punctaj bonus dacă este suficient de complexă. Funcționalitățile bonus se iau în considerare doar dacă funcționalitățile obligatorii au fost realizate.</​note>​
  
 ===== Întrebări și răspunsuri ===== ===== Întrebări și răspunsuri =====
  
-Pentru întrebări vom folosi forumurile de pe moodle. Orice nu este menționat în temă este la latitudinea fiecărui student!+Pentru întrebări vom folosi forumurile de pe Moodle. Orice nu este menționat în temă este la latitudinea fiecărui student!
  
 ===== Notare ===== ===== Notare =====
Line 177: Line 186:
  
 <note warning> <note warning>
-Tema trebuie încărcată pe moodle. Pentru a fi punctată, tema trebuie prezentată la laborator. Vor exista laboratoare speciale de prezentare a temelor (care vor fi anunțate).</​note>​+Tema trebuie încărcată pe Moodle. Pentru a fi punctată, tema trebuie prezentată la laborator. Vor exista laboratoare speciale de prezentare a temelor (care vor fi anunțate).</​note>​
  
 ===== Indicații suplimentare ===== ===== Indicații suplimentare =====
Line 194: Line 203:
   * În cazul în care arhiva tot depășește limita de 50MB (nu ar trebui), puteți să ștergeți și folderul __**/​deps**__ sau __**/​assets**__ întrucât se pot adăuga la testare. Nu este recomandat să faceți acest lucru întrucât îngreunează mult testarea în cazul în care versiunea curentă a bibliotecilor/​resurselor diferă de versiunea utilizată la momentul scrierii temei.   * În cazul în care arhiva tot depășește limita de 50MB (nu ar trebui), puteți să ștergeți și folderul __**/​deps**__ sau __**/​assets**__ întrucât se pot adăuga la testare. Nu este recomandat să faceți acest lucru întrucât îngreunează mult testarea în cazul în care versiunea curentă a bibliotecilor/​resurselor diferă de versiunea utilizată la momentul scrierii temei.
 </​note>​ </​note>​
-</​hidden>​ 
  
egc/teme/2022/03.1671400930.txt.gz · Last modified: 2022/12/19 00:02 by andrei.lapusteanu
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