This is an old revision of the document!
I.A.J.S., sau Inca un Alt Joc de Supravietuire va reprezenta tematica temei pe care o veti avea de implementat :). Cerintele de baza ale temei vor contine doar partial elementele comune unui astfel de joc: control jucator, comportament inamici si interactiune de atac doar de la jucator la inamici. Restul elementelor, precum comportament bazat pe puncte de viata ale personajului controlat de jucator si ale inamicilor, aniamtii pentru interactiunea de atac sau animatii pentru disparitia unui inamic invins raman la latitudinea voastra pentru partea de bonus :) . Suplimentar, jocul va da posibilitatea controlului simultan a doua personaje, de la tastatura. Puteți viziona un mic demo construit pe baza framework-ului de laborator, care acoperă cerințele.
Lumea de joc va fi compusa dintr-o podea pe care se deplaseaza personajul controlat de jucator si inamicii. Toata geometria din care este realizat personajul sau inamicii, geometrie ce poate fi identica, este desenata cu aceeasi culoare de baza. Fiecare inamic are o culoare aleasa aleator.
La distante regulate unul de altul, se deseneaza stalpi de iluminat. In varful fiecarui stalp se afla doua surse de lumina de tip spot, la mica distanta una de cealalta.
La pozitia personajului se afla o sursa de lumina punctiforma si o sursa de lumina de tip spot ce lumineaza pe directia de deplasare a personajului. Cele doua surse de lumina se deplaseaza odata cu pozitia personajului.
Jucatorul va putea controla de la tastatura un personaj. Cu tastele W, A, S si D se va putea deplasa personajul de-alungul directiilor fata, stanga, spate si dreapta ale camerei observator. Apasarea in acelasi timp a doua taste, de exemplu W+A rezulta in deplasarea jucatorului de-alungul vectorului compus dintre directia fata si stanga a camerei observator.
Geometria personajului este orientata astfel incat fata lui se afla pe directia de deplasare, descrisa mai sus.
Camera observator se va afla in partea de sus a personajului pe o directie inclinata fata de axa globala OY. Camera urmareste deplasarea personajului si directia de vizualizare este intotdeauna spre pozitia personajului.
Inamicii incearca sa ajunga la pozitia personajului, astfel ca ei se deplaseaza continuu in directia pozitiei lui. De asemenea, la orice moment de timp, inamicii sunt orientati catre personaj.
Prin apasarea tastei space, jucatorul are optiunea sa “traga” cu o “arma”. Toti inamicii ce se afla in fata personajului, mai exact pe directia de deplasare a lui, la o distanta mai mica de 2 unitati fata de personaj, dispar din joc. In locul fiecarui inamic care dispare, alt inamic apare in locul lui la o pozitie aleatoare in lume.
La apasarea tastei 0 din zona numerica a tastaturii, numpad in limba engleza sau a tastei enter, in joc apare un nou personaj ce poate fi controlat de la tastatura. Ecranul se imparte pe latime in doua zone de dimensiuni egale, ca in filmuletul demo de mai sus. Pe fiecare din cele doua ecrane se va desena geometria lumii din doua perspective diferite, cate una pentru fiecare personaj.
Desenarea geometriei pe fiecare din cele 2 porti de afisare se face identic precum desenarea realizata pentru un singur personaj. Singura diferenta este dimensiunea portii de afisare. Desenarea lumii din perspectiva personajului initial se realizeaza in poarta de afisare din partea stanga, iar desenarea pentru al doilea personaj se realizeaza in poarta de afisare din dreapta. Cel de-al doilea personaj are o culoare diferita fata de primul.
De la tastatura, se poate controla ce de-al doilea personaj similar ca in situatia celui initial. Se folosesc sagetile de la tastatura pentru deplasare si tasta 0 din zona numerica a tastaturii sau tasta enter pentru comportamentul de tras.
Geometria personajul si a inamicilor este identica. Ea este realizata din 6 paralelipipede, ce reprezinta trunchiul, capul, piciorul stang si drept, bratul stang si drept, conform imaginii de mai jos.
In imagine, cele 6 componente ale geometriei sunt colorate diferit doar pentru a putea fi identificate cu usurinta. In aplicatia grafica, toata geometria unui personaj sau a unui inamic poate fi desenata cu o singura culoare.
In situatia in care se utilizeaza framework-ul de laborator, pentru determinarea directiei de deplasare a jucatorului pe baza directiei de vizualizare a camerei observator, se poate utiliza obiectul de tip Camera
, dupa cum urmeaza:
auto camera = GetSceneCamera(); glm::vec3 forward = camera->m_transform->GetLocalOZVector(); forward = glm::normalize(glm::vec3(forward.x, 0, forward.z));
Se utilizeaza o proiectie pe planul XOZ a directiei de vizualizare a camerei. Calculele se realizeaza analog si pentru celelalte directii ale obiectului de tip Camera
.
Pentru a orienta geometria personajului in directia de deplasare, se utilizeaza o matrice de rotatie in jurul axei OY. In situatia in care se cunoaste directia de deplasare, unghiul de rotatie se poate calcula dupa cum urmeaza:
$$ unghi = arctan(\frac{directie_x}{directie_y}) $$
atan2
pentru calcularea arctangentei.
In situatia in care se utilizeaza framework-ul de laborator, pentru desenarea geometriei din perspectiva camerei observator se poate utiliza obiectul de tip Camera
, dupa cum urmeaza:
auto camera = GetSceneCamera(); // pozitia relativa a camerei fata de pozitia personajului 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)) );
In calculele de iluminare a geometriei trebuie utilizata componenta ambientala, componenta difuza si componenta speculara. Se pot utiliza modelele de iluminare deja analizate. Daca se doreste, se poate inlocui calculul de iluminare pentru oricare din cele 3 componente cu un alt model de iluminare ce ofera rezultate vizuale superioare :) . In situatia aceasta se considera bonus.
In situatia in care transformarea de modelare contine o transformare neuniforma de modificare a scarii, trecerea vectorului normal din spatiul obiectului in spatiul lumii se realizeaza dupa cum urmeaza:
$$ \begin{bmatrix} \vec{N'}_{x} \\ \vec{N'}_{y} \\ \vec{N'}_{z} \\ 0 \end{bmatrix} = {{(Model^{-1})}^t} \cdot \begin{bmatrix} \vec{N}_{x} \\ \vec{N}_{y} \\ \vec{N}_{z} \\ 0 \end{bmatrix} $$
Directia de iluminare a surselor de lumina de tip spot din varful stalpilor se vor roti continuu.
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 varfurile obiectelor din lume. Procesul este realizat în vertex shader. Componenta y a tuturor varfurilor se modifică după cum urmează.
$$ Pozitie_{v_y} = Pozitie_{v_y} - \|{Pozitie_{personaj}-Pozitie_v}\|^2 \cdot factorCurbura $$
Factorul de curbura este proporțional cu dimensiunea obiectelor din lume. Pentru demo-ul de mai sus este utilizat un factor de 0.02.
La apasarea tastei space,
Geometria personajului si a inamicilor trebuie sa realizeze o animatie continua de deplasare, conform filmuletului de mai jos: