Differences

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

Link to this comparison view

egc:teme:2019:03 [2019/12/05 09:30]
andrei.lambru
egc:teme:2019:03 [2020/01/14 08:42] (current)
alexandru.gradinaru
Line 1: Line 1:
-<​hidden>​ 
 ======= Tema 3 - Worms 3D ======= ======= Tema 3 - Worms 3D =======
  
   * **Responsabili:​** Cristi Lambru   * **Responsabili:​** Cristi Lambru
-  * **Lansare:​** ​decembrie+  * **Lansare:​** ​decembrie
   * **Termen de predare:** 12 ianuarie 2020, ora 23:55   * **Termen de predare:** 12 ianuarie 2020, ora 23:55
   * **Notă: Orice informație ce nu a fost acoperită în acest document este la latitudinea voastră!**   * **Notă: Orice informație ce nu a fost acoperită în acest document este la latitudinea voastră!**
  
-In cadrul temei 3 trebuie ​sa implementati ​versiunea de Worms in 3D cu teren deformabil. ​In continuare este prezentat un demo cu functionalitatile minimale.+În cadrul temei 3 trebuie ​să implementați ​versiunea de Worms în 3D cu teren deformabil. ​În continuare este prezentat un demo cu toate funcționalitățile de bază.
  
-====== ​Construcția terenului =====+<​html>​ 
 +<p style="​text-align:​center;​margin:​auto;">​ 
 +<iframe width="​560"​ height="​315"​ src="​https://​www.youtube.com/​embed/​yLusrCTcpwM"​ frameborder="​0"​ allow="​accelerometer;​ autoplay; encrypted-media;​ gyroscope; picture-in-picture"​ allowfullscreen></​iframe>​ 
 +</​p>​ 
 +</​html>​
  
-===== Harta de inălțimi ​=====+===== Construcția terenului ===== 
 + 
 +==== Harta de inălțimi ====
  
 Definim o suprafață de baleiere descrisă de funcția: Definim o suprafață de baleiere descrisă de funcția:
Line 22: Line 27:
  
 $$ $$
-f(x,z) = texture2D(unitTexture,vec2 (u,v)).r+f(x,z) = texture2D(textureUnit,vec2 (u,v)).r
 $$ $$
  
 unde $\{u, v\}$ reprezintă coordonatele de textură asociate coordonatelor spațiale $\{x,z\}$. unde $\{u, v\}$ reprezintă coordonatele de textură asociate coordonatelor spațiale $\{x,z\}$.
  
-Aceste tipuri de texturicare descriu suprafețe de baleierese numesc hărți de inalțime sau **height maps**. Ele conțin în fiecare pixel o singură informație în $[0,255]$ (normalizată $[0,1]$), pe un singur canal, ce reprezintă înălțimea zonei acoperite de pixelul respectiv. Un exemplu de astfel de textură se poate vedea mai jos.+Aceste tipuri de texturi care descriu suprafețe de baleiere se numesc hărți de inalțimi sau **height maps**. Ele conțin în fiecare pixel o singură informație în $[0,255]$ (normalizată $[0,1]$), pe un singur canal, ce reprezintă înălțimea zonei acoperite de pixelul respectiv. Un exemplu de astfel de textură se poate vedea mai jos.
  
 {{ :​egc:​teme:​2019:​heightmap.png?​nolink&​200 |}} {{ :​egc:​teme:​2019:​heightmap.png?​nolink&​200 |}}
  
-===== Geometria suport ​=====+==== Geometria suport ====
  
 Pentru a putea crea o suprafață definită de înălțimea dată de textură este necesară o geometrie suport care să cuprindă toate coordonatele $\{x,z\}$ finale. De asemenea, este necesar ca fiecărui vertex să i se asocieze o coordonată de textură, $\{u,v\} \in [0, 1]$, normalizată între limitele pe $x$ și pe $y$ ale geometriei suport. Pentru a putea crea o suprafață definită de înălțimea dată de textură este necesară o geometrie suport care să cuprindă toate coordonatele $\{x,z\}$ finale. De asemenea, este necesar ca fiecărui vertex să i se asocieze o coordonată de textură, $\{u,v\} \in [0, 1]$, normalizată între limitele pe $x$ și pe $y$ ale geometriei suport.
Line 37: Line 42:
 {{ :​egc:​teme:​2019:​terrain1.png?​nolink&​600 |}} {{ :​egc:​teme:​2019:​terrain1.png?​nolink&​600 |}}
  
-Geometria suport se desenează cu un shader special, care la pasul de vertex shader accesează textura în care se află înălțimile. Prin interogarea texturii se obține înălțimea de la coordonatele $\{u,​v\} ​\in [0,1]$, asociate vertexului. Această valoare se poate asocia direct coordonatei $y$ a vertexului sau se poate scala pentru un impact mai mare al terenului.+Geometria suport se desenează cu un shader special, care la pasul de vertex shader accesează textura în care se află înălțimile. Prin interogarea texturii se obține înălțimea de la coordonatele $\{u,v\}$, asociate vertexului. Această valoare se poate asocia direct coordonatei $y$ a vertexului sau se poate scala pentru un impact mai mare al terenului.
  
 {{ :​egc:​teme:​2019:​terrain2.png?​nolink&​600 |}} {{ :​egc:​teme:​2019:​terrain2.png?​nolink&​600 |}}
  
-===== Calculul normalelor ​=====+==== Calculul normalelor ====
  
 Pentru a putea lumina terenul este necesară calcularea informației de normală. Tehnica pe care o vom folosi se numește "​aproximare prin diferențe finite"​ și utilizează informația vecinilor pixelului din care s-a interogat înălțimea vertexului curent. Pentru a putea lumina terenul este necesară calcularea informației de normală. Tehnica pe care o vom folosi se numește "​aproximare prin diferențe finite"​ și utilizează informația vecinilor pixelului din care s-a interogat înălțimea vertexului curent.
  
