Temă - I.A.J.S.

  • Lansare: 20 noimebrie 2023
  • Termen de predare: Înainte de momentul prezentării
  • Termen de prezentare: Ultima dată de prezentare anunțată, nu mai târziu de ultima zi din semestru
  • Regulament: 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 este 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 desenată 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 este 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 poate controla de la tastatură un personaj. Cu tastele W, A, S și D se poate deplasa personajul de-alungul direcțiilor față, stânga, spate și dreapta ale camerei observator. Apăsarea simulatană a două 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 află î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 desenează 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 tastatură, se poate controla ce de-al doilea personaj, similar ca în situația celui inițial. Se folosesc săgețile de la tastatură pentru deplasare și tasta 0 din zona numerică 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 urmărire a personajului de către cameră - 0.1p
    • Control personaj de la tastatură (0.2p total)
      • Control deplasare personaj - 0.15p
      • Orientare personaj conform direcției de deplasare - 0.05p
    • Comportament de urmărire a personajului de către inamici (0.1p total)
      • Deplasarea inamicilor către personaj - 0.05p
      • Orientarea inamicilor către personaj - 0.05p
    • Comportament de atac al personajului (0.2p total)
      • Detecție și dispariție inamici ce se află în fața personajului - 0.15p
      • Creare inamic la o pozitie aleatoare când un inamic este învins de către personaj - 0.05p
  • Animații (0.75p total)
    • Animație continuă de deplasare a personajelor și inamicilor - 0.5p
    • Animație controlată de deplasarea jucătorului, în momentul în care personajul se oprește din deplasare, se începe o animație de întoarcere la cadrul de animație în care stă pe loc - 0.25p
  • Comportament de joc în doi (0.75p total)
    • Desenare elemente vizuale menționate mai sus de două ori în două porți de afișare diferite (0.6p total)
      • Desenare geometrie în două porți de afișare - 0.1p
      • Desenare geometrie iluminată pe baza a două poziții și direcții de vizualizare diferite - 0.2p
      • Desenare geometrie ce conține o curbură din două poziții diferite - 0.1p
      • Desenare geometrie și iluminare a personajului companion în poarta de afișare (0.1p total)
        • Desenare geometrie personaj companion în poarta de afișare - 0.05p
        • Desenare geometrie iluminată de sursa de lumină punctiformă și de tip spot a personajului companion - 0.05p
    • Control pentru 2 personaje diferite - 0.05p
    • Comportament de urmărire a camerei pentru fiecare personaj - 0.1p

Detalii de implementare

Construcție elemente vizuale

Geometria personajului și a inamicilor poate fi identică. Ea este realizată din 6 paralelipipede, ce reprezintă trunchiul, capul, piciorul stâng și drept, brațul stâng și drept al personajului, conform imaginii de mai jos.

În imagine, cele 6 componente ale geometriei sunt colorate diferit pentru a putea fi identificate cu ușurință. În aplicația grafică, toată geometria unui personaj sau a unui inamic poate fi desenată cu o singură culoare.

Recomandarea este să construiți această geometrie din 6 cuburi pentru care aplicați un lanț de transformări ce conține o transformare neuniformă de modificare a scării și o transformare de translație.

Control personaj

În situația în care se utilizează framework-ul de laborator, pentru determinarea direcției de deplasare a jucătorului pe baza direcției de vizualizare a camerei observator, se poate utiliza obiectul de tip Camera, după cum urmează:

auto camera = GetSceneCamera();
 
glm::vec3 forward = camera->m_transform->GetLocalOZVector();
forward = glm::normalize(glm::vec3(forward.x, 0, forward.z));

Se utilizează o proiecție pe planul XOZ a direcției de vizualizare a camerei. Calculele se realizează analog și pentru celelalte direcții ale obiectului de tip Camera.

Orientare personaj

Pentru a orienta geometria personajului în direcția de deplasare, se utilizează o matrice de rotație în jurul axei OY. În situația în care se cunoaște direcția de deplasare, unghiul de rotație se poate calcula după cum urmează:

$$ unghi = arctan(\frac{directie_x}{directie_z}) $$

Recomandarea este să utilizați atan2() pentru calcularea arctangentei.

Comportament cameră observator

În situația în care se utilizează framework-ul de laborator, pentru desenarea geometriei din perspectiva camerei observator, se poate utiliza obiectul de tip Camera, după 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

În calculele de iluminare a geometriei, trebuie utilizată componenta ambientală, componenta difuză și componenta speculară. Se pot utiliza modelele de iluminare deja analizate. Dacă se dorește, se poate înlocui calculul de iluminare pentru oricare din cele 3 componente cu un alt model de iluminare ce oferă rezultate vizuale superioare :) . Utilizarea unor astfel de modele de iluminare se punctează suplimentar.

Transformarea vectorului normal în spațiul lumii

În situația în care transformarea de modelare conține o transformare neuniformă de modificare a scării, trecerea vectorului normal din spațiul obiectului în spațiul lumii se realizează după cum urmează:

$$ \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 în spațiul lumii
  • $Model$ - matricea transformării de modelare
  • $M^t$ - matricea rezultată după transpunerea matricei M
  • $M^{-1}$ - matricea rezultată după inversarea matricei M
  • $\vec{N}$ - vectorul normal în spațiul obiectului

Surse de lumină de tip spot

Direcția de iluminare a surselor de lumină de tip spot din vârful stâlpilor se vor roti continuu.

Curbură geometrie

Pentru a crea efectul vizual de curbură a geometriei, se utilizează o abordare simplă ce oferă rezultate satisfăcătoare :).

Rezultatul este doar un efect vizual ce curbează geometria în jurul personajului, astfel că acesta poate ajunge la limita geometriei lumii, altfel spus la capătul ei și să și depășească acest capăt :) . De asemenea, este important de menționat că pentru calculele de iluminare NU se ține cont de calculele de creare a curburii geometriei.

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 vârfurile obiectelor din lume. Procesul este realizat în vertex shader. Componenta y a tuturor vârfurilor 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 lumii a vârfului procesat de vertex shader
  • $Pozitie_{personaj}$ - poziția în spațiul lumii a personajului controlat de jucător
  • $Pozitie_{v_y}$ - componenta y a poziției vârfului
  • $factorCurbura$ - un factor ce controlează curbura geometriei

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

Detecție eliminare inamici

La apăsarea tastei space, personajul “trage” cu o “armă”, așa cum s-a menționat mai sus. Pentru a identifica inamicii care se află pe direcția de deplasare a personajului, la distanță mai mică de 2 unități, se poate folosi o abordare simplă ce oferă rezultate satisfăcătoare. Se utilizează un cerc virtual de rază 1, astfel ca diametrul să fie de dimensiune 2, ce se poziționează cu centrul la distanța 1 față de poziția personajului, pe direcția lui de deplasare. Această abordare este descrisă vizual în imaginea de mai jos.

Prin utilizarea acestei abordări, este suficient să identificăm toți inamicii ce au poziția în cercul descris mai sus pentru a afla inamicii ce trebuie eliminați din joc. Se consideră pozițiile personajului și ale inamicilor proiectate paralel pe planul XOZ pentru a lucra într-un spațiu 2D. Pentru a verifica dacă o poziție se află în interiorul unui cerc, se verifică daca distanta între poziție și centrul cercului este mai mică decât raza cercului.

Animații

Geometria personajului și a inamicilor trebuie să realizeze o animație continuă de deplasare, conform filmulețului de mai jos:

Recomandarea este să realizați această animație prin utilizarea unui lanț de transformari, în care, pentru a da doar un exemplu, la finalul lanțului propriu de transformări ale brațului drept se aplică lanțul de transformari ale trunchiului.

Animație de oprire

Doar pentru personajul controlat de jucător, în momentul în care jucătorul se oprește din mișcare, animația trebuie să se întoarcă înapoi la cadrul de animație în care personajul stă pe loc. În filmulețul de mai jos se poate observa acest comportament de joc.

Desenarea geometriei în două porți de afișare

În momentul în care jocul se utilizează în 2, pe ecran se desenează geometria în două porți de afișare cum s-a descris mai sus. Toate elementele vizuale, inclusiv personajul companion și iluminarea cu sursele de lumină proprii personajului companion, trebuie să se deseneze din două perspective diferite, câte una pentru fiecare personaj. De asemenea, curbura geometriei trebuie realizată din poziția personajului din perspectiva căruia se desenează geometria în poarta de afișare.

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
  • Finalizarea comportamentului de joc pentru a avea de indeplinit o misiune si pentru a incheia jocul
  • Animatie de tras cu arma pentru personaj
  • Utilizarea unor modelele de iluminare ce ofera rezultate vizuale superioare celor din demo
  • Orice aduce îmbunătățiri vizuale jocului
ppbg/tema/2023.txt · Last modified: 2023/12/05 19:37 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