This is an old revision of the document!


Tema 2 - Drone Mini Games

  • Responsabili: Anca Băluțoiu, Vlad Novetschi, Robert Caragicu, Silviu Stăncioiu
  • Lansare: 18 noiembrie 2024
  • Termen de predare: 13 decembrie 2024, ora 23:59
  • Regulament: Regulament general
  • Notă: Orice informație ce nu a fost acoperită în acest document este la latitudinea voastră!
%%%2121!!!+++CUTHERE+++!!!2121%%%

Drona

Controlul dronei

  • Translație folosind direcțiile Ox, Oy sau Oz din spațiul local al dronei explicat anterior
  • Rotatie doar pe Oy din spațiul local al dronei explicat anterior
  • First-person (din perspectiva dronei, priviand către axa locală OZ / Forward)
  • Third-person (poziționată la o mică distanță deasupra și în spatele dronei, privind către direcția de deplasare).

Scena

  • Drona controlată de jucător
  • Un plan ce reprezintă terenul
  • Obstacole pe care jucătorul trebuie să le evite. Obstacolele pot fi orice obiecte va doriti însă aveți grijă să puteți respecta cerința legată de coliziuni. De exemplu:
    • Copaci formați dintr-un cilindru maro ce reprezintă trunchiul și două conuri așezate ca în figură ce reprezint frunzele
    • Clădiri reprezentate prin paralepipede.

Teren

3×3

https://thebookofshaders.com/11/

final_color = mix(culoare1, culoare2, valoare_noise); 
  • Drona va fi un punct sau o sfera
  • Obstacolele vor fi construite din 2 corpuri geometrice diferite la alegere dintre (paralelipiped aliniat cu axele, sfera, cilindru, con, prisma cu baza aliniata cu axele)
  • Checkpoint-urile pot fi de mai multe feluri, fie folosind unul din corupurile geometrice de mai sus, fie detectand daca drona a trecut de o parte sau de alta a unui patrat / cerc (ca in demo)
  • Pachetul va fi un paralelipiped aliniat cu axele
  • Proiectilul va fi o sferă

Mai multe informatii despre coliziuni si cum se pot implementa în 3D: https://developer.mozilla.org/en-US/docs/Games/Techniques/3D_collision_detection

  • Simularea gravitației și a forței de propulsie generată pe axa Oy.
  • Un sistem de control pentru unghiul dronei, care să permită manipularea direcției de mișcare a acesteia.

Controlul Avansat: Input-ul Utilizatorului

  • Thrust (forța de propulsie),
  • Pitch (înclinarea sus-jos în jurul axei locale Ox),
  • Yaw (rotirea stânga-dreapta în jurul axei locale Oy),
  • Roll (rotația trigonometrică/anti trigonometrică în jurul axei locale Oz).
  • Thrust: tastele W/S.
  • Pitch: săgețile sus/jos.
  • Yaw: tastele A/D.
  • Roll: săgețile stânga/dreapta.

Metode de Traducere a Input-ului Utilizatorului în Unghiurile Dronei

  1. Modul “Angle”: Utilizatorul controlează direct unghiul dronei față de orizont. Apăsând Sus/Jos, drona se va înclina până la -15/+15 grade față de linia orizontului pe axa locală Ox. Săgețile stânga/dreapta vor controla în mod similar rotația față de axa Oz. Tastele A/D vor ajusta viteza de rotație față de Oy.
  2. Modul “Acro”: Utilizatorul controlează viteza de rotație a dronei. La apăsarea tastelor Sus/Jos, drona va începe să se rotească în jurul axei Ox cu o anumita viteză unghiulară. Viteza poate fi constantă sau poate crește treptat, în funcție de durata de apăsare a tastei. În acest mod, drona va putea efectua manevre acrobatice precum flip-uri.

Dacă dețineți / preferați gamepad, îl puteți folosii ca metodă de input cu:

if (glfwJoystickPresent(0))
{
    int count;
    const float* axes = glfwGetJoystickAxes(0, &count);
}

