Sunday, July 7, 2019

EGC - lucrari laborator

https://ocw.cs.pub.ro/courses/egc

Regulament General

Implementare

  • Nici o functionalitate oferita in mod standard de un laborator nu poate fi considerata solutie in rezolvarea unei teme
    • Exemple:
      • utilizarea camerei oferite de laborator din /libs/Engine (exceptie camera din Laborator 5 implementata de student)
      • utilizarea clasei Transform din /libs/Engine
      • implementarile celor 2 clase nu sunt oferite studentilor intrucat reprezinta aspecte ce trebuie implementate in cadrul temelor si sau laboratoarelor
  • Orice cerinta trebuie rezolvata in mod specific de catre student si nu prin utilizarea unor biblioteci ajutatoare (sau orice alta aplicatie/cod sursa ce rezolva total sau partial parte a temei)
    • Daca aveti dubii in utilizarea anumitor bibliteci sau functionalitati, intrebati pe forum

Finalizare si Prezentare

  • Temele trebuie incarcate in cadrul assignment-urilor de pe site-ul de curs (fara executabile - Clean Solution).
  • Pentru a fi notate, temele trebuie prezentate in cadrul laboratoarelor dedicate acestui lucru.
  • Datele de prezentare vor fi anuntate in cadrul laboratorului si publicate pe site.
  • Se pot prezenta maxim 2 teme odata la o sesiune de prezentare.

Timp de lucru si Intarzieri

  • Timpul de lucru va fi de 2 sau 3 saptamani pentru fiecare tema, in functie de complexitate
  • Intarzierile se depuncteaza din momentul upload-ului cu 0.25 (din 10) pe zi.
  • O tema poate fi depunctata cu maxim 4 puncte (din 10) din intarzieri.

Notare

  • Baremul de notare este orientativ si nu reprezinta un criteriu complet 100% al notarii unei teme
  • Implementarea trebuie sa respecte cerinta temei ci nu baremul. In prezentarea baremului orientativanumite functionalitati cerute in mod evident de cerinta pot sa fie omise. Va rugam sa cititi cu atentie cerinta si nu utilizati baremul ca si support final al implementarii.
    • Daca in cerinta se specifica implementarea functionalitatii X iar aceasta nu apare in mod evident in barem nu inseamna ca nu puteti fi depunctai pentru omiterea implementarii

Bonus

  • Bonusul se acoda doar daca rezolvarea cerintelor de baza este completa si corecta
  • Notarea bonusului este la latitudinea asisentului ce corecteaza tema
  • Acordarea bonusului se face in functie de complexitatea si calitatea implementarii (analizate cat se poate de obiectiv de catre asistent)
  • Orice barem de bonus oferit este strict orientativ iar notarea bonusului poate fi oriunde intre 0 si punctajul specificat
  • In cazul implemntarii a mai multor “bonusuri” punctajul aferent nu reprezinta o suma a baremului specificat. Bonusul se acorda din ce in ce mai greu
    • Ex: Rezolvarea calitativa a 3 bonusuri de 10 puncte nu va aduce automat 30 de puncte ci poate doar 15-20.
  • Pentru o singura tema nu se poate acorda un bonus mai mare de 25 de puncte (unde punctajul standard pentru o tema este de 150 pct)
O tema copiata duce automat la anularea intregului laborator. Studentii aflati in aceasta situatie vor primi 0p pe intreg laboratorul, indiferent de activitatea anterioara sau de temele prezentate si punctate anterior.

.............

Tema 1

Brick breaker

Scopul temei este realizarea unui joc 2D in care utilizatorul controleaza o platforma. Platforma ghideaza o bila care loveste caramizi.

Obiecte

Scena contine urmatoarele obiecte:
  • platforma (un dreptunghi umplut)
  • peretii: peretele din stanga, din dreapta si de sus (dreptunghiuri umplute)
  • bila (un disc de cerc)
  • cel putin 5 x 10 caramizi (dreptunghiuri umplute)
  • numarul de vieti ale jucatorului (de exemplu, fiecare viata poate fi reprezentata printr-un disc de cerc, asemanator cu bila)
  • powerups (patrate)

Gameplay

