This shows you the differences between two versions of the page.
egc:teme:2019:10 [2019/12/04 23:41] andrei.lambru |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Tema 3 - Worms 3D ===== | ||
- | |||
- | * **Responsabili:** Cristian Lambru | ||
- | * **Lansare:** 6 decembrie | ||
- | * **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ă!** | ||
- | |||
- | În cadrul temei 2 trebuie să implementați un joc în care sunteți un aviator ce nu trebuie să se lovească de obstacole și nici să rămână fără combustibil pentru avion. | ||
- | |||
- | ===== Constructia Terenului ===== | ||
- | |||
- | ==== Harta de Inaltimi ==== | ||
- | |||
- | Definim o suprafata de baleiere descrisa de functia: | ||
- | |||
- | $$ | ||
- | f(x,z) = y | ||
- | $$ | ||
- | |||
- | Datorita constructiei, o astfel de suprafata poate fi determinata direct de continutul unei texturi in urmatorul mod: | ||
- | |||
- | $$ | ||
- | f(x,z) = texture2D(unitTexture,vec2 (u,v)).r | ||
- | $$ | ||
- | |||
- | unde $\{u, v\}$ reprezinta coordonatele de textura asociate coordonatelor spatiale $\{x,z\}$. | ||
- | |||
- | Aceste tipuri de texturi care descriu suprafete de baleiere se numesc harti de inaltime sau **height maps**. Ele contin in fiecare pixel o singura informatie in $[0,255]$ (normalizat $[0,1]$), pe un singur canal, ce reprezinta inaltimea zonei acoperite de pixelul respectiv. Un astfel de exemplu de textura se poate vedea mai jos. | ||
- | |||
- | {{ :egc:teme:2019:heightmap.png?nolink&200 |}} | ||
- | |||
- | ==== Geometria Suport ==== | ||
- | |||
- | Pentru a putea crea o suprafata definita de inaltimea data de textura este necesara o geometrie suport care sa cuprinda toate coordonatele $\{x,z\}$ finale si toate coordonatele y egale cu 0. De asemenea, fiecarui vertex trebuie sa i se asocieze o coordonata de textura, $\{u,v\} \in [0, 1]$, normalizata intre limitele geometriei pe $x$ si pe $y$. In mod particular, geometria din imaginea de mai jos a fost generata cu $100$ de linii si $100$ de coloane, pe o suprafata de $5$x$5$ unitati. | ||
- | |||
- | {{ :egc:teme:2019:terrain1.png?nolink&600 |}} | ||
- | |||
- | Geometria suport se deseneaza cu un shader special, care la pasul de vertex shader acceseaza textura in care se afla inaltimile. Prin interogarea texturii se obtine inaltimea de la coordonatele $\{u,v\} \in [0,1]$, asociate vertexului. Aceasta valoare se poate asocia direct coordonatei $y$ a vertexului sau se poate scala pentru un impact mai mare al terenului. Rezultatul in urma desenarii geometriei suport descrise anterior, cu textura de inaltimi de mai sus, pe care s-a aplicat un factor de scalare al inaltimilor de $2$ se poate observa mai jos. | ||
- | |||
- | {{ :egc:teme:2019:terrain2.png?nolink&600 |}} | ||
- | |||
- | ==== Calculul Normalelor ==== | ||
- | |||
- | Pentru a putea lumina terenul este necesara informatia de normale. Tehnica pe care o vom folosi se numeste "diferente finite" si utilizeaza informatia vecinilor pixelului din care s-a interogat inaltimea vertexului curent. | ||
- | |||
- | Se obtine inaltimea de la pozitia curenta, de la pozitia din dreapta si din fata (axa z). | ||
- | |||
- | $$ | ||
- | height = texture2D(heightMap,vec2(u,v)).r \\ | ||
- | $$ | ||
- | $$ | ||
- | texelSize = vec2 (1.0/heightMapSize.x, 1.0/heightMapSize.y) \\ | ||
- | heightRight = texture2D(heightMap,vec2(u+texelSize.x,v)).r \\ | ||
- | heightUp = texture2D(heightMap,vec2(u,v+texelSize.y)).r | ||
- | $$ | ||
- | |||
- | Calculam diferentele pe $x$ si pe $z$. | ||
- | |||
- | $$ | ||
- | H_x = height - heightRight \\ | ||
- | H_z = height - heightUp \\ | ||
- | $$ | ||
- | |||
- | Normala va fi reprezentata de vectorul unitate determinat de cele doua diferente finite pe $x$ si pe $z$. | ||
- | |||
- | $$ | ||
- | normal = normalize(vec3(H_x, 2, H_z)) | ||
- | $$ | ||
- | |||
- | <note tip> | ||
- | Deoarece diferentele dintre height si vecini pot fi destul de mici, este recomandat sa folositi un factor de scalare pentru $H_x$ si $H_y$. | ||
- | </note> | ||
- | |||
- | Rezultatul dupa calcularea normalelor si adaugarea in scena a unei lumini in centrul terenului: | ||
- | |||
- | {{ :egc:teme:2019:terrain3.png?nolink&600 |}} | ||
- | |||
- | Pentru a adauga o textura de "pamant" pe teren se poate crea o noua coordonata de textura sau se poate folosi o scalare a coordonatelor de textura folosite pentru harta de inaltimi impreuna cu parametrul ''GL_REPEAT'' de impachetare al texturii. | ||
- | |||
- | $$ | ||
- | (u_2,v_2) = (u,v) * 20 | ||
- | $$ | ||
- | |||
- | Rezultatul final in urma aplicarii luminii si a texturii de "pamant" se poate observa in imaginea de mai jos. | ||
- | |||
- | {{ :egc:teme:2019:terrain4.png?nolink&600 |}} | ||
- | |||
- | <note tip>Mai multe informatii despre coliziuni si cum se pot implementa in 3D: | ||
- | * [[https://developer.mozilla.org/en-US/docs/Games/Techniques/3D_collision_detection]] | ||
- | </note> | ||
- | |||
- | === Bonusuri Posibile === | ||
- | Pe lângă obstacole sau combustibil, pot să existe și alte obiecte specifice în scenă ce aduc anumite beneficii/dezavantaje (de exemplu, o sferă galbenă poate aduce o viață în plus sau un cub verde face avionul invincibil pentru o perioadă de timp, sau poate trage proiectile pentru distrugerea obstacolelor etc.). | ||
- | |||
- | === Notare (150p) === | ||
- | * Construcția terenului (total 50p) | ||
- | * Constructie geometrie (25p) | ||
- | * Calcal normale (15p) | ||
- | * Iluminare teren (10p) | ||
- | * Deformarea terenului (50p) | ||
- | * Animatie proiectil (20p) | ||
- | * Camera third person (10p) | ||
- | * Camera panoramica proiectil (10p) | ||
- | * | ||
- | |||
- | === Arhivarea proiectului === | ||
- | |||
- | <note> | ||
- | * În mod normal arhiva trebuie să conțină toate resursele necesare compilării și rulării | ||
- | * Înainte de a face arhiva asigurați-vă că ați dat clean la proiect | ||
- | * Click dreapta pe proiect în **Solution Explorer** -> **Clean Solution**, sau | ||
- | * Ștergeți folderul __**/Visual Studio/obj**__ | ||
- | * Ștergeți fișierul __**/Visual Studio/Framework_EGC.sdf**__ (în caz că există) | ||
- | * Ștergeți fișierul __**/Visual Studio/Framework_EGC.VC.db**__ (în caz că există) | ||
- | * Ștergeți folderul __**/.vs**__ (în caz că există) | ||
- | * Ștergeți folderul __**/x64**__ sau __**/x86**__ (în caz că există) | ||
- | * Executabilul final este generat în folderul __**/x86**__ sau __**/x64**__ la finalul link-editării în funcție de arhitectura aleasă la compilare (32/64 biți) | ||
- | * În cazul în care arhiva tot depășește limita de 20MB (nu ar trebui), puteți să ștergeți și folderul __**/libs**__ sau __**/Resources**__ î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> | ||