Însă este necesar să permiteți și input din taste, iar suportul pentru gamepad-uri nu se consideră ca fiind functionalitate bonus/nu se vor primi puncte în plus. (Cu toate acestea, poate face jocul mai distractiv 🙂)

Implementarea Minimap-ului

glLineWidth

Implementarea Split Screen

  • Jocul de curse: Timpul și checkpointurile parcurse vor fi contorizate separat pentru fiecare jucător.
  • Jocul de livrări: Fiecare jucător va avea mai multe pachete de livrat, dar vor fi si pachete ce pot fi livrate de ambii jucători.
  • Jocul shooter: Ambii jucători vor putea trage în inamici, iar, opțional, se poate implementa și un mod PvP.
  1. În funcție de altitudinea / distanța la care se află jucătorul, terenul și obiectele din scenă își schimbă culoarea. Se poate face o interpolare simplă între două culori în fragment shader în felul următor (aceasta este doar o sugestie de implementare, puteți experimenta și cu alte efecte asemănătoare):
    out_color = mix(culoare1, culoare2, clamp(altitutine_player / altitudine_maxima, 0, 1));
  2. Dithering: Efectul de dithering presupune folosirea unei palete de culori reduse și aproximarea culorilor adevărate folosind culori din paleta redusă pentru pixeli adiacenți. Exemplu imaginea următoare: Dacă îi reducem paleta de culori, aceasta arată așa: Iar aplicând un algoritm de dithering care folosește combinații ale pixelilor adiacenți pentru a aproxima culorile inițiale folosind culorile din paleta redusă obținem următorul rezultat: Există mulți algoritmi de dithering, dar nu toți sunt ușor de implementat pe placa grafică. Un algoritm de dithering care poate fi implementat în Fragment Shader este următorul: Alex Charlton — Dithering on the GPU . Se definește un mask, iar în funcția de poziția pixelului pe ecran și valoarea din mask aferentă acelui pixel se alege fie cea mai apropiată valoare din paleta de culori redusă, fie următoarea culoare, efectul fiind unul convingător. Este de menționat faptul că dithering-ul se aplică la nivel de pixel, deci calculele se efectuează pozițiile pe ecran ale pixelilor (gl_FragCoord.xy).
  3. Umbră: Shader care randează umbra unui obiect. Acest shader înainte de a transforma pozițiile vertecșilor din Object space în World Space, realizează o proiecție a acestora pe planul XZ (de exemplu: se poate efectua o scalare pe OY cu un factor foarte mic, aproape 0). Matricea de modelare folosită pentru acest model trebuie modificată astfel încât y-ul în World Space al obiectului proiectat să fie deasupra terenului. Pentru a nu apărea probleme la suprapunerea cu terenul, setați un bias (ex: 0.1) al înălțimii astfel încât umbra să fie puțin deasupra denivelărilor terenului. De asemenea, puteți schimba forma umbrei ca aceasta să nu mai fie plană pentru și a se mula pe suprafața terenului (efectuați fix aceeași transformare pe care o efectuați și în cazul terenului cand setati înălțimile vertecșilor). Obiectul va fi randat cu negru pentru a da impresia de umbră.
  4. Îndoire a copacilor: Când drona jucătorului este în apropierea copacilor aceștia trebuie să se îndoaie în direcția opusă făță de dronă. Sugestie de implementare în Vertex Shader:
    1. Se calculează distanța dintre dronă și centrul copacului (în planul XZ, nu în 3D).
    2. Dacă această distanță este mai mică decât o rază definită r_bend, atunci se calculează un factor de îndoire al copacilor f = clamp(1 - (distanta / r_bend), 0, 1)
    3. Factorul descris anterior este înmulțit cu un unghi maxim de rotație în jurul trunchiului, și cu un alt factor care are valori între 0 și 1 de-alungul înălțimii copacului (0 la bază, 1 în vârf). Se obține unghiul de rotație al vertexului curent.
    4. Se calculează axa de rotație perpendiculară pe direcția dintre dronă și copac (se proiectează această direcție pe planul XZ și se realizează produs vectorial între această axă și axa globală OY).
    5. Se efectueză în shader rotația vertexului folosind axa și unghiul de rotație calculate anterior.

Porțile trebuie să fie parcurse într-o ordine stabilită la începutul jocului.

  • Un singur jucător. Jucătorul are ca obiectiv să treacă într-un timp limită prin toate porțile. Timpul rămas poate fi afișat în două moduri: folosind o bara similara cu cea de Hp de la tema 1, sau scriind pe ecran folosind RenderText (Resurse bonus).
  • Doi jucători în split-screen care fac cursă cine termină primul traseul. Nu există timp limită. La sfârșitul traseului va fi afișat câștigătorul în consolă.
  • Controlul Dronei în 3D (30p)
    • Mișcare de bază pe axele X, Y și Z (10p)
    • Animatie elice (10)
    • Orientare simplă a dronei (10p)
  • Generare Procedurală a Obiectelor (45p)
    • Creare dronă folosind primitive geometrice (15p)
    • Generare procedurală obstacole
    • Amplasare obstacole (10p)
  • Detectare și Răspuns la Coliziuni (40p)
    • Coliziunea cu fiecare dintre cele două tipuri de corpuri generate (15p + 15p)
    • Coliziunea cu planul terenului (XOZ) (10p)
  • Teren (35p)
    • Generare teren 5p
    • Deformare din vertex shader (15p)
    • Colorare din fragment shader (15p)

Puteți alege oricare dintre funcționalitățile avansate de mai jos pentru a acumula puncte până la 75. Funcționalitățile suplimentare sunt considerate bonus. Aveți libertatea să alegeți oricare dintre funcționalitățile avansate, fără a fi necesară implementarea tuturor funcționalităților de la un singur tip de joc.

Tipuri de Jocuri (Acestea sunt doar recomandări și pot fi combinate/adaptate după preferință.)

  1. Joc de Curse
    • Checkpoint-uri/Porți de cursă (15p)
      • Model checkpoint (5p)
      • Detecție coliziune (10p)
    • Cronometru pentru cursă (10p)
    • Split-Screen (20p)
    • Urmatorul checkpoint de culoare diferita (10p)
    • Indicator obiectiv (20p)
  2. Joc de Livrare
    • Third person camera (5p)
    • Obiecte de colectat și livrat (20p)
      • Coliziune pentru preluare pachet (10p)
      • Detecție desctinație atinsă pentru a lăsa pachetul (5p)
      • Pachetul urmareste drona (5p)
    • UI (45p)
      • Afișarea unui indicator care arată locația punctelor de livrare (5p)
      • Minimap (20p)
      • Sageată cu direcția de mers (20p)
    • Sistem de scor și feedback pentru livrare (5p)
  3. Joc Shooter
    • Model pentru inamici (10p)
    • Sistem de tragere (30p)
    • Sistem de scor și feedback vizual (animație când moare) pentru fiecare inamic eliminat (15p)
    • Comportament al inamiciilor (20p)
      • Comportament default (10p)
      • Inamicii pot ataca când jucătorul este în apropiere (10p)

Alte functionalitati avansate (doar in cazul ca nu au fost folosite în joculeț)

  • Split screen (20p)
  • Minimap (20p)
  • Indicator obiectiv (săgeată) (20p)
  • Modalitati de control avansate (recomandate in special pentru jocul de curse):
    • Modul ANGLE (15p): Inputul jucătorului controlează unghiul dronei față de axele principale, precum și forța de propulsie în sus (gravitatie).
    • Modul ACRO (20p): Inputul jucătorului controlează viteza unghiulară a dronei față de axele principale. (gravitatie)
  • Shadere avansate:
    • Shader de variație a culorii pe înălțime (10p): Terenul sau obiectele își schimbă culoarea în funcție de altitudine, cu o tranziție simplă între două culori.
    • Shader de dithering (15p)
    • Shader de îndoire a copacilor când trece drona (o deplasare proporțională cu inversul distanței față de centrul dronei) (15p)
    • Shader simplu de umbră (proiectam toate punctele pe planul XOZ si le randam cu negru) (15p)
    • Shader de ceață
    • : Terenul sau obiectele își schimbă culoarea în funcție de distanță, cu o tranziție simplă între două culori (10p) ===exemple de funcționalități bonus posibile=== * Nori (10p) * Oponenti cu AI pentru cursă (30p) * Sistem avariere dronă la impact (10p) * Mai multe tipuri de drone (suficient de diferite) (5p) * Simulare control prin PID <note important>Alte funcționalități pe care nu le-am descris vor fi punctate în concordanță cu dificultatea / calitatea implementării.</note> <note warning>In cazul in care punctajul obtinut din cerințele avansate depășește cele 75p alocate, la bonus se vor adăuga punctele în plus dar cu o valoare de 3 ori mai mica, si se pot obține până la 25 de puncte în plus. Exemplu 1: daca implementati complet jocul shooter, si adaugati si un mod de joc tip capture the flag care implementează și toate functionalitatile de la jocul de livrari, veți avea punctajul maxim (75 p / 3 = 25p bonus) Exemplu 2: implementand jocul de curse fără split-screen dar cu cele două moduri de control avansate (- 20p + 15p + 20p) veți obține 15p/3 = 5p bonus.</note> </hidden> ==== Exemple de Funcționalități Bonus ==== ==== Întrebări și Răspunsuri ==== Pentru întrebări vom folosi forumurile de pe moodle. Orice nu este menționat în temă este la latitudinea fiecărui student! ==== Notare ==== Baremul este orientativ. Fiecare asistent are o anumită libertate în evaluarea temelor (de exemplu, să dea punctaj parțial pentru implementarea incompletă a unei funcționalități sau să scadă pentru hard coding). Același lucru este valabil atât pentru funcționalitățile obligatorii, cât și pentru bonusuri. <note warning> Tema trebuie încărcată pe moodle. Pentru a fi punctată, tema trebuie prezentată la laborator. Vor exista laboratoare speciale de prezentare a temelor (care vor fi anunțate).</note> ==== Indicații Suplimentare ==== Tema va fi implementată în OpenGL și C++. Este indicat să folosiți framework-ul și Visual Studio. <note>Pentru implementarea temei, în folderul src/lab_m1 puteți crea un nou folder, de exemplu Tema2, cu fișierele Tema2.cpp și Tema2.h (pentru implementare POO, este indicat să aveți și alte fișiere). Pentru a vedea fișierele nou create în Visual Studio în Solution Explorer, apăsați click dreapta pe filtrul lab_m1 și selectați Add→New Filter. După ce creați un nou filtru, de exemplu Tema2, dați click dreapta și selectați Add→Existing Item. Astfel adăugați toate fișierele din folderul nou creat. În fișierul lab_list.h trebuie adăugată și calea către header-ul temei. De exemplu: #include “lab_m1/Tema2/Tema2.h”</note> ==== Arhivarea Proiectului ==== <note> * În mod normal arhiva trebuie să conțină toate resursele necesare compilării și rulării * Înainte de a face arhiva asigurați-vă că ați curățat proiectul Visual Studio: * Click dreapta pe proiect în Solution ExplorerClean Solution * Ștergeți folderul /build/.vs (dacă nu îl vedeți, este posibil să fie ascuns) * În cazul în care arhiva tot depășește limita de 50MB (nu ar trebui), puteți să ștergeți și folderul /deps sau /assets întrucât se pot adăuga la testare. Nu este recomandat să faceți acest lucru întrucât îngreunează mult testarea în cazul în care versiunea curentă a bibliotecilor/resurselor diferă de versiunea utilizată la momentul scrierii temei. </note>
egc/teme/2024/02.1731867897.txt.gz · Last modified: 2024/11/17 20:24 by vlad.novetschi
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