This is an old revision of the document!


Tema - I.A.J.S.

  • Lansare: 20 noimebrie 2023
  • Termen de predare: Inainte de momentul prezentarii
  • Termen de prezentare: Ultima data de prezentare anuntata, nu mai tarziu de ultima zi din semestru
  • Regulament si informatii suplimentare pentru punctarea temei: Regulament temă
  • Notă: Orice informație ce nu a fost acoperită în acest document este la latitudinea voastră!

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.

Curbura terenului este doar un efect vizual. Toate calculele de control ale personajelor, de determinare a directiilor de deplasare a inamicilor si de iluminare, împreună cu generarea geometriei tuturor obiectelor din lume se realizează într-un spațiu în care nu se ține cont de curbură.

Reguli generale de joc

Jocul permite controlul a doua personaje de la tastatura, potential de catre doi jucatori diferiti. Pentru simplitate, toate explicatiile, in afara de cele specifice comportamentului de joc in doi, vor face referire doar la un singur personaj.

Geometrie

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.

Control personaj

Geoemtria personajului va fi desenata in intregime, astfel ca putem considera ca pozitia personajului nu este si pozitia observatorului din perspectiva careia se deseneaza geometria. Astfel, consideram ca exista un alt observator ce urmareste personajul, similar cu comportamentul unei camere din cinematografie. Din acest motiv, vom utiliza in continuare termenul de camera cand ne referim la observatorul din pozitia si pe directia de vizualizare din se deseneaza obiectele.

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.

Comportament camera observator

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.

Comportament inamici

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.

Comportament atac

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.

Comportament joc in doi

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.

Barem

Funcționalități obligatorii (3 puncte)

  • Desenare elemente vizuale (0.9p total)
    • Desenare geometrie personaj si inamici - 0.2p
    • Desenare geometrie podea si stalpi de iluminat - 0.1p
    • Desenare geometrie iluminata de sursele de lumina de tip spot de la stalpi - 0.2p
    • Desenare geometrie iluminata de sursele de lumina punctaforma si de tip spot de la personaj - 0.1p
    • Desenare geometrie ce contine o curbura - 0.3p
  • Comportament de joc (0.6p total)
    • Comportament de urmarire a personajului de catre camera - 0.1p
    • Control personaj de la tastatura (0.2p total)
      • Control deplasare personaj - 0.15p
      • Orientare personaj conform directiei de deplasare - 0.05p
    • Comportament de urmarire a personajului de catre inamici (0.1p total)
      • Deplasarea inamicilor catre personaj - 0.05p
      • Orientarea inamicilor catre personaj - 0.05p
    • Comportament de atac al personajului (0.2p total)
      • Detectie si disparitie inamici ce se afla in fata personajului - 0.15p
      • Creare inamic la o pozitie aleatoare cand un inamic este invins de catre personaj - 0.05p
  • Animații (0.75p total)
    • Animatie continua de deplasare a personajelor si inamicilor - 0.5p
    • Animatie controlata de deplasarea jucatorului, in momentul in care personajul se opreste din deplasare, se incepe o animatie de intoarcere la cadrul de animatie in care sta pe loc - 0.25p
  • Comportament de joc in doi (0.75p total)
    • Desenare elemente vizuale mentionate mai sus de 2 ori in 2 porti de afisare diferite (0.6p in total)
      • Desenare geometrie in cele 2 porti de afisare - 0.1p
      • Desenare geometrie iluminata pe baza a doua pozitii si directii de vizualizare diferite - 0.2p
      • Desenare geometrie ce contine o curbura din doua pozitii diferite - 0.1p
      • Desenare geometrie si iluminare a personajului companion in poarta de afisare (0.1p total)
        • Desenare geometriei personajului companion in poarta de afisare - 0.05p
        • Desenare geometrie iluminata de sursa de lumina punctiforma si de tip spot a personajului companion - 0.05p
    • Control pentru 2 personaje diferite - 0.05p
    • Comportament de urmarire a camerei pentru fiecare personaj - 0.1p

Detalii de implementare

Construcție elemente vizuale

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.

Recomandarea este sa construiti aceasta geometrie din 6 patrate pentru care aplicati o transformare neuniforma de modificare a scarii.

Control personaj

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.

Orientare personaj

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}) $$

Recomandarea este sa utilizati atan2 pentru calcularea arctangentei.

Comportament camera observator

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))
);

Iluminare geometrie

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.

Transformarea vectorului normal in spatiul lumii

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} $$

  • $\vec{N'}$ - vectorul normal in spatiul lumii
  • $Model$ - matricea transformarii de modelare
  • $M^t$ - transpusa matricei M
  • $M^{-1}$ - inversa matricei M
  • $\vec{N}$ - vectorul normal in spatiul obiectului

Surse de lumina de tip spot de la stalpi

Directia de iluminare a surselor de lumina de tip spot din varful stalpilor se vor roti continuu.

Curbură obiecte din lume

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 $$

  • $Pozitie_v$ - poziția în spațiul lume a varfului procesat de vertex shader
  • $Pozitie_{personaj}$ - poziția în spațiul lume a personajului controlat de jucător
  • $Pozitie_{v_y}$ - componenta y a poziției varfului
  • $factorCurbura$ - un factor ce controlează curbura terenului

Factorul de curbura este proporțional cu dimensiunea obiectelor din lume. Pentru demo-ul de mai sus este utilizat un factor de 0.02.

Detectie eliminare inamici

La apasarea tastei space,

Animatii

Geometria personajului si a inamicilor trebuie sa realizeze o animatie continua de deplasare, conform filmuletului de mai jos:

Recomandarea este sa realizati aceasta aniamtie dintr-un lant de transformari, in care, pentru a da doar un exemplu, la finalul lantului propriu de transformari a bratului drept se aplica lantul de transformari a trunchiului.

Animatie de oprire

Doar pentru personajul controlat de jucator, in momentul in care jucatorul se opreste din miscare, animatia trebuie sa se intoarca inapoi la cadrul de animatie in care personajul sta pe loc. In filmuletul de mai jos se poate observa acest comportament de joc.

Desenarea geometriei in doua porti de afisare

Exemple de funcționalități bonus

Orice funcționalitate suplimentară implementată (care nu este inclusă în cerințele obligatorii) poate fi considerată pentru acordarea unui punctaj bonus dacă este suficient de complexă.

  • Geometrie mai complexă față de cea din cerința de bază pentru elementele vizuale din joc
  • Orice aduce îmbunătățiri vizuale jocului
ppbg/tema/2023.1700475206.txt.gz · Last modified: 2023/11/20 12:13 by andrei.lambru
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