Scopul jocului este distrugerea tuturor caramizilor din scena.
Platforma este controlata de jucator prin deplasarea mouse-ului. La mouse click, bila este trimisa in scena. Bila se misca incontinuu pe directia data de platforma sau prin reflexie, la coliziunea cu peretii si caramizile. Daca bila ajunge in partea de jos a scenei si nu este salvata de platforma, jucatorul pierde o vata (iar numarul de obiecte de pe ecran reprezentand vietile se micsoreaza).
La lansarea bilei in scena, ea este trimisa de-a lungul directiei verticale. La coliziunea cu platforma, i se schimba directia. Daca bila loveste platforma in mijloc, directia de reflexie va fi verticala. Daca bila loveste platforma in partea stanga, atunci directia de reflexie pentru bila va fi inspre stanga platformei. Analog in partea dreapta. In figura de mai jos este explicata reflexia pe platforma pentru bila. Puteti sa va imaginati ca platforma reprezinta axa cosinusului de pe cercul trigonometric iar pozitia unde bila loveste platforma, chiar valoarea cosinusului. Daca bila cade pe mijlocul platformei, atunci cosinus = 0. Daca bila cade in partea dreapta a platformei, cosinus este intre 1 si 0. Daca bila cade in partea stanga a platformei, cosinus este intre 0 si -1. Bila se reflecta dupa un unghi egal cu arccosinus.
La coliziune cu celelalte elemente din scena (pereti, caramizi), bila se reflecta natural (de exemplu, la coliziune cu un perete vertical, daca x si y cresteau pana in momentul coliziunii cu pasii tx, respectiv ty, dupa coliziune y creste in continuare cu pasul ty, dar x incepe sa scada cu pasul tx).
La coliziune cu bila, caramizile dispar treptat (li se aplica o scalare pentru micsorare timp de 1-2 secunde).
La coliziune cu unele caramizi, apar in scena powerups (patrate) care se rotesc in timp ce cad pe verticala. Daca aceste powerups sunt atinse de platforma, atunci sunt activate anumite bonusuri pentru jucator pentru o anumita perioada de timp (30 secunde - 1 minut). Exemple de powerups:
  • apare si in partea de jos a scenei, sub platforma, un perete; astfel jucatorul nu isi pierde o viata daca bila nu este salvata de platforma
  • platforma poate trage cu anumite arme inspre caramizi
  • bila poate deveni mai mare
  • bila poate deveni mai puternica. Astfel, la coliziunea cu caramizile, bila nu mai realizeaza reflexie, ci isi continua traseul, distrugand mult mai multe caramizi printr-o singura traversare a scenei
  • platforma devine “lipicioasa”. Astfel, la coliziunea cu platforma, bila ramane pe platforma pana cand este lansata din nou in scena. Bila ar putea fi trimisa pe o anumita directie, data de mouse. Avand in vedere ca in functionalitatea de baza, platforma se misca dupa mouse, acest bonus ar putea fi implementat prin doua stari: In starea 1 bila se lipesteste de platforma la pozitia din care a venit si platforma se deplaseaza libera pana la momentul in care se apasa click stanga. Starea 2 dureaza de la momentul apasarii click-ului pana la momentul release-ului. La momentul primei apasari platforma se blocheaza la pozitia in care se afla. In timpul hold-ului mouse-ul se misca liber fara sa afecteze platforma, iar la release bila pleaca in directia pozitiei mouse-ului.

Functionalitati obligatorii

Barem orientativ pentru realizarea functionalitatilor (din 100 puncte):
  • desenare scena (25 puncte)
  • control platforma cu mouse-ul (5 puncte)
  • detectie coliziuni bila-platforma, bila-pereti, platforma-powerups (5 puncte)
  • detectie coliziuni bila-caramizi (10 puncte)
  • deplasare bila in scena la lansare (5 puncte)
  • deplasare prin reflexie la coliziunea cu platforma (10 puncte)
  • deplasare prin reflexie la coliziunea cu peretii si caramizile (15 puncte)
  • animatie disparitie caramizi si animatie rotire si cadere powerups (10 puncte)
  • gestiune pierdere vieti (5 puncte)
  • implementarea unui powerup la alegere (10 puncte)

Bonusuri

Pentru bonusuri se accepta orice aduce realism scenei sau creste imersiunea jocului. Exemple de bonusuri:
  • implementarea altor powerups in afara de cea din functionalitatile obligatorii (fie powerups descrie mai sus, fie altele propuse de voi)
  • realizarea mai multor niveluri care cresc in dificultate (de exemplu, inserarea in scena a unor caramizi mai puternice, care nu se distrug la o singura coliziune cu bila)

Demo joc

Aici aveti un demo (implementat in framework-ul de laborator) pentru tema, care va va ajuta in intelegerea enuntului temei.

Intrebari si raspunsuri

Pentru intrebari vom folosi forumurile de pe moodle.

Notare

Baremul este orientativ. Fiecare asistent are o anumita libertate in evaluarea temelor (de exemplu, sa dea punctaj partial pentru implementarea incompleta a unei functionalitati sau sa scada pentru hard coding). Acelasi lucru este valabil atat pentru functionalitatile obligatorii, cat si pentru bonusuri.
Tema trebuie incarcata pe moodle. Pentru a fi punctata, tema trebuie prezentata la laborator. Vor exista laboratoare speciale de prezentare a temelor (care vor fi anuntate).

Indicatii suplimentare

Tema va fi implementata in OpenGL si C++. Este indicat sa folositi framework-ul si Visual Studio.
Pentru implementarea temei, in folderul Source/Laboratoare/ puteti crea un nou folder, de exemplu Tema1, cu fisierele Tema1.cpp si Tema1.h (pentru implementare POO, este indicat sa aveti si alte fisiere). Pentru a vedea fisierele nou create in Visual Studio in Solution Explorer, apasati click dreapta pe filtrul Laboratoare si selectati Add→New Filter. Dupa ce creati un nou filtru, de exemplu Tema1, dati click dreapta si selectati Add→Existing Item. Astfel adaugati toate fisierele din folderul nou creat. In fisierul LabList.h trebuie adaugata si calea catre header-ul temei. De exemplu: #include <Laboratoare/Tema1/Tema1.h>

Arhivarea proiectului

  • in mod normal arhiva trebuie sa contina toate resursele necesare compilarii si rularii
  • inainte de a face arhiva asigurati-va ca ati dat clean la proiect
    • click dreapta pe proiect in Solution Explorer → Clean Solution, sau
    • stergeti folderul /Visual Studio/obj
  • stergeti fisierul /Visual Studio/Framework_EGC.sdf (in caz ca exista)
  • stergeti fisierul /Visual Studio/Framework_EGC.VC.db (in caz ca exista)
  • stergeti folderul /x64 sau /x86 (in caz ca exista)
    • executabilul final este generat in folderul /x86 sau /x64 la finalul link-editarii in functie de arhitectura aleasa la compilare (32/64 biti)
  • in cazul in care arhiva tot depaseste limita de 20MB (nu ar trebui), puteti sa stergeti si folderul /libs sau /Resources intrucat se pot adauga la testare. Nu este recomandat sa faceti acest lucru intrucat ingreuneaza mult testarea in cazul in care versiunea curenta a librariilor/resurselor difera de versiunea utilizata la momentul scrierii temei.
................

Tema 2

Joc de biliard

Scopul temei este de a crea un joc clasic de “8 Ball Pool” cu 2 jucatori, care foloseste 7 bile rosii, 7 bile galbene, o bila neagra si o bila alba. Exemplu:https://www.youtube.com/watch?v=6uzf1nXZW6E

Stadii

1. Spargerea bilelor
La inceputul jocului, bilele sunt aranjate ca in poza urmatoare:
Vor fi aranjate intr-un triunghi format din cele 15 bile in a treia treime a mesei, iar bila alba este situata in prima treime a mesei.
    R
   R G
  G N R
 G R R G
