Differences

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

Link to this comparison view

ppbg:tema:2024 [2024/12/10 15:48]
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ă!**
  
-In aceasta temaveti avea de realizat ​un joc in care jucatorul controleaza ​un elicopter ce se deplaseaza ​pe suprafata ​unui asteroid deluros. Misiunea ​jucatorului ​este sa culeaga ​mai multe mostre dintr-o ​resursa speciala ​ce se gaseste ​pe acest asteroid, ce are forma unui copacel. Controlul jocului ​este in totalitate ​cu butonul ​dreapta de la mouse. Acest buton este utilizat pentru ​selectia pozitiei ​de destinatie ​pentru deplasarea elicopterului ​si pentru ​selectia ​copacilor de pe asteroid.+În cadrul acestei temeveț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 ​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 ​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 ​curburaSe 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 ​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 ​asteroiduluitrebuie ​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 inaltimePuteti ​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țimePuteț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 varfuluiIn aceasta situatie, obiectul este deformat similar cu suprafata ​pe care se aflaAceasta 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 initialaAceasta 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 cuburi, de asemenea redimensionate neuniform pentru a reprezenta cele 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 neuniformpentru 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 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 ​deplasariiin 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 aflain 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 ​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>​
  
-==== Selectie destinatie ​==== +==== Procesul de selecție ​====
-TODO: explicatii:​ +
- - RGBA, float+
  
 +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 textură de culoare în care se salvează culoarea propriu-zisă a obiectelor;
 +  - O textură de culoare în care se salvează informație suplimentară pentru fiecare obiect în parte.
  
-{{ :​ppbg:​tema:​terrain5.png?600 |}}+<note tip> 
 +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>​
  
-Explicatii blit pe framebuffer-ul implicit+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> 
 +// custom_framebuffer_object reprezinta identificatorul obiectului de tip framebuffer creat de voi 
 +glBindFramebuffer (GL_READ_FRAMEBUFFER,​ custom_framebuffer_object);​ 
 +glReadBuffer (GL_COLOR_ATTACHMENT0);​ 
 +glBindFramebuffer (GL_DRAW_FRAMEBUFFER,​ 0); 
 + 
 +glBlitFramebuffer (0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT,​ GL_NEAREST);​ 
 +</​code>​ 
 + 
 +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. 
 + 
 +=== Selecție destinație === 
 + 
 +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?​700 |}} 
 + 
 +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 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> 
 +// x si y reprezinta pozitia mouse-ului pe ecran, in pixeli. 
 +float data [4]; 
 + 
 +y = window->​props.resolution.y - y; 
 + 
 +// custom_framebuffer_object reprezinta identificatorul obiectului de tip framebuffer creat de voi 
 +glBindFramebuffer (GL_FRAMEBUFFER,​ framebuffer_object);​ 
 +glReadBuffer (GL_COLOR_ATTACHMENT1);​ 
 + 
 +glReadPixels (x, y, 1, 1, GL_RGBA, GL_FLOAT, data); 
 +</​code>​ 
 + 
 +=== Selecție obiect === 
 + 
 +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?​700 |}} 
 + 
 +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 ====
-TODO: Descriere generala+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. 
 + 
 +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 180: 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 197: 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 224: 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
-  * Finalizarea comportamentului ​de joc pentru a avea de indeplinit o misiune ​si pentru ​incheia jocul +  * Comportament ​de joc mai complex: 
-  * Animatie de tras cu arma pentru personaj +    * Implementare inamici ce se deplaseaza pe suprafata asteroidului 
-  Utilizarea unor modelele de iluminare ce ofera rezultate vizuale superioare celor din demo+    * 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
  
ppbg/tema/2024.1733838498.txt.gz · Last modified: 2024/12/10 15:48 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