This shows you the differences between two versions of the page.
ppbg:tema:2024 [2024/12/10 19:03] andrei.lambru |
ppbg:tema:2024 [2024/12/10 19:57] (current) andrei.lambru |
||
---|---|---|---|
Line 29: | Line 29: | ||
Geometria suport se realizează pe CPU și se trimite la desenare pentru a se deforma conform următorilor pași. | Geometria suport se realizează pe CPU și se trimite la desenare pentru a se deforma conform următorilor pași. | ||
- | În ce de-al doilea pas, se realizează deformarea geometriei suport conform unei hărți de înălțimi, similar precum în [[ppbg::laboratoare:08 | laboratorul 8]]. Rezultatul acestei operații se poate observa în imaginea de mai jos. | + | În ce de-al doilea pas, se realizează deformarea geometriei suport conform unei hărți de înălțime, similar precum în [[ppbg::laboratoare:08 | laboratorul 8]]. Rezultatul acestei operații se poate observa în imaginea de mai jos. |
{{ :ppbg:tema:terrain2.png?600 |}} | {{ :ppbg:tema:terrain2.png?600 |}} | ||
- | Suprafața deformată la pasul anterior se colorează prin eșantionarea a două texturi, pe baza inălțimii suprafeței, similar precum în bonusul din [[ppbg::laboratoare:08 | laboratorul 8]]. Rezultatul se poate vedea în următoarea imagine. | + | Suprafața deformată la pasul anterior se colorează prin eșantionarea a două texturi, pe baza inălțimii suprafeței, similar precum în bonusul din [[ppbg::laboratoare:08 | laboratorul 8]]. Rezultatul se poate vizualiza în următoarea imagine. |
{{ :ppbg:tema:terrain3.png?600 |}} | {{ :ppbg:tema:terrain3.png?600 |}} | ||
Line 43: | Line 43: | ||
Pentru a crea efectul vizual de curbură a geometriei, se utilizează o abordare simplă ce oferă rezultate satisfăcătoare :). | Pentru a crea efectul vizual de curbură a geometriei, se utilizează o abordare simplă ce oferă rezultate satisfăcătoare :). | ||
- | Rezultatul este doar un efect vizual ce curbează geometria în jurul elicopterului, astfel că acesta poate ajunge la limita geometriei lumii, altfel spus la capătul ei și să și depășească acest capăt :) . | + | Rezultatul este doar un efect vizual ce curbează geometria în jurul elicopterului, astfel că acesta poate ajunge la limita geometriei lumii. |
</note> | </note> | ||
Line 138: | Line 138: | ||
<note> | <note> | ||
- | Aveți libertate să utilizați orice texturi doriți voi, împreună cu modificarea numărului de niveluri, comportamentului de împrăștiere a ramurilor pe un nivel, numărul de ramuri pe un nivel și regula de colorare prezentată mai sus, atâta timp cât texturile alese de voi și modificările realizate urmăresc scopul de simulare a suprafeței componentelor unui copac și au un rezultat vizual similar. | + | Aveți libertate să utilizați orice texturi doriți voi, împreună cu modificarea numărului de niveluri, comportamentului de împrăștiere a ramurilor pe un nivel, numărul de ramuri pe un nivel și regula de colorare prezentată mai sus, atâta timp cât texturile alese de voi și modificările realizate urmăresc scopul de simulare a suprafeței componentelor unui copac. |
</note> | </note> | ||
Line 146: | Line 146: | ||
<note important> | <note important> | ||
- | Pentru o deformare suplimentara a geometriei copacului, în procesul de desenare a ierarhiei de paralelipipede, se utilizează opțiunea 1 de plasare pe suprafața asteroidului, descrisă mai sus. | + | Pentru o deformare suplimentară a geometriei copacului, în procesul de desenare a ierarhiei de paralelipipede, se utilizează opțiunea 1 de plasare pe suprafața asteroidului, descrisă mai sus. |
</note> | </note> | ||
==== Procesul de selecție ==== | ==== Procesul de selecție ==== | ||
- | Pentru a realiza procesul de selectie, se deseneaza toata scena intr-un obiect de tip framebuffer creat de voi. Acest framebuffer contine 2 texturi de culoare: | + | Pentru a realiza procesul de selecție, se desenează toată scena într-un obiect de tip framebuffer creat de voi. Acest framebuffer conține 2 texturi de culoare: |
- | - O textura de culoare in care se salveaza culoarea propriu-zisa a obiectelor; | + | - O textură de culoare în care se salvează culoarea propriu-zisă a obiectelor; |
- | - O textura de culoare in care se salveaza informatie suplimentara pentru fiecare obiect in parte. | + | - O textură de culoare în care se salvează informație suplimentară pentru fiecare obiect în parte. |
<note tip> | <note tip> | ||
- | Pentru cea de-a doua textura de culoare din obiectul de tip framebuffer creat de voi, utilizati informatie de tip ''RGBA32F'' si tipul de data ''float''. | + | Pentru cea de-a doua textură de culoare din obiectul de tip framebuffer creat de voi, utilizați informație de tip ''RGBA32F'' și tipul de dată ''float''. |
</note> | </note> | ||
- | Pentru a afisa informatia din prima textura de culoare in fereastra, trebuie copiat continutul primei texturi de culoare din obiectul de tip framebuffer creat de voi in textura de culoare a obiectului de tip framebuffer implicit, ce apartine ferestrei. Pentru acest proces, puteti utiliza urmatorul cod: | + | Pentru a afișa informația din prima textură de culoare pe ecranul fereastrei date de sistemul de operare, trebuie copiat conținutul primei texturi de culoare din obiectul de tip framebuffer creat de voi în textura de culoare a obiectului de tip framebuffer implicit, ce aparține ferestrei. Pentru acest proces, puteți utiliza următorul cod: |
<code cpp> | <code cpp> | ||
Line 170: | Line 170: | ||
</code> | </code> | ||
- | Texturile de culoare din interiorul obiectului de tip framebuffer creat de voi trebuie sa aiba aceeasi dimensiune precum textura de culoare din interiorul obiectului de tip framebuffer implicit, ce apartine ferestrei. Acest cod trebuie utilizat la finalul cadrului. | + | Texturile de culoare din interiorul obiectului de tip framebuffer creat de voi trebuie să aibă aceeași dimensiune precum textura de culoare din interiorul obiectului de tip framebuffer implicit, ce aparține ferestrei. Acest cod trebuie utilizat la finalul cadrului. |
- | === Selectie destinatie === | + | === Selecție destinație === |
- | Pentru a realiza procesul de selectie a destinatiei, in canalele de culoarea RGB, ale celei de-a doua texturi de culoare ale obiectului de tip framebuffer creat de voi, pastrati **coordonata (x, 0, z) a geometriei suport, dupa pasul de deformare pe baza hartii de inaltime si inainte de deformarea pe baza curburii**. Cele 2 texturi de culoare pot fi vazute in imaginea de mai jos: | + | Pentru a realiza procesul de selecție a destinației, în canalele de culoare RGB ale celei de-a doua texturi de culoare ale obiectului de tip framebuffer creat de voi, trebuie să se păstreze **coordonata (x, 0, z) a geometriei suport, după pasul de deformare pe baza hărții de înălțime și înainte de deformarea pe baza curburii**. Cele două texturi de culoare pot fi văzute în imaginea de mai jos: |
- | {{ :ppbg:tema:terrain5.png?800 |}} | + | {{ :ppbg:tema:terrain5.png?700 |}} |
- | Rezultatul vizual din imagine este obtinut dupa aplicarea deformarii pe baza curburii, dar coordonata (x, 0, z) pastrata in cea de-a doua textura de culoare este cea calculata inainte de realizarea curburii. | + | Rezultatul vizual din imagine este obținut după aplicarea deformării pe baza curburii, dar coordonata (x, 0, z) păstrată în cea de-a doua textură de culoare este cea calculată înainte de realizarea curburii. Această coordonată este utilizată pentru specificarea locației de destinație a elicopterului, fără să se țină cont de deformarea suprafeței asteroidului. Aceasta din urmă este doar un efect vizual realizat în vertex shader, cum s-a menționat anterior. |
- | Pentru a extrage coordonata (x, 0, z) din cea de-a doua textura de culoare din obiectul de tip framebuffer creat de voi, la momentul apasarii butonului dreapta de la mouse de catre utilizator, extrageti informatia din pixelul la care se afla cursorul la momentul apasarii butonului. Codul pentru acest proces arata in felul urmator: | + | Pentru a extrage coordonata (x, 0, z) din cea de-a doua textură de culoare din obiectul de tip framebuffer creat de voi, la momentul apăsării butonului dreapta de la mouse de către utilizator, trebuie extrasă informația din pixelul în dreptul căruia se află cursorul la momentul apăsării butonului. Codul pentru acest proces arată în felul următor: |
<code cpp> | <code cpp> | ||
Line 195: | Line 195: | ||
</code> | </code> | ||
- | === Selectie obiect === | + | === Selecție obiect === |
- | Pentru a realiza procesul de selectie a unui obiect, se pastreaza suplimentar in canalul A din cea de-a doua textura de culoare a obiectului de tip framebuffer creat de voi un identificator pentru toate obiectele din scena. O prezentare vizuala a acestor identificatori, sub forma de nuante de gri, se poate vedea in imaginea de mai jos. | + | Pentru a realiza procesul de selecție a unui obiect, se păstrează suplimentar în canalul A din cea de-a doua textură de culoare a obiectului de tip framebuffer creat de voi un identificator pentru toate obiectele din scenă. O prezentare vizuală a acestor identificatori, sub formă de nuanțe de gri, se poate vedea în imaginea de mai jos. |
- | {{ :ppbg:tema:selection.png?800 |}} | + | {{ :ppbg:tema:selection.png?700 |}} |
- | Nuantele de gri din cea de-a doua textura de culoare din imaginea de mai sus au scop de prezentare pentru a se putea vizualiza identificatorul sub forma unei culori. Datorita faptului ca cea de-a doua textura de culoare contine informatie de tip ''RGBA32F'', aceasta permite pastrarea unor valori ce depasesc valoarea 1. | + | Nuanțele de gri din cea de-a doua textură de culoare din imaginea de mai sus au scop de prezentare pentru a se putea vizualiza identificatorul sub forma unei culori. În situația în care cea de-a doua textură de culoare conține informație de tip ''RGBA32F'', aceasta permite păstrarea unor valori ce depașesc valoarea 1. |
==== Control elicopter ==== | ==== Control elicopter ==== | ||
- | Elicopterul se deplaseaza spre locatia de destinatie in momentul in care utilizatorul alege o astfel de destinatie prin apasarea butonului dreapta de la mouse. La momentul alegerii destinatiei, se plaseaza pe suprafata obiectul de marcaj prezentat mai sus si acesta ramane la pozitia respectiva pana la momentul in care elicopterul ajunge la destinatie. In momentul in care elicopterul se opreste, obiectul de marcaj al destinatiei dispare. | + | Elicopterul își începe deplasarea spre locația de destinație în momentul în care utilizatorul alege o astfel de locație prin apăsarea butonului dreapta de la mouse. La momentul alegerii destinației, se plasează pe suprafață obiectul de marcaj prezentat mai sus și acesta rămâne la poziția respectivă până la momentul în care elicopterul ajunge la destinație. În momentul în care elicopterul se oprește, obiectul de marcaj al destinației dispare. |
- | Atasat de elicopter se afla o camera observator ce urmareste elicopterul. Suplimentar, in momentul deplasarii elicopterului, acesta este orientat cu fata spre directia de deplasare. | + | Atașat de elicopter se află o cameră observator ce urmărește elicopterul. Suplimentar, în momentul deplasării elicopterului, acesta este orientat cu fața spre direcția de deplasare. |
=== Comportament cameră observator === | === Comportament cameră observator === | ||
- | În situația în care se utilizează framework-ul de laborator, pentru desenarea geometriei din perspectiva camerei observator, se poate utiliza obiectul de tip ''Camera'', după cum urmeaza: | + | În situația în care se utilizează framework-ul de laborator, pentru desenarea geometriei din perspectiva camerei observator, se poate utiliza obiectul de tip ''Camera'', după cum urmează: |
<code cpp> | <code cpp> | ||
auto camera = GetSceneCamera(); | auto camera = GetSceneCamera(); | ||
- | // pozitia relativa a camerei fata de pozitia personajului | + | // pozitia relativa a camerei fata de pozitia elicopterului |
glm::vec3 relativeCameraPosition = ...; | glm::vec3 relativeCameraPosition = ...; | ||
- | // playerPosition este pozitia in lume a personajului controlat de jucator | + | // helicopterPosition este pozitia in lume a elicopterului controlat de jucator |
camera->SetPositionAndRotation( | camera->SetPositionAndRotation( | ||
- | playerPosition + relativeCameraPosition, | + | helicopterPosition + relativeCameraPosition, |
glm::quatLookAt(-glm::normalize(relativeCameraPosition), glm::vec3(0, 1, 0)) | glm::quatLookAt(-glm::normalize(relativeCameraPosition), glm::vec3(0, 1, 0)) | ||
); | ); | ||
Line 227: | Line 227: | ||
=== Orientare elicopter === | === Orientare elicopter === | ||
- | Pentru a orienta geometria personajului în direcția de deplasare, se utilizează o matrice de rotație în jurul axei OY. În situația în care se cunoaște direcția de deplasare, unghiul de rotație se poate calcula după cum urmează: | + | Pentru a orienta geometria elicopterului în direcția de deplasare, se utilizează o matrice de rotație în jurul axei OY. În situația în care se cunoaște direcția de deplasare, unghiul de rotație se poate calcula după cum urmează: |
Line 244: | Line 244: | ||
* Asteroidul (0.8p total) | * Asteroidul (0.8p total) | ||
- | * Constructie si desenare geometrie suport - 0.3p | + | * Construcție și desenare geometrie suport - 0.3p |
- | * NU este permisa utilizarea modelului ''plane50.obj''. Geometria suport trebuie generata din cod si trebuie sa aiba cel putin 10000 de varfuri. | + | * Geometria suport trebuie generată din cod și trebuie să aiba cel puțin 10000 de vârfuri. |
- | * Desenare teren cu deformare pe baza hartii de inaltime + multitexturare + curbura - 0.5p | + | * Desenare teren cu deformare pe baza hărții de înălțime + multitexturare + curbură - 0.5p |
- | * Aceasta cerinta NU se puncteaza partial. Trebuie realizate toate elementele specificate in cerinta. | + | * Această cerință NU se punctează parțial. Trebuie realizate toate elementele specificate în cerință pentru acordarea punctajului. |
- | * Selectie + marcare selectie cu marcajul din demo + animatie marcaj - 0.5p | + | * Selecție prin apăsarea butonului dreapta de la mouse + marcare selecție cu marcajul descris + animație marcaj - 0.5p |
- | * Aceasta cerinta NU se puncteaza partial. Trebuie realizate toate elementele specificate in cerinta. | + | * Această cerință NU se punctează parțial. Trebuie realizate toate elementele specificate în cerință pentru acordarea punctajului. |
* Elicopterul (1p total) | * Elicopterul (1p total) | ||
- | * Constructie si desenare geometrie elicopter - 0.2p | + | * Construcție și desenare geometrie elicopter - 0.2p |
- | * Animatie cele 2 elice - 0.2p | + | * Animație cele 2 elice - 0.2p |
- | * Camera ce urmareste elicopterul - 0.2p | + | * Cameră ce urmărește elicopterul - 0.2p |
- | * Control prin selectie (0.4p total) | + | * Control elicopter (0.4p total) |
* Deplasare elicopter - 0.2p | * Deplasare elicopter - 0.2p | ||
- | * Orientare elicopter pe baza directiei de deplasare - 0.2p | + | * Orientare elicopter pe baza direcției de deplasare - 0.2p |
- | * Depunctare: Lipsa plasare elicopter pe suprafata asteroidului - -0.2p | + | * Depunctare: Lipsă plasare elicopter pe suprafața asteroidului - -0.2p |
* Copacul (0.7p total) | * Copacul (0.7p total) | ||
- | * Constructie si desenare geometrie copac (0.6p total) | + | * Construcție și desenare geometrie copac (0.6p total) |
- | * Constructie geometrie - 0.45p | + | * Construcție geometrie - 0.45p |
- | * Aplicare textura cu mapare cilindrica - 0.15p | + | * Aplicare textură cu mapare cilindrică - 0.15p |
- | * Disparitie copac prin selectie - 0.1p | + | * Dispariție copac prin selecție cu butonul dreapta de la mouse - 0.1p |
- | * Depunctare: Lipsa plasare copac pe suprafata asteroidului - -0.2p | + | * Depunctare: Lipsă plasare copac pe suprafața asteroidului - -0.2p |
===== Exemple de funcționalități bonus ===== | ===== Exemple de funcționalități bonus ===== | ||
Line 270: | Line 270: | ||
* Geometrie mai complexă față de cea din cerința de bază pentru elementele vizuale din joc | * Geometrie mai complexă față de cea din cerința de bază pentru elementele vizuale din joc | ||
- | * | + | * Comportament de joc mai complex: |
+ | * Implementare inamici ce se deplaseaza pe suprafata asteroidului | ||
+ | * Implementare inamici ce se deplaseaza in aer, precum elicopterul controlat de catre jucator | ||
+ | * Implementare actiune de atac a jucatorului si a inamicilor | ||
+ | * Introducerea iluminarii: | ||
+ | * Introducerea umbrelor | ||
+ | * Introducerea iluminarii volumetrice | ||
* Orice aduce îmbunătățiri vizuale jocului | * Orice aduce îmbunătățiri vizuale jocului | ||