Differences

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

Link to this comparison view

ppbg:tema:2024 [2024/12/09 22:00]
andrei.lambru
ppbg:tema:2024 [2024/12/10 19:57] (current)
andrei.lambru
Line 1: Line 1:
-====== Temă -  ======+====== Temă - Asteroid Hills ======
   * **Lansare:​** 10 decembrie 2024   * **Lansare:​** 10 decembrie 2024
   * **Termen de predare:** Înainte de momentul prezentării   * **Termen de predare:** Înainte de momentul prezentării
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 12: Line 12:
 <​html>​ <​html>​
 <p style="​text-align:​center;​margin:​auto;">​ <p style="​text-align:​center;​margin:​auto;">​
-<iframe width="​560"​ height="​315"​ src="​https://​www.youtube.com/​embed/​Ui34-oUf6ew?​si=3n1Pv5ibkTdP8OpA" title="​YouTube video player"​ frameborder="​0"​ allow="​accelerometer;​ autoplay; clipboard-write;​ encrypted-media;​ gyroscope; picture-in-picture;​ web-share"​ allowfullscreen></​iframe>​+<iframe width="​560"​ height="​315"​ src="​https://​www.youtube.com/​embed/​9QjywXODWRY" title="​YouTube video player"​ frameborder="​0"​ allow="​accelerometer;​ autoplay; clipboard-write;​ encrypted-media;​ gyroscope; picture-in-picture;​ web-share"​ allowfullscreen></​iframe>​
 </p> </p>
 </​html>​ </​html>​
  
-<​note>​Curbura si deformarea ​terenului sunt doar **efecte ​vizual**. 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 țin 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 ​teren asteroid ​==== +==== Construcție și desenare ​suprață ​asteroid ====
-=== Plasare obiecte pe terenul asteroidului === +
-==== Constructie geometrie elicopter ​====+
  
-Geometria elicopterului poate fi vizualizata in animatia ​de mai jos.+Procesul de desenare a suprafeței asteroidului se realizează în mai mulți pași: 
 + 
 +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 |}} 
 + 
 +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ț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 |}} 
 + 
 +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 |}} 
 + 
 +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 |}} 
 + 
 +=== Curbură geometrie === 
 + 
 +<note tip> 
 +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. 
 +</​note>​ 
 + 
 +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ă: 
 + 
 +$$ 
 +Pozitie_{v_y} = Pozitie_{v_y} - \|{Pozitie_{elicopter}-Pozitie_v}\|^2 \cdot factorCurbura 
 +$$ 
 + 
 + 
 +<note tip> 
 +  * $Pozitie_v$ - poziția în spațiul lumii a vârfului procesat de vertex shader 
 +  * $Pozitie_{elicopter}$ - poziția în spațiul lumii a elicopterului controlat de jucător 
 +  * $Pozitie_{v_y}$ - componenta y a poziției vârfului 
 +  * $factorCurbura$ - un factor ce controlează curbura geometriei 
 +</​note>​ 
 + 
 +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 suprafața asteroidului === 
 + 
 +Pentru plasarea unui obiect pe suprafața asteroidului,​ trebuie să fie aplicate obiectului următoarele transformări:​ 
 + 
 +  - 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. 
 +  - 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>​ 
 +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>​ 
 + 
 +Pentru realizarea transformărilor de mai sus, există două opțiuni: 
 +  - 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. 
 +  - 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. 
 + 
 +==== Construcție geometrie elicopter ==== 
 + 
 +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.
  
-==== Constructie si animatie marcaj destinatie elicopter ====+<note important>​ 
 +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>​
  
-Geometria marcajului ​destinatie ​pentru elicopter poate fi vizualizata in imaginea de mai jos.+==== Construcție și animație marcaj destinație elicopter ==== 
 + 
 +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. Acest disc **ia forma zonei de teren pe care se afla** pentru a pastra un rezultat vizual placut.+În partea de jos a marcajului, se află un disc de cerc ce se află puțin ​de-asupra terenului.
  
 +<note important>​
 +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>​
  
-==== 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 ​foliajul ​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 68: 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 foliaj ​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 foliaj ​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>​
-Suplimentar,​ pentru ​o deformare ​suplimentara ​a geometriei copacului, ​in procesul de desenare a ierarhiei de paralelipipede,​ se tine cont de forma terenului in punctul in care este plasat copacul.+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 ​====
-==== Control elicopter ==== +
-=== Comportament cameră observator ​===+
  
-În situația în care se utilizează framework-ul de laborator, ​pentru ​desenarea geometriei ​din perspectiva camerei observatorse poate utiliza ​obiectul ​de tip ''​Camera'', ​după cum urmeaza:+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. 
 + 
 +<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>​ 
 + 
 +Pentru a afișa informația din prima textură de culoare pe ecranul fereastrei date de sistemul de operaretrebuie 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>
-auto camera = GetSceneCamera();+// 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);
  
-// pozitia relativa a camerei fata de pozitia personajului +glBlitFramebuffer ​(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT,​ GL_NEAREST);
-glm::vec3 relativeCameraPosition = ...; +
- +
-// playerPosition este pozitia in lume a personajului controlat de jucator +
-camera->​SetPositionAndRotation( +
-    playerPosition + relativeCameraPosition, +
-    glm::​quatLookAt(-glm::​normalize(relativeCameraPosition),​ glm::vec3(0, 1, 0)) +
-);+
 </​code>​ </​code>​
  
