This is an old revision of the document!


Temă - 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 “încă un Alt Joc de Supraviețuire” va reprezenta subiectul temei pe care o veți avea de implementat :). Cerințele de bază ale temei vor conține doar parțial elementele comune unui astfel de joc: controlul unui personaj de catre jucător, comportament inamici și interacțiune de atac doar de la personaj la inamici. Alte elemente comune, precum comportament bazat pe puncte de viață ale personajului și ale inamicilor, aniamții pentru interacțiunea de atac sau animatii pentru dispariția unui inamic învins rămân la latitudinea voastră și realizarea lor se punctează suplimentar :) . De asemenea, jocul va da posibilitatea controlului simultan a două personaje, de la tastatura. Puteți viziona mai jos un filmuleț demonstrativ cu o aplicație 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 direcțiilor de deplasare a inamicilor și 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 două personaje de la tastatură. Pentru simplitate, toate explicațiile, în afară de cele specifice comportamentului de joc în doi, vor face referire doar la un singur personaj.

Geometrie

Lumea de joc va fi compusă dintr-o podea pe care se deplasează personajul controlat de jucător și inamicii. Toată geometria din care este realizat personajul sau inamicii, geometrie ce poate fi identică, este desenata cu aceeași culoare de bază. Fiecare inamic are o culoare aleasă aleator.

La distanțe regulate unul de altul, se desenează stâlpi de iluminat. În vârful fiecărui stâlp se află două surse de lumină de tip spot, la mică distanță una de cealaltă.

La poziția personajului se află o sursă de lumină punctiformă și o sursă de lumină de tip spot ce luminează pe direcția de deplasare a personajului. Cele două surse de lumină se deplasează odată cu poziția personajului.

Control personaj

Geoemtria personajului va fi desenată în întregime, astfel că putem considera că poziția personajului nu este și poziția observatorului, din perspectiva căreia se desenează geometria. Astfel, considerăm că există un alt observator ce urmărește personajul, similar cu comportamentul unei camere din cinematografie. Din acest motiv, vom utiliza în continuare termenul de cameră când ne referim la observatorul din poziția și pe direcția de vizualizare din care se desenează geometria obiectelor.

Jucătorul va putea controla de la tastatură un personaj. Cu tastele W, A, S și D se va putea deplasa personajul de-alungul direcțiilor față, stânga, spate și dreapta ale camerei observator. Apăsarea simulatană a doua taste, de exemplu tastele W și A rezultă în deplasarea jucătorului de-alungul vectorului compus dintre direcția față și stânga a camerei observator.

În filmulețul de mai jos se poate observa acest comportament pentru controlul personajului.

Geometria personajului este orientată astfel încât “fața” lui se află pe direcția de deplasare, descrisă mai sus.

Comportament cameră observator

Camera observator se va afla în partea de sus a personajului pe o direcție înclinată față de axa globală OY. Camera urmărește deplasarea personajului și direcția de vizualizare este întotdeauna spre poziția personajului.

Comportament inamici

Inamicii încearcă să ajungă la poziția personajului, astfel că ei se deplasează continuu în direcția poziției lui. Doar pentru a fi corect față de jucător, viteza de deplasare a inamicilor este mai mică decât viteza de deplasare a personajului :) . De asemenea, la orice moment de timp, inamicii sunt orientați către personaj.

Comportament atac

Prin apăsarea tastei space, jucătorul are opțiunea de a “trage” cu o “armă”. Toți inamicii ce se află în fața personajului, mai exact pe direcția lui de deplasare, la o distanță mai mică de 2 unități față de personaj, dispar din joc. În locul fiecărui inamic care dispare, alt inamic apare în locul lui la o poziție aleatoare în lume.

Comportament de joc în doi

La apăsarea tastei 0 din zona numerică a tastaturii, numpad în limba engleză sau a tastei enter, în joc apare un nou personaj ce poate fi controlat de la tastatură. Ecranul se împarte pe lățime în două zone de dimensiuni egale, ca în filmulețul demo de mai sus. Pe fiecare din cele două ecrane se va desena geometria lumii din două perspective diferite, câte una pentru fiecare personaj.

Desenarea geometriei pe fiecare din cele 2 porți de afișare se face identic precum desenarea realizată pentru un singur personaj. Singura diferență este dimensiunea porții de afișare. Desenarea lumii din perspectiva personajului inițial se realizează în poarta de afișare din partea stângă, iar desenarea pentru al doilea personaj se realizează în poarta de afișare din dreapta. Cel de-al doilea personaj are o culoare diferită fața 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 și inamici - 0.2p
    • Desenare geometrie podea și stâlpi de iluminat - 0.1p
    • Desenare geometrie iluminată de sursele de lumină de tip spot de la stâlpi - 0.2p
    • Desenare geometrie iluminată de sursele de lumină punctaformă și de tip spot de la personaj - 0.1p
    • Desenare geometrie ce conține o curbură - 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.1700477165.txt.gz · Last modified: 2023/11/20 12:46 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