R R G G R
R - bila rosie G - bila galbena N - bila neagra
Jucatorul care incepe va putea deplasa bila alba in prima treime a mesei. Dupa ce a mutat bila unde doreste cu tastele “WASD”, apasa pe “SPACE”.
Jucatorul va fi constrans in a muta bila alba doar in prima treime a mesei
View-ul pe care il va avea dupa apasarea tastei “SPACE” este urmatorul:
La inceput, tacul este foarte aproape de bila alba. Tacul va avea o animatie de retragere (pe directia tacului) atunci cand se apasa “Left Mouse Button”. Aceasta animatie va fi facuta in vertex shader. Dupa ce tacul a ajuns la o distanta anume de bila alba, acesta revine aproape de bila alba si animatia se reia. Intensitatea loviturii va fi direct proportionala cu distanta intre tac si bila alba. Cand dam drumul butonului din stanga al mouse-ului, se executa lovitura. De asemenea, cu “Right Mouse Button” se poate misca tacul in jurul bilei albe, camera urmarind bila alba si tacul ca in modul third person. Directia loviturii este data de directia tacului. Dupa lovitura, bila alba va avea o anumita viteza cu directia tacului si magnitudinea proportionala cu distanta dintre tac la bila alba in momentul release-ului butonului stang al mouse-ului. In momentul ciocnirii bilei albe cu celelalte bile, acestea vor trebui sa se comporte ca in viata reala. Deplasarea bilei albe este in planul XOZ.
2. Alegerea culorii fiecarui jucator
Culoarea cu care joaca un player este aleasa in momentul in care jucatorul introduce in buzunar prima bila de culoare galbena sau rosie. Dupa aceea, jucatorul respectiv trebuie sa introduca toate bilele de culoarea respectiva in buzunar, iar celalalt jucator trebuie sa introduca bilele de cealalta culoare.
3. Jocul pana la bila neagra
Jucatorii trebuie sa-si introduca in buzunar toate bilele. O bila este introdusa in buzunar in momentul cand se apropie atat de mult de un buzunar incat putem trage aceasta concluzie. Dupa aceea, ei pot introduce bila neagra. Cine introduce primul bila neagra este castigator. Daca este comis un fault, celalalt jucator poate plasa bila alba oriunde pe masa cu tastele WASD (atata timp cat nu intersecteaza alte bile). Fault-ul este de doua feluri: daca un jucator, la o lovitura, nu isi atinge prima data propriile bile sau daca bila alba intra in buzunar. Dupa ce a plasat bila alba pe masa cu un view top-down, apasa pe SPACE pentru a reveni la camera third person si jocul continua.

Alte specificatii

  • Dupa lovitura, camera se schimba din third person pe bila alba pe una top-down,
pentru a putea fi vizualizata lovitura:
  • Pentru punctaj complet, jocul trebuie sa fie consecvent.
  • Animatia tacului pentru lovirea bilei albe se va face in vertex shader.

Punctaj

  • 10% - Afisare la stdout statistici joc (cate bile a bagat fiecare, cate fault-uri s-au comis etc)
  • 10% - Implementarea coliziunilor (bila-bila, bila-manta) (link-ul acesta ar fi de folos)
  • 10% - Dispartia unei bile bagata in buzunar
  • 15% - Animatie tac in vertex shader in momentul loviturii
  • 15% - Camera third person pe directia tacului, target-ul fiind bila alba
  • 15% - Vedere top-down dupa ce tacul a lovit bila ptr a se putea vizualiza lovitura
  • 25% - Desenarea mesei cu buzunare si a bilelor, ca in poze

Bonus

Orice aduce realism jocului:
  • Posibilitatea imprimarii unui efect lateral, in sus, in jos sau o combinatie intre ele (aici si aici)
  • Masa realista
  • Linii pentru ghidare
  • etc

Intrebari si raspunsuri

Pentru intrebari vom folosi forumurile de pe moodle.

Notare

Baremul este orientativ. Fiecare asistent are o anumita libertate in evaluarea temelor (de exemplu, sa dea punctaj partial pentru implementarea incompleta a unei functionalitati sau sa scada pentru hard coding). Acelasi lucru este valabil atat pentru functionalitatile obligatorii, cat si pentru bonusuri.
Tema trebuie incarcata pe moodle. Pentru a fi punctata, tema trebuie prezentata la laborator. Vor exista laboratoare speciale de prezentare a temelor (care vor fi anuntate).

Indicatii suplimentare

Tema va fi implementata in OpenGL si C++. Este indicat sa folositi framework-ul si Visual Studio.
Pentru implementarea temei, in folderul Source/Laboratoare/ puteti crea un nou folder, de exemplu Tema2, cu fisierele Tema2.cpp si Tema2.h (pentru implementare POO, este indicat sa aveti si alte fisiere). Pentru a vedea fisierele nou create in Visual Studio in Solution Explorer, apasati click dreapta pe filtrul Laboratoare si selectati Add→New Filter. Dupa ce creati un nou filtru, de exemplu Tema2, dati click dreapta si selectati Add→Existing Item. Astfel adaugati toate fisierele din folderul nou creat. In fisierul LabList.h trebuie adaugata si calea catre header-ul temei. De exemplu: #include <Laboratoare/Tema2/Tema2.h>