-  * Se obține înălțimea de la poziția ​curentă, de la poziția ​din dreapta și de la cea de sus.+  * Se obține înălțimea de la pixelul ​curent, de la cel din dreapta și cel de sus.
  
 $$ $$
Line 79: Line 84:
 {{ :​egc:​teme:​2019:​terrain4.png?​nolink&​600 |}} {{ :​egc:​teme:​2019:​terrain4.png?​nolink&​600 |}}
  
-====== Deformarea terenului ​======+===== Deformarea terenului =====
  
-===== Buffer-ul ​hartii ​de inaltimi =====+==== Buffer-ul ​hărții ​de înălțimi ​====
  
-  * Pentru a avea acces la buffer-ul de pixeli al imaginii este necesar să fie încărcată direct cu librăria [[https://​github.com/​nothings/​stb|stb_image]]. ​Această librărie ​se află deja în framework și cu ajutorul ei se poate încărca întreaga matrice de pixeli a unui fișier. Se poate folosi direct imaginea ​incarcata in aceasta pagina. <code cpp>#​include <​stb/​stb_image.h>​+  * Pentru a avea acces la buffer-ul de pixeli al imaginii este necesar ​ca aceasta ​să fie încărcată direct cu librăria [[https://​github.com/​nothings/​stb|stb_image]]. ​Aceasta ​se află deja în framework și cu ajutorul ei se poate încărca întreaga matrice de pixeli a unui fișier. Se poate folosi direct imaginea ​din această pagină. <code cpp>#​include <​stb/​stb_image.h>​
  
-stbi_set_flip_vertically_on_load(true);​ 
 heightPixels = stbi_load((textureLoc + "​heightmap.png"​).c_str (), &width, &​height,​ &​channels,​ STBI_grey); heightPixels = stbi_load((textureLoc + "​heightmap.png"​).c_str (), &width, &​height,​ &​channels,​ STBI_grey);
 </​code>​ </​code>​
  
-  * Buffer-ul ''​heightPixels''​ păstrează toată informația imaginii într-o zonă continuă de memorie în care in prima parte se găsește prima linie de pixeli (fiecare pixel are un singur canal de culoare), urmată de a doua linie de pixeli ș.a.m.d. Pentru a incarca ​buffer-ul ​in memoria procesorului grafic se foloseste: <code cpp>​glTexImage2D(GL_TEXTURE_2D,​ 0, GL_R8, width, height, 0, GL_RED, GL_UNSIGNED_BYTE,​ (void*)heightPixels);​+  * Buffer-ul ''​heightPixels''​ păstrează toată informația imaginii într-o zonă continuă de memorie în care în prima parte se găsește prima linie de pixeli (fiecare pixel are un singur canal de culoare), urmată de a doua linie de pixeli ș.a.m.d. Pentru a încărca ​buffer-ul ​în memoria procesorului grafic se folosește: <code cpp>​glTexImage2D(GL_TEXTURE_2D,​ 0, GL_R8, width, height, 0, GL_RED, GL_UNSIGNED_BYTE,​ (void*)heightPixels);​
 </​code>​ </​code>​
  
   * Pentru modificarea texturii pur și simplu se modifică o zonă de pixeli din imagine, în interiorul acestui buffer și se reîncarcă buffer-ul în procesorul grafic cu directiva de mai sus.   * Pentru modificarea texturii pur și simplu se modifică o zonă de pixeli din imagine, în interiorul acestui buffer și se reîncarcă buffer-ul în procesorul grafic cu directiva de mai sus.
  
-====== Gameplay ======+===== Gameplay ===== 
 + 
 +Jocul va fi multiplayer local în care pe rând fiecare jucător va prelua controlul a două personaje aflate în zone diferite ale terenului. Fiecare jucător va avea la dispoziție un singur proiectil pe tură. Acesta va avea o cameră third-person asupra personajului pentru a putea potrivi ținta. Odată decis, la apasărea butonului click stânga de la mouse, proiectilul este lansat și este urmărit de cameră fără ca jucătorul să mai aibă control. La impactul proiectilului cu terenul, acesta va lăsa în urmă un crater. La urmatoarea tură se schimbă personajul. 
 + 
 +===== Bonusuri posibile ​===== 
 + 
 +  * Crearea de efecte speciale la impactul proiectilului cu terenul 
 +  * Adăugarea unei ținte sau a unor săgeți de ghidaj ale proiectilului 
 +  * Adăugarea de cer cu textură 
 +  * Adăugarea de UI pentru viață/​jucător curent 
 +  * Orice îmbunătățește vizual scena
  
 ===== Notare (150p) ===== ===== Notare (150p) =====
-  * Construcția terenului ​(50p) +  * Construcție teren (50p) 
-  * Deformarea terenului ​(50p) +  * Deformare teren (50p) 
-  * Camera ​third person + lansare proiectil (20p) +  * Cameră ​third person + lansare proiectil (20p) 
-  * Deplasare proiectil + camera observatie ​(20p) +  * Deplasare proiectil + crater + cameră observație ​(20p) 
-  * Lumini spot deasupra celor doua personaje (10p)+  * Lumini spot deasupra celor două personaje (10p)
  
 ===== Arhivarea proiectului ===== ===== Arhivarea proiectului =====
Line 118: Line 132:
 </​note>​ </​note>​
  
-</​hidden>​ 
egc/teme/2019/03.1575531019.txt.gz · Last modified: 2019/12/05 09:30 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