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 3D, transformari geometrice, iluminare 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).
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.
Scopul generarii procedurale in aceasta tema este de a crea un oras virtual.
Elementele din acesta sunt:
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.
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.
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.
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.
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.
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.
Sunteti incurajati sa va ghidati dupa implementarea de la acest link:
https://youtu.be/-d2-PtK4F6Y