Arhivarea proiectului

  • in mod normal arhiva trebuie sa contina toate resursele necesare compilarii si rularii
  • inainte de a face arhiva asigurati-va ca ati dat clean la proiect
    • click dreapta pe proiect in Solution Explorer → Clean Solution, sau
    • stergeti folderul /Visual Studio/obj
  • stergeti fisierul /Visual Studio/Framework_EGC.sdf (in caz ca exista)
  • stergeti fisierul /Visual Studio/Framework_EGC.VC.db (in caz ca exista)
  • stergeti folderul /x64 sau /x86 (in caz ca exista)
    • executabilul final este generat in folderul /x86 sau /x64 la finalul link-editarii in functie de arhitectura aleasa la compilare (32/64 biti)
  • in cazul in care arhiva tot depaseste limita de 20MB (nu ar trebui), puteti sa stergeti si folderul /libs sau /Resources intrucat se pot adauga la testare. Nu este recomandat sa faceti acest lucru intrucat ingreuneaza mult testarea in cazul in care versiunea curenta a librariilor/resurselor difera de versiunea utilizata la momentul scrierii temei.
..................

Tema 3

  • Responsabili: Alex Gradinaru, Alex Dinu 
  • Perioada de lucru: 8/12/2018 – 13/01/2019
  • Termen de predare: 13/01/2019, 23:55 

New Vegas

