This shows you the differences between two versions of the page.
egc:teme:2023:02 [2023/11/19 21:18] robert.caragicu Adăugat imagini tanc |
egc:teme:2023:02 [2023/12/04 13:47] (current) victor.asavei [Tema 2 - World of Tanks] |
||
---|---|---|---|
Line 2: | Line 2: | ||
* **Responsabili:** Anca Băluțoiu, Robert Caragicu, Florin Iancu, Vlad Novetschi | * **Responsabili:** Anca Băluțoiu, Robert Caragicu, Florin Iancu, Vlad Novetschi | ||
* **Lansare:** 20 noiembrie 2023 | * **Lansare:** 20 noiembrie 2023 | ||
- | * **Termen de predare:** 13 decembrie 2023, ora 23:59 | + | * **Termen de predare:** 15 decembrie 2023, ora 23:59 |
* **Regulament:** [[egc:teme:regulament|]] | * **Regulament:** [[egc:teme:regulament|]] | ||
* **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ă!** | ||
Line 10: | Line 10: | ||
==== Reguli generale de joc ==== | ==== Reguli generale de joc ==== | ||
Jocul se desfășoară pe un plan orizontal ce conține tancuri și clădiri. Scopul jocului este ca tancul jucătorului să distrugă cât mai multe tancuri inamice într-un timp limită (cel puțin 1 minut). Pentru fiecare tanc distrus jucătorul primește puncte. | Jocul se desfășoară pe un plan orizontal ce conține tancuri și clădiri. Scopul jocului este ca tancul jucătorului să distrugă cât mai multe tancuri inamice într-un timp limită (cel puțin 1 minut). Pentru fiecare tanc distrus jucătorul primește puncte. | ||
- | Tancurile se deplasează înainte, înapoi și își pot roti corpul. Pentru a ținti după inamici turela tancului poate fi rotită. Proiectilele sunt lansate din vârful tunului și se deplasează rectiliniu și uniform pentru o durată de timp până când lovesc clădiri sau tancuri. | + | Tancurile se deplasează înainte, înapoi și își pot roti corpul. Pentru a ținti după inamici turela tancului poate fi rotită (cerință avansată). Proiectilele sunt lansate din vârful tunului și se deplasează rectiliniu și uniform pentru o durată de timp până când lovesc clădiri sau tancuri. |
Fiecare tanc rezistă la un număr de minim 3 lovituri de proiectil. Cu cât sunt mai avariate tancurile cu atât vor fi desenate mai deformate și mai înnegrite. | Fiecare tanc rezistă la un număr de minim 3 lovituri de proiectil. Cu cât sunt mai avariate tancurile cu atât vor fi desenate mai deformate și mai înnegrite. | ||
Odată scurs timpul de joc, scena va ingheța; doar rotația turelei și a tunului vor mai fi posibile. | Odată scurs timpul de joc, scena va ingheța; doar rotația turelei și a tunului vor mai fi posibile. | ||
- | Tancurile inamice se vor plimba aleator pe hartă fie pe un traseu predefinit (cerință de bază) fie vor urmări tancul jucătorului când este aproape de inamic (cerință avansată). Tancurile inamice își rotesc turela în direcția jucătorului în scopul de a trage proiectile înspre acesta. | + | Tancurile inamice se vor mișca pe hartă fie pe un traseu predefinit (cerință de bază) fie pe un traseu aleator (cerință avansată). Tancurile inamice își rotesc turela în direcția jucătorului în scopul de a trage proiectile înspre acesta. |
Un tanc complet avariat este imobil. | Un tanc complet avariat este imobil. | ||
- | Jocul se termină fie când limita de timp este atinsă, fie când tancul jucătorului este distrus.l În cazul în care timpul a expirat, în consolă se va afișa scorul. Scorul acumulat se consideră doar dacă timpul de joc a expirat. Dacă tancul jucătorului este distrus, atunci se afișează în consolă un mesaj corespunzător. | + | Jocul se termină fie când limita de timp este atinsă, fie când tancul jucătorului este distrus. În cazul în care timpul a expirat, în consolă se va afișa scorul. Scorul acumulat se consideră doar dacă timpul de joc a expirat. Dacă tancul jucătorului este distrus, atunci se afișează în consolă un mesaj corespunzător. |
==== Detalii de implementare ==== | ==== Detalii de implementare ==== | ||
Line 26: | Line 26: | ||
{{ :egc:teme:2023:tanc_simplu_2.png?200 |}} | {{ :egc:teme:2023:tanc_simplu_2.png?200 |}} | ||
- | Un tanc este format dintr-un corp, turelă, tun și șenile. Corpul este paralelipipedul cel mare. Atașat de corp este turela formată tot dintr-un paralelipiped. Turela este atașată de corp și se rotește stânga dreapta după metoda descrisă în capitolul Rotație Turelă Tanc. Atașat de turelă este un tun format dintr-un cilindru. Tunul se rotește sus jos în jurul unui pivot descris în capitolul Rotație tun tanc. Atașat de corp se găsesc două paralelipipede care reprezintă șenilele tancului. | + | Un tanc este format dintr-un corp, turelă, tun și șenile. Corpul este paralelipipedul cel mare. Atașat de corp este turela formată tot dintr-un paralelipiped. Turela este atașată de corp și se rotește stânga dreapta după metoda descrisă în capitolul Rotație Turelă Tanc. Atașat de turelă este un tun format dintr-un cilindru. Atașat de corp se găsesc două paralelipipede care reprezintă șenilele tancului. |
Tancul va fi desenat în 3 culori pentru a distinge elementele sale. Astfel corpul vor avea o culoare, turela altă culoare iar tunul și șenilele altă culoare. Tunul și șenilele au aceeași culoare. | Tancul va fi desenat în 3 culori pentru a distinge elementele sale. Astfel corpul vor avea o culoare, turela altă culoare iar tunul și șenilele altă culoare. Tunul și șenilele au aceeași culoare. | ||
Line 34: | Line 34: | ||
{{ :egc:teme:2023:tanc_avansat_2.png?200 |}} | {{ :egc:teme:2023:tanc_avansat_2.png?200 |}} | ||
O cerință avansată este ca tancul să aibă forme mai complexe. Aveți 2 exemple date în imaginile de mai sus. Puteți importa modele create prin programe software cât timp se păstrează separate componentele tancului (corpul, turela, tunul și șenilele). Aceste componente vor fi desenate cu aceleași culori ca în capitolul //Tanc de bază//. | O cerință avansată este ca tancul să aibă forme mai complexe. Aveți 2 exemple date în imaginile de mai sus. Puteți importa modele create prin programe software cât timp se păstrează separate componentele tancului (corpul, turela, tunul și șenilele). Aceste componente vor fi desenate cu aceleași culori ca în capitolul //Tanc de bază//. | ||
+ | |||
**Dacă rezolvați această cerință se consideră rezolvată și cerința cu tancul de bază.** | **Dacă rezolvați această cerință se consideră rezolvată și cerința cu tancul de bază.** | ||
=== Poziționare Cameră Third Person === | === Poziționare Cameră Third Person === | ||
- | Camera va fi poziționată în spatele tancului așa cum apare în figura din stânga (camera este ilustrată cu piramida neagră). Mai exact, camera este atașată de corpul tancului la o anumită distanță și se uită înainte. Astfel camera se deplasează după cum se deplasează corpul tancului. Când corpul tancului se rotește camera va orbita în jurul corpului pentru a fi în continuare în spatele camerei. | + | {{ :egc:teme:2023:pozitionare_camera_tanc.png?200 |}} |
- | Vederea camerei este în figura din dreapta. | + | {{ :egc:teme:2023:vedere_spate.png?200 |}} |
+ | |||
+ | Camera va fi poziționată în spatele tancului așa cum apare în figura de sus (camera este ilustrată cu piramida neagră). Mai exact, camera este atașată de corpul tancului la o anumită distanță și se uită înainte. Astfel camera se deplasează după cum se deplasează corpul tancului. Când corpul tancului se rotește camera va orbita în jurul corpului pentru a fi în continuare în spatele camerei. | ||
+ | Vederea camerei este în figura de jos. | ||
=== Mediul de joc === | === Mediul de joc === | ||
Line 44: | Line 48: | ||
== Clădiri (cerință avansată) == | == Clădiri (cerință avansată) == | ||
+ | {{ :egc:teme:2023:cladiri.png?500 |}} | ||
Pe suprafața de joc, vor fi amplasate aleator clădiri reprezentate prin paralelipipede aliniate cu axele. | Pe suprafața de joc, vor fi amplasate aleator clădiri reprezentate prin paralelipipede aliniate cu axele. | ||
Cladirile se pot intersecta. Atunci când vor fi create tancul jucătorului și tancurile inamice acestea nu trebuie să se intersecteze cu clădirile. | Cladirile se pot intersecta. Atunci când vor fi create tancul jucătorului și tancurile inamice acestea nu trebuie să se intersecteze cu clădirile. | ||
Line 50: | Line 55: | ||
=== Controlul tancului === | === Controlul tancului === | ||
== Mișcare tanc == | == Mișcare tanc == | ||
+ | {{ :egc:teme:2023:animatie_miscare_tanc.gif |}} | ||
Pentru a mișca tancul jucătorul controlează mișcarea relativ la poziția și rotația tancului (în loc de mișcare față de perspectiva camerei). Acest mod de control se numește “[[https://en.wikipedia.org/wiki/Tank_controls|controluri de tanc]]”😄. | Pentru a mișca tancul jucătorul controlează mișcarea relativ la poziția și rotația tancului (în loc de mișcare față de perspectiva camerei). Acest mod de control se numește “[[https://en.wikipedia.org/wiki/Tank_controls|controluri de tanc]]”😄. | ||
Line 63: | Line 69: | ||
== Rotație Turelă tanc (cerință avansată) == | == Rotație Turelă tanc (cerință avansată) == | ||
+ | {{ :egc:teme:2023:rotire_turela.gif |}} | ||
Turela se va roti stânga dreapta prin mișcarea mouse-ului în stânga și în dreapta. Rotația este în jurul centrului propriu al turelei pe planul local xoz. | Turela se va roti stânga dreapta prin mișcarea mouse-ului în stânga și în dreapta. Rotația este în jurul centrului propriu al turelei pe planul local xoz. | ||
+ | |||
**Atenție! Poziția camerei nu se modifică când se rotește turela pentru că aceasta este atașată de corp.** | **Atenție! Poziția camerei nu se modifică când se rotește turela pentru că aceasta este atașată de corp.** | ||
== Tras cu tunul (cerință de bază) == | == Tras cu tunul (cerință de bază) == | ||
+ | {{ :egc:teme:2023:animatie_tras_fara_bolta.gif |}} | ||
Tancul trage cu proiectile atunci când utilizatorul dă click stânga. Proiectilele sunt sfere negre, încep din vârful tunului și au mișcare rectilinie și uniformă după cum este prezentat în animație. Direcția de deplasare este în direcția indicată de tunul tancului când s-a tras proiectilul. | Tancul trage cu proiectile atunci când utilizatorul dă click stânga. Proiectilele sunt sfere negre, încep din vârful tunului și au mișcare rectilinie și uniformă după cum este prezentat în animație. Direcția de deplasare este în direcția indicată de tunul tancului când s-a tras proiectilul. | ||
Proiectilul va fi șters atunci când se întâmplă cel puțin una dintre situații: | Proiectilul va fi șters atunci când se întâmplă cel puțin una dintre situații: | ||
Line 91: | Line 100: | ||
</note> | </note> | ||
- | == Cum atacă Inamicii? == | + | == Cum atacă Inamicii? (cerință avansată) == |
Atunci cand jucătorul este destul de aproape de un inamic, turela inamicului se va învârti către jucător si va trage spre acesta. | Atunci cand jucătorul este destul de aproape de un inamic, turela inamicului se va învârti către jucător si va trage spre acesta. | ||
Line 114: | Line 123: | ||
Când 2 tancuri intră în coliziune, acestea vor fi deplasate astfel încât să nu mai fie în coliziune. | Când 2 tancuri intră în coliziune, acestea vor fi deplasate astfel încât să nu mai fie în coliziune. | ||
Metoda de a calcula deplasarea necesară este următoarea: | Metoda de a calcula deplasarea necesară este următoarea: | ||
+ | {{ :egc:teme:2023:coliziune_tancuri.png?500 |}} | ||
Daca Distanta_Intre_Tancuri < Raza_Tanc_1 + Raza_Tanc_2, atunci acestea s-au ciocnit. | Daca Distanta_Intre_Tancuri < Raza_Tanc_1 + Raza_Tanc_2, atunci acestea s-au ciocnit. | ||
Line 122: | Line 132: | ||
Directia in care trebuie sa le deplasam poate fi calculata astfel: | Directia in care trebuie sa le deplasam poate fi calculata astfel: | ||
+ | <code> | ||
Dif = ( Centru_Tanc_2 - Centru_Tanc_1 ) | Dif = ( Centru_Tanc_2 - Centru_Tanc_1 ) | ||
P = |P| * glm::Normalize( Dif ) | P = |P| * glm::Normalize( Dif ) | ||
- | |||
- | |||
Centru_Tanc_1 += P * -0.5f; | Centru_Tanc_1 += P * -0.5f; | ||
Centru_Tanc_2 += P * 0.5f; | Centru_Tanc_2 += P * 0.5f; | ||
+ | </code> | ||
== Coliziunea Tanc - Clădire == | == Coliziunea Tanc - Clădire == | ||
Line 138: | Line 148: | ||
== Deformare formă inamic == | == Deformare formă inamic == | ||
- | Obiectele ce reprezintă tancurile inamice (cu sau fără turelă, la libera alegere) se vor deforma în funcție de gradul de avarie al fiecăruia (HP) ; acesta va fi trimis către vertex shader, acolo unde se va realiza deformarea. | + | Obiectele ce reprezintă tancurile inamice (cu sau fără turelă, la libera alegere) se vor deforma în funcție de gradul de avarie al fiecăruia (HP); acesta va fi trimis către vertex shader, acolo unde se va realiza deformarea. |
Deformarea va fi o funcție matematică (la libera alegere) ce va primi gradul de avarie (un număr) și coordonatele locale ale unui vertex (un vector), si va calcula un deplasament (un vector) care va fi aplicat coordonatelor locale ale respectivului vertex (înainte de aplicarea matricilor MVP). | Deformarea va fi o funcție matematică (la libera alegere) ce va primi gradul de avarie (un număr) și coordonatele locale ale unui vertex (un vector), si va calcula un deplasament (un vector) care va fi aplicat coordonatelor locale ale respectivului vertex (înainte de aplicarea matricilor MVP). | ||
Line 164: | Line 174: | ||
* Coliziuni 25p | * Coliziuni 25p | ||
* Proiectil - inamic 15p | * Proiectil - inamic 15p | ||
- | * Tanc - tanc 5p | + | * Tanc - tanc 10p |
* Avarie inamici 25p | * Avarie inamici 25p | ||
* Trimis către shader HP-ul tancului 5p | * Trimis către shader HP-ul tancului 5p | ||
Line 186: | Line 196: | ||
==== Exemple de Funcționalități Bonus ==== | ==== Exemple de Funcționalități Bonus ==== | ||
=== Rotația tunului tancului === | === Rotația tunului tancului === | ||
+ | {{ :egc:teme:2023:pivot_rotatie.png?300 |}} | ||
+ | |||
+ | |||
+ | {{ :egc:teme:2023:rotire_turela_si_tun.gif?500 |}} | ||
Tunul se va roti pentru a ținti în sus și jos prin mișcarea mouse-ului în sus și jos. Rotația este în jurul pivotului indicat de figură pe planul local zoy sau xoy (depinde care direcție este considerată cea din față). Pivotul este punctul galben și planul de rotație este cel ce conține cercul roșu. În animație sunt prezentate cum lucrează cele două rotații pentru ca tancul să poată ținti oriunde. | Tunul se va roti pentru a ținti în sus și jos prin mișcarea mouse-ului în sus și jos. Rotația este în jurul pivotului indicat de figură pe planul local zoy sau xoy (depinde care direcție este considerată cea din față). Pivotul este punctul galben și planul de rotație este cel ce conține cercul roșu. În animație sunt prezentate cum lucrează cele două rotații pentru ca tancul să poată ținti oriunde. | ||
=== Traiectorie parabolă a proiectilului === | === Traiectorie parabolă a proiectilului === | ||
+ | {{ :egc:teme:2023:animatie_tras_cu_bolta.gif?500 |}} | ||
Proiectilul va avea mișcare balistică după cum este prezentat în animație. Se aplică legea gravitației. Astfel viteza inițială a proiectilului este direcția tunului înmulțită cu o constantă. În fiecare cadru algoritmul următor descrie mișcarea proiectilului: | Proiectilul va avea mișcare balistică după cum este prezentat în animație. Se aplică legea gravitației. Astfel viteza inițială a proiectilului este direcția tunului înmulțită cu o constantă. În fiecare cadru algoritmul următor descrie mișcarea proiectilului: | ||
* viteza.y -= gravitatie * deltaTime | * viteza.y -= gravitatie * deltaTime |