This shows you the differences between two versions of the page.
ppbg:tema:2024 [2024/12/10 18:22] andrei.lambru |
ppbg:tema:2024 [2024/12/10 19:57] (current) andrei.lambru |
||
---|---|---|---|
Line 6: | Line 6: | ||
* **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ă!** | ||
- | În cadrul acestei teme, va trebui să realizați un joc în care utilizatorul controlează un elicopter ce se deplasează pe suprafața unui asteroid deluros. Misiunea jucătorului este să culeagă mai multe mostre dintr-o resursă specială ce se găsește pe acest asteroid, ce are forma unui copăcel. Controlul jocului se realizează în totalitate prin apăsarea butonului dreapta de la mouse. Acest buton este utilizat pentru selecția poziției de destinație pentru deplasarea elicopterului și pentru selecția copacilor de pe asteroid. | + | În cadrul acestei teme, veți realiza un joc în care utilizatorul controlează un elicopter ce se deplasează pe suprafața unui asteroid deluros. Misiunea jucătorului este să culeagă mai multe mostre dintr-o resursă specială ce se găsește pe acest asteroid, resursă ce are forma unui copăcel. Controlul jocului se realizează în totalitate prin apăsarea butonului dreapta de la mouse. Acest buton este utilizat pentru selecția poziției de destinație pentru deplasarea elicopterului și pentru selecția copacilor de pe asteroid. |
Puteți viziona mai jos un filmuleț demonstrativ cu o aplicație construită pe baza framework-ului de laborator, care acoperă cerințele. | Puteți viziona mai jos un filmuleț demonstrativ cu o aplicație construită pe baza framework-ului de laborator, care acoperă cerințele. | ||
Line 16: | Line 16: | ||
</html> | </html> | ||
- | <note>Curbura si deformarea terenului sunt doar **efecte vizuale**. Toate calculele de control prin deplasare si orientare ale elicopterului si de pozitionare a obiectelor in lume se realizează într-un spațiu in totalitate 2D, care nu ține cont de curbura si deformarea terenului.</note> | + | <note>Deformarea terenului și curbura sunt doar **efecte vizuale**. Toate calculele de control prin deplasare și orientare ale elicopterului, împreună cu calculele de poziționare a obiectelor în lume se realizează într-un spațiu ce este în totalitate în 2 dimensiuni.</note> |
===== Detalii de implementare ===== | ===== Detalii de implementare ===== | ||
- | ==== Constructie si desenare suprafa asteroid ==== | + | ==== Construcție și desenare suprață asteroid ==== |
- | Procesul de desenare a suprafetei asteroidului se realizeaza in mai multi pasi: | + | Procesul de desenare a suprafeței asteroidului se realizează în mai mulți pași: |
- | Primul pas necesita realizarea unei geometrii suport sub forma unui plan creat dintr-o retea poligonala ce contine cel putin 10 000 de varfuri. Un exemplu pentru aceasta geometrie se gaseste in urmatoarea imagine: | + | Primul pas necesită realizarea unei geometrii suport ce are forma unui plan. Această geometrie este creată dintr-o rețea poligonală ce conține **cel puțin 10.000** de vârfuri. Un exemplu pentru această geometrie se găsește în următoarea imagine. |
{{ :ppbg:tema:terrain1.png?600 |}} | {{ :ppbg:tema:terrain1.png?600 |}} | ||
- | Geometria suport se realizeaza pe CPU si se trimite la desenare pentru a se deforma conform urmatorilor pasi. | + | Geometria suport se realizează pe CPU și se trimite la desenare pentru a se deforma conform următorilor pași. |
- | Al doilea pas realizeaza deformarea geometriei suport conform unei harti de inaltimi, similar precum in [[ppbg::laboratoare:08 | laboratorul 8]]. Rezultatul acestei operatii se poate observa in 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 |}} | ||
- | Suprafata deformata la pasul anterior se coloreaza prin esantionarea a 2 texturi, pe baza inaltimii suprafetei, similar precum in bonusul din [[ppbg::laboratoare:08 | laboratorul 8]]. Rezultatul se poate vedea in urmatoarea 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 |}} | ||
- | Ultimul pas este descris in sectiunea urmatoare si reprezinta deformarea suprafetei pentru a se obtine o curbura. Se poate observa rezultatul in imaginea de mai jos: | + | Ultimul pas este descris în secțiunea următoare și reprezintă deformarea suprafeței pentru a se obține o curbură. Acest rezultat se poate observa în imaginea de mai jos. |
{{ :ppbg:tema:terrain4.png?600 |}} | {{ :ppbg:tema:terrain4.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> | ||
- | Realizeaza curburii obiectelor din lume se realizează la pasul de desenare a obiectelor din scenă. Acest efect se creează prin modificarea componentei y a coordonatelor pentru toate vârfurile din care este realizata suprafata asteroidului. Procesul este creat în vertex shader. Componenta y a tuturor vârfurilor se modifică după cum urmează: | + | Efectul de curbură se realizează prin modificarea componentei y a coordonatelor pentru toate vârfurile din care este realizată suprafața asteroidului. Procesul este creat în vertex shader. Componenta y a tuturor vârfurilor se modifică după cum urmează: |
$$ | $$ | ||
Line 55: | Line 55: | ||
<note tip> | <note tip> | ||
* $Pozitie_v$ - poziția în spațiul lumii a vârfului procesat de vertex shader | * $Pozitie_v$ - poziția în spațiul lumii a vârfului procesat de vertex shader | ||
- | * $Pozitie_{elicopter}$ - poziția în spațiul lumii a personajului controlat de jucător | + | * $Pozitie_{elicopter}$ - poziția în spațiul lumii a elicopterului controlat de jucător |
* $Pozitie_{v_y}$ - componenta y a poziției vârfului | * $Pozitie_{v_y}$ - componenta y a poziției vârfului | ||
* $factorCurbura$ - un factor ce controlează curbura geometriei | * $factorCurbura$ - un factor ce controlează curbura geometriei | ||
Line 62: | Line 62: | ||
Factorul de curbură este proporțional cu dimensiunea obiectelor din lume. Pentru demo-ul de mai sus, este utilizat un factor de 0.02. | Factorul de curbură este proporțional cu dimensiunea obiectelor din lume. Pentru demo-ul de mai sus, este utilizat un factor de 0.02. | ||
- | === Plasare obiecte pe suprafata asteroidului === | + | === Plasare obiecte pe suprafața asteroidului === |
- | Pentru plasarea unui obiect pe suprafata asteroidului trebuie sa realizam urmatoarele transformari: | + | Pentru plasarea unui obiect pe suprafața asteroidului, trebuie să fie aplicate obiectului următoarele transformări: |
- | - Translatia coordonatei varfurilor cu deplasamentul dat de deformarea suprafatei in punctul de pe suprafata pe care se afla obiectul pe care doriti sa il plasati pe asteroid. Pentru acest pas, trebuie esantionata harta de inaltimi in punctul corect. | + | - Translația coordonatei vârfurilor cu deplasamentul dat de deformarea suprafaței în punctul de pe suprafață pe care se află obiectul ce trebuie plasat pe asteroid. Pentru acest pas, trebuie eșantionată harta de înălțime în punctul corect. Vedeți notița de mai jos. |
- | - Translatia coordonatei varfurilor cu deplasamentul dat de curbarea suprafetei in punctul de pe suprafata pe care se afla obiectul pe care doriti sa il plasati pe asteroid. | + | - Translația coordonatei vârfurilor cu deplasamentul dat de curbarea suprafeței în punctul de pe suprafață pe care se află obiectul ce trebuie plasat pe asteroid. |
<note important> | <note important> | ||
- | Pentru prima transformare, **NU** utilizati coordonatele de textura ale obiectului pe care doriti sa il plasati pe suprafata pentru esantionarea hartii de inaltime. Puteti utiliza coordonata obiectului in spatiul lumii pentru calcularea coordonatei de textura in care sa esantionati harta de inaltimi. | + | Pentru prima transformare, **NU** utilizați coordonatele de textură ale obiectului pe care doriți să îl plasați pe suprafață pentru eșantionarea hărții de înălțime. Puteți utiliza coordonata obiectului în spatiul lumii pentru calcularea coordonatei de textură în care să eșantionați harta de înălțime. |
</note> | </note> | ||
- | Pentru realizarea transformarilor de mai sus, aveti 2 optiuni: | + | Pentru realizarea transformărilor de mai sus, există două opțiuni: |
- | - Esantionarea hartii de inaltime si calcularea curbarii pe baza coordonatei in spatiul lumii a varfului. In aceasta situatie, obiectul este deformat similar cu suprafata pe care se afla. Aceasta optiune trebuie sa fie utilizata pentru desenarea tuturor obiectelor din scena cu exceptia elicopterului. | + | - Eșantionarea hărții de înălțime și calcularea curburii pe baza coordonatei în spațiul lumii a vârfului. În această situație, obiectul este deformat similar cu suprafața pe care se află. Această opțiune trebuie să fie utilizată pentru desenarea tuturor obiectelor din scenă, cu excepția elicopterului. |
- | - Esantionarea hartii de inaltime si calcularea curbarii pe baza coordonatei in spatiul lumii a unei pozitii comune pentru toate varfurile unui obiect. In aceasta situatie, obiectul isi pastreaza forma initiala. Aceasta optiune trebuie sa fie utilizata doar pentru desenarea elicopterului. | + | - Eșantionarea hărții de înălțime și calcularea curburii pe baza coordonatei în spațiul lumii a unei poziții comune pentru toate vârfurile unui obiect. Această abordare plasează corect obiectul la suprafața asteroidului doar în situația în care deformarea suprafeței asteroidului pe baza curburii se realizează față de obiectul plasat pe teren. În această situație, obiectul își păstrează forma înițială. Opțiunea aceasta trebuie să fie utilizată doar pentru desenarea elicopterului. |
- | ==== Constructie geometrie elicopter ==== | + | ==== Construcție geometrie elicopter ==== |
- | Geometria elicopterului poate fi vizualizata in animatia de mai jos. | + | Geometria elicopterului poate fi vizualizată în animația de mai jos. |
{{ :ppbg:tema:helicopter.gif?400 |}} | {{ :ppbg:tema:helicopter.gif?400 |}} | ||
- | Geometria elicopterului este compusa din doua cuburi redimensionate neuniform pentru a defini cabina si coada elicopterului, impreuna cu 4 cuburi, de asemenea redimensionate neuniform pentru a reprezenta cele 2 elice. Geometria cabinei si a cozii are o culoare diferita de cea a elicelor. | + | Geometria elicopterului este compusă din două cuburi redimensionate neuniform pentru a defini cabina și coada elicopterului, împreună cu alte patru cuburi, de asemenea redimensionate neuniform, pentru a reprezenta cele două elice. Geometria cabinei și a cozii este desenată cu o culoare diferită față de cea a elicelor. |
- | Dupa cum se poate vedea si in imaginea de mai sus, cele 2 elice au o animatie continua de rotatie. | + | După cum se poate vedea și în imaginea de mai sus, cele două elice au o animație continuă de rotație. |
<note important> | <note important> | ||
- | Pentru a nu se deforma geometria elicopterului si in plus, pentru a nu suferi o animatie continua de deformare de-a lungul deplasarii, in procesul de desenare, se utilizeaza optiunea 2 de plasare pe suprafata asteroidului, descrisa mai sus. | + | Pentru a nu se deforma geometria elicopterului și în plus, pentru a nu suferi o animație continuă de deformare de-a lungul deplasării, în procesul de desenare, se utilizează opțiunea 2 de plasare pe suprafața asteroidului, descrisă mai sus. |
</note> | </note> | ||
- | ==== Constructie si animatie marcaj destinatie elicopter ==== | + | ==== Construcție și animație marcaj destinație elicopter ==== |
- | Geometria marcajului destinatie pentru elicopter poate fi vizualizata in imaginea de mai jos. | + | Geometria marcajului destinație pentru elicopter poate fi vizualizată în imaginea de mai jos. |
{{ :ppbg:tema:destination-marker.gif?400 |}} | {{ :ppbg:tema:destination-marker.gif?400 |}} | ||
- | Paralelipipedul din partea superioara este obtinut prin redimensionarea neuniforma a unui cub. Acesta are o animatie continua de oscilatie in directia sus-jos. | + | Paralelipipedul din partea superioară este obținut prin redimensionarea neuniformă a unui cub. Acesta are o animație continuă de oscilație în direcția sus-jos. |
- | In partea de jos a marcajului, se afla un disc de cerc ce se afla putin de-asupra terenului. | + | În partea de jos a marcajului, se află un disc de cerc ce se află puțin de-asupra terenului. |
<note important> | <note important> | ||
- | Pentru a se deforma geometria marcajului cu scopul de a lua forma zonei de teren pe care se afla, in procesul de desenare, se utilizeaza optiunea 1 de plasare pe suprafata asteroidului, descrisa mai sus. | + | Pentru a se deforma geometria marcajului cu scopul de a lua forma zonei de teren pe care se află, în procesul de desenare, se utilizează opțiunea 1 de plasare pe suprafața asteroidului, descrisă mai sus. |
</note> | </note> | ||
- | ==== Constructie si desenare geometrie copac ==== | + | ==== Construcție și desenare geometrie copac ==== |
- | === Constructie geometrie copac === | + | === Construcție geometrie copac === |
- | Geometria copacului se realizeaza prin desenarea unei ierarhii de paralelipipede cu mai multe niveluri, unde fiecare la fiecare nivel, se deseneaza un paralelipiped redimensionat //uniform//, rotit si translatat in capatul paralelipipedului de la nivelul anterior. Pentru a finaliza desenarea, se aplica la final toate transformarile utilizate in desenarea paralelipipedului de la nivelul anterior. Rezultatul se poate vedea in imaginea de mai jos. | + | Geometria copacului se realizează prin desenarea unei ierarhii de paralelipipede cu mai multe niveluri, unde la fiecare nivel, se desenează un paralelipiped redimensionat //uniform//, rotit și translatat în capătul paralelipipedului de la nivelul anterior. Pentru a finaliza desenarea, se aplică la final toate transformările utilizate în desenarea paralelipipedului de la nivelul anterior. Rezultatul se poate vedea în imaginea de mai jos. |
{{ :ppbg:tema:tree1.png?400 |}} | {{ :ppbg:tema:tree1.png?400 |}} | ||
- | La fiecare nivel al ierarhiei de paralelipipede, se deseneaza 3 ramuri de ierarhie, fiecare rotita la 120 de grade fata de axa OY, una fata de cealalta. Pentru copacul din imagine, s-au utilizat 6 niveluri ale ierarhiei de paralelipipede. | + | La fiecare nivel al ierarhiei de paralelipipede, se desenează 3 ramuri de ierarhie, fiecare rotită la 120 de grade față de axa OY, una față de cealaltă. Pentru copacul din imagine, s-au utilizat 6 niveluri ale ierarhiei de paralelipipede. |
<note tip> | <note tip> | ||
- | Va recomand sa nu utilizati redimensionari neuniforme in procesul de constructie a geometriei copacului. Creati din start geometria unui paralelipiped. | + | Este recomandat să nu utilizați redimensionări neuniforme în procesul de construcție a geometriei copacului. Creați din start geometria unui paralelipiped. |
</note> | </note> | ||
=== Desenare geometrie copac === | === Desenare geometrie copac === | ||
- | Pentru colorarea copacului, se utilizeaza procesul de mapare cilindrica. Se folosesc 2 texturi, una pentru trunchiul copacului si una pentru frunzisul coroanei. Pentru a calcula coordonatele de textura in varfurile geometriei ce descrie copacul, se utilizeaza procesul de mapare cilindrica ce are urmatoarele formule: | + | Pentru colorarea copacului, se utilizează procesul de mapare cilindrică. Se folosesc două texturi, una pentru trunchiul copacului și una pentru frunzișul coroanei. Pentru a calcula coordonatele de textura în vârfurile geometriei ce descrie copacul, se utilizează procesul de mapare cilindrică ce are următoarele formule: |
Line 130: | Line 130: | ||
$$ | $$ | ||
- | unde u si v sunt componentele x si y ale coordonatei de textura si (x, y, z) reprezinta componentele coordonatei varfului in spatiul lumii. | + | unde u și v sunt componentele x și y ale coordonatei de textură, (x, y, z) reprezintă componentele coordonatei vârfului în spațiul lumii și treeHeight reprezintă înălțimea copacului în spațiul lumii. |
- | Suplimentar, pentru imbunatatirea calitatii vizuale, desenarea se realizeaza dupa cum urmeaza: | + | Suplimentar, pentru îmbunătățirea calității vizuale, desenarea se realizează după cum urmează: |
- Paralelipipedele din primele 4 niveluri ale ierarhiei sunt desenate prin aplicarea texturii de trunchi de copac; | - Paralelipipedele din primele 4 niveluri ale ierarhiei sunt desenate prin aplicarea texturii de trunchi de copac; | ||
- | - Paralelipipedele de pe nivelul 5 al ierarhiei sunt desenate prin combinarea culorii din texturile de copac si de frunzis al coroanei; | + | - Paralelipipedele de pe nivelul 5 al ierarhiei sunt desenate prin combinarea culorii din texturile de copac și de frunziș al coroanei; |
- | - Paralelipipedele de pe nivelul 6, respectiv ultimul nivel al ierarhiei, sunt desenate prin aplicarea texturii de frunzis al coroanei. | + | - Paralelipipedele de pe nivelul 6, respectiv ultimul nivel al ierarhiei, sunt desenate prin aplicarea texturii de frunziș al coroanei. |
<note> | <note> | ||
- | Aveti libertate sa utilizati ce texturi doriti voi, impreuna cu modificarea numarului de niveluri, comportamentului de imprastiere a ramurilor pe un nivel, numarul de ramuri pe un nivel si regula de colorare prezentata de mai sus, atata timp cat texturile alese de voi si modificarile realizate urmaresc scopul de simulare a suprafetei componentelor unui copac si 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> | ||
- | Rezultatul poate fi vizualizat in imaginea de mai jos. | + | Rezultatul poate fi vizualizat în imaginea de mai jos. |
{{ :ppbg:tema:tree2.png?400 |}} | {{ :ppbg:tema:tree2.png?400 |}} | ||
<note important> | <note important> | ||
- | Pentru o deformare suplimentara a geometriei copacului, in procesul de desenare a ierarhiei de paralelipipede, se utilizeaza optiunea 1 de plasare pe suprafata asteroidului, descrisa 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 selectie ==== | + | ==== 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 | ||