Scopul acestei teme este de a stimula creativitatea prin generarea procedurala a unui oras in 3D. Va veti folosi cunostintele din domeniul graficii asistate de calculator, anume generare de modele 3Dtransformari geometriceiluminare si texturare.
Tema isi propune un minim de complexitate, descris in cerintele ce urmeaza, insa va incurajeaza sa veniti cu idei si abordari proprii, astfel incat sa va exercitati capabilitatile programatice si creativitatea, prin generare procedurala.
Utilitatea deprinderilor dobandite in urma crearii acestui mediu virtual se regaseste in industrii precum: jocuri video(mai ales open world, e.g. No Man's Sky), filme(Hollywood CGI), retail(e.g. geometric patterns).

Generare procedurală

Generarea procedurala este procesul prin care entitati ale unei clase sunt generate prin instantierea repetata de obiecte(indivizi) de acea clasa, fiecarui individ atribuindu-se valori pseudoaleatoare, ghidate de un set de reguli.
Desi aceasta definitie pare abstracta, avantajul este ca nu sunteti constransi in vreun fel de a genera cladirile si strazile, astfel ca puteti utiliza aparate matematice la alegere pentru generarea geometriei si astfel puteti fi foarte creativi.

Orașul. Clădiri și străzi

Scopul generarii procedurale in aceasta tema este de a crea un oras virtual.
Elementele din acesta sunt:
  • Cladiri
  • Strazi
  • Elemente decorative(e.g. elemente de trafic, iluminare stradala, etc.)
Cladirile si strazile vor fi generate exclusiv procedural.
Elementele decorative nu e nevoie sa fie generate procedural, pot fi meshe importate de voi, insa plasarea lor in scena trebuie sa fie pur procedurala. Alegerea elementelor decorative este lasata la latitudinea voastra. Trebuie sa aveti minim trei tipuri de elemente decorative.
Nu sunteti constransi in a nu adauga elemente decorative pe cladiri, insa ferestrele cladirilor nu sunt elemente decorative.

Cerinte

Se va genera procedural o scena cu elementele mentionate mai sus.
Utilizatorul se poate plimba prin intreaga scena utilizand camera din laborator.
La fiecare noua rulare a aplicatiei, orasul va arata diferit.

Clădrile

Cladirile sunt formate prin asamblare de primitive cu geometrie alterata procedural. Asamblarea este controlata printr-un proces pseudorandom creat de voi. Primitivele pot fi, de exemplu, cilindri cu distanta nu neaparat uniforma intre oricare 2 puncte succesive de pe conturul cercului generator, cu numar variabil de puncte, etc. Pot fi paralelipipede, etc.
Pentru fiecare triunghi generat, trebuie sa generati si coordonatele de texturare corespunzatoare, astfel incat puteti aplica o textura repetitiva (tileable, folositi GL_REPEAT) cu ferestre. Puteti gandi triunghiurile constituente ale primitivelor cate 2, formand un quad, caruia sa-i dati coordonate de texturare in afara intervalului (0,1)x(0,1), astfel incat sa folositi GL_REPEAT corespunzator.
Asamblarea primitivelor constituente unei cladiri consta in aplicarea de transformari (scalare, translatie, rotatie) acestora dupa un set de reguli(constrangeri) creat de voi astfel incat rezultatul arata ca o potentiala cladire.

Străzile

Algoritmul de generare a strazilor este lasat la latitudinea voastra, cu precizarea ca intre 2 rulari succesive ale aplicatiei, reteaua de drumuri arata diferit ca topologie si ca distanta intre strazi. Reteaua de drumuri trebuie sa fie conexa, adica exista un drum intre oricare 2 intersectii.
Strazile trebuie sa fie si ele texturate utilizand GL_REPEAT.
Geometriile cladirilor nu se vor suprapune peste geometriile strazilor.
Minimul de complexitate implica doar strazi pe verticala si pe orizontala. Cladirile vor fi plasate in celulele formate intre strazi. Minimul de complexitate implica o cladire per celula.

Elementele decorative

Orasul va contine elemente decorative plasate printr-un algoritm procedural, dupa un set de reguli ales de voi, astfel ca nu se intersecteaza cu alte elemente, iar pozitia, rotatia si dimensiunea acestora le incadreaza corespunzator in scena.
Elementele pot fi meshe alese de voi. O resursa buna on-line este TurboSquid Trebuie sa aveti minim 3 tipuri de astfel de elemente.

Luminile

Veti avea o lumina directionala (L constant pentru toate fragmentele iluminate) care va ilumina intreg orasul.
Fiecare cladire va avea un set de lumini de tip spot care o ilumineaza doar pe aceasta, cu directia aproximativ perpendiculara pe ground plane. Si aceastea vor fi generate procedural.

Exemplu de Implementare

Sunteti incurajati sa va ghidati dupa implementarea de la acest link:
https://youtu.be/-d2-PtK4F6Y
Puteti folosi gramatici independente de context pentru construirea algoritmului de generare procedurala.

Alte exemple orientative

Resurse utile

Bonus

  • Orice aduce un plus de realism scenei.
  • Orice imbunatateste atmosfera scenei si/sau este captivant vizual.
  • Animatii, dinamism.
  • Trafic dinamic.

Barem

  • 20p - Generare procedurala a geometriei cladirilor
  • 20p - Generare procedurala a retelei de drumuri
  • 20p - Texturarea cladirilor
  • 20p - Texturarea strazilor
  • 15p - Iluminare scena
  • 5p - Readme&Comentarii

Arhivarea proiectului


  • in mod normal arhiva trebuie sa contina toate resursele necesare compilarii si rularii
  • inainte de a face arhiva asigurati-va ca ati dat clean la proiect
    • click dreapta pe proiect in Solution Explorer → Clean Solution, sau
    • stergeti folderul /Visual Studio/obj
  • stergeti fisierul /Visual Studio/Framework_EGC.sdf (in caz ca exista)
  • stergeti fisierul /Visual Studio/Framework_EGC.VC.db (in caz ca exista)
  • stergeti folderul /x64 sau /x86 (in caz ca exista)
    • executabilul final este generat in folderul /x86 sau /x64 la finalul link-editarii in functie de arhitectura aleasa la compilare (32/64 biti)
  • in cazul in care arhiva tot depaseste limita de 20MB (nu ar trebui), puteti sa stergeti si folderul /libs sau /Resources intrucat se pot adauga la testare. Nu este recomandat sa faceti acest lucru intrucat ingreuneaza mult testarea in cazul in care versiunea curenta a librariilor/resurselor difera de versiunea utilizata la momentul scrierii temei.

Observatii

  • Se poate utiliza framework-ul de laborator sau o implementare proprie.
  • Documentatia pentru evenimentele de mouse se gaseste in fisierul /Core/Window/InputController.h




No comments:

Post a Comment