-=== Orientare elicopter ===+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.
  
-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ă:+=== 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, zpă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.
-unghi = arctan(\frac{directie_x}{directie_z}) +
-$$+
  
-<​note ​tip+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ă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 butonuluiCodul pentru acest proces arată în felul următor:
-Recomandarea este să utilizați ''​atan2()''​ pentru calcularea arctangentei. +
-</​note>​+
  
-==== Construcție elemente vizuale ====+<code cpp> 
 +// x si y reprezinta pozitia mouse-ului pe ecran, in pixeli. 
 +float data [4];
  
-Geometria personajului și a inamicilor poate fi identicăEa este realizată din 6 paralelipipede,​ ce reprezintă trunchiul, capul, piciorul stâng și drept, brațul stâng și drept al personajului,​ conform imaginii de mai jos.+y = window->​props.resolution.y - y;
  
-{{ :​ppbg:​tema:​personaj.png?​200 |}}+// custom_framebuffer_object reprezinta identificatorul obiectului de tip framebuffer creat de voi 
 +glBindFramebuffer (GL_FRAMEBUFFER,​ framebuffer_object);​ 
 +glReadBuffer (GL_COLOR_ATTACHMENT1);​
  
-<​note>​ +glReadPixels (x, y, 1, 1, GL_RGBAGL_FLOATdata); 
-În imaginecele 6 componente ale geometriei sunt colorate diferit pentru a putea fi identificate cu ușurință. În aplicația graficătoată geometria unui personaj sau a unui inamic poate fi desenată cu o singură culoare. +</code>
-</note>+
  
-<note tip> +=== Selecție obiect ===
-Recomandarea este să construiți această geometrie din 6 cuburi pentru care aplicați un lanț de transformări ce conține o transformare neuniformă de modificare a scării și o transformare de translație+
-</​note>​+
  
-==== Control personaj ====+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.
  
-În situația în care se utilizează framework-ul de laboratorpentru determinarea direcției de deplasare a jucătorului ​pe baza direcției de vizualizare ​a camerei observator, se poate utiliza obiectul de tip ''​Camera'',​ după cum urmează:+{{ :​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 ==== 
 +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țspre direcția de deplasare. 
 + 
 +=== 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 urmează:
  
 <code cpp> <code cpp>
 auto camera = GetSceneCamera();​ auto camera = GetSceneCamera();​
  
-glm::​vec3 ​forward ​= camera->m_transform->​GetLocalOZVector(); +// pozitia relativa a camerei fata de pozitia elicopterului 
-forward = glm::​normalize(glm::​vec3(forward.x, ​0, forward.z));+glm::​vec3 ​relativeCameraPosition ​...; 
 + 
 +// helicopterPosition este pozitia in lume a elicopterului controlat de jucator 
 +camera->SetPositionAndRotation
 +    ​helicopterPosition + relativeCameraPosition,​ 
 +    glm::​quatLookAt(-glm::​normalize(relativeCameraPosition), ​glm::​vec3(0, ​1, 0)
 +);
 </​code>​ </​code>​
  
-Se utilizează o proiecție pe planul XOZ a direcției de vizualizare a camerei. Calculele se realizează analog și pentru celelalte direcții ale obiectului de tip ''​Camera''​.+=== Orientare elicopter ===
  
-==== Curbură geometrie ====+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ă:
  
-<note tip> 
-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 personajului,​ astfel că acesta poate ajunge la limita geometriei lumii, altfel spus la capătul ei și să și depășească acest capăt :) . De asemenea, este important de menționat că pentru calculele de iluminare NU se ține cont de calculele de creare a curburii geometriei. 
-</​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 obiectelor din lume. Procesul este realizat în vertex shader. Componenta y a tuturor vârfurilor se modifică după cum urmează: 
  
  
 $$ $$
-Pozitie_{v_y} ​Pozitie_{v_y- \|{Pozitie_{personaj}-Pozitie_v}\|^2 \cdot factorCurbura+unghi arctan(\frac{directie_x}{directie_z})
 $$ $$
- 
  
 <note tip> <note tip>
-  * $Pozitie_v$ - poziția în spațiul lumii a vârfului procesat de vertex shader +Recomandarea este să utilizați ''​atan2()''​ pentru calcularea arctangentei.
-  * $Pozitie_{personaj}$ - poziția în spațiul lumii a personajului controlat de jucător +
-  * $Pozitie_{v_y}$ - componenta y a poziției vârfului +
-  * $factorCurbura$ - un factor ce controlează curbura geometriei+
 </​note>​ </​note>​
- 
-Factorul de curbură este proporțional cu dimensiunea obiectelor din lume. Pentru demo-ul de mai sus, este utilizat un factor de 0.02. 
  
 ===== Barem ===== ===== Barem =====
Line 177: 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 inaltimi ​+ 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: 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: Lipsă plasare copac pe suprafața asteroidului - -0.2p
  
 ===== Exemple de funcționalități bonus ===== ===== Exemple de funcționalități bonus =====
Line 202: 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.1733774455.txt.gz · Last modified: 2024/12/09 22:00 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