This is an old revision of the document!


Temă - AnyGame.exe

  • Lansare: 8 decembrie 2025
  • 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ă!

In cadrul acestei teme veti avea de implementat un joc aproape in totalitate la alegere :) , dar care trebuie sa contina un set de elemente vizuale obligatorii. Mai jos, aveti descrierea acestor elemente vizuale, impreuna cu cateva indicatii de implementare. Mult succes :) !

Conceptia jocului este in totalitate la alegerea voastra. Tematica jocului este in totalitate la alegerea voastra :) . De altfel, 1 p din cele 3 p ale temei, dupa cum se poate vedea mai jos, se aloca pentru comportamentul de joc ales de voi. Astfel, va incurajez sa fiti cat mai creativi :) !

Barem

Funcționalități obligatorii (3 puncte)

  • Desenare elemente vizuale (0.5p total)
    • Desenare geometrie element - 0.1p per element, conform descrierii de mai jos
  • Curbura geometrie lume (0.2p)
  • Animatii personaj (0.6p total)
    • Desenare geometri personaj - 0.15p
    • Animatii personaj - 0.15p per animatie
  • Iluminare geometrie (0.4p total)
    • Iluminare geometrie fara umbre - 0.15p
    • Iluminare cu cel putin 3 surse de lumina pentru care se calculeaza umbrele - 0.25p
  • Efect de post-procesare (0.3p)
    • Consultati descrierea de mai jos
  • Comportament de joc, complexitate constructie geometrie, creativitate in utilizarea tehnicilor studiate in cadrul acestui curs :) - 1p

Detalii de implementare

Construcție elemente vizuale

Trebuie sa realizati cel putin 5 elemente vizuale.

Pentru simplitate, vom specifica aici faptul ca toate elementele vizuale descrise mai jos:

  • Trebuie construite exclusiv din cod. Nu este permisa incarcarea unor modele 3D din fisiere pentru realizarea lor.
  • Trebuie sa fie desenate prin aplicarea unei texturi;
  • Complexitatea geometriei este descrisa prin cuburi/paralelipipede, dar pentru cresterea punctajului de la ultima cerinta din barem, se incurajeaza utilizarea unor forme geometrice mai complexe: cilindrul, conul, sfera :) .
  • Asezarea componentelor din care este realizat un element vizual, impreuna cu texturile aplicate la desenarea componentelor, trebuie sa fie consistente cu comportamentul si tematica jocului. Altfel spus, toate elementele vizuale trebuie sa aiba sens in lumea virtuala a jocului, nu doar sa fie introduse pentru respectarea cerintei minime :) .

Cel mai simplu element vizual din lume poate fi realizat sub forma unui cub sau unui paralelipiped. Paralelipipedul se poate obtine din geometria unui cub, prin desenarea celui din urma cu o transformare de redimensionare neuniforma.

Urmatorul element vizual ce trebuie construit este construit din cel putin 3 cuburi sau paralelipipede.

Un alt element vizual trebuie sa fie construit din cel putin 3 cuburi sau paralelipipede, similar cu cel descris anterior, dar in situatia acestuia, cel putin o componenta din care este construit trebuie sa aiba o animatie continua.

Un alt element element vizual trebuie construit din cel putin 3 cuburi sau paralelipipede si trebuie sa contina cel putin o sursa de lumina atasata de el. Aceasta sursa de lumina trebuie sa lumineze orice obiect din lumea virtuala.

Similar cu elementul vizual descris mai sus, ultimul element vizual obligatoriu trebuie sa fie construit din cel putin 3 cuburi sau paralelipipede si sa contina cel putin o sursa de lumina atasata de el, care sa aiba un comportament de iluminare ce se modifica continuu. Posibile modificari ale sursei comportamentului de iluminare pot fi schimbarea culorii/intensitatii de iluminare.

O parte din punctajul ultimei cerinte din barem este proportionala cu complexitatea geometriei construite :) . Astfel, va incurajez sa va folositi creativitatea pentru crearea unei lumi virtuale cat mai placute si interesante, conform tematicii alese de voi pentru joc.

Curbură geometrie

Lumea virtuala in care se desfasoara actiunea jocului trebuie sa contina o curbura intr-o directie aleasa de voi.

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 coordonatelor pentru toate vârfurile obiectelor din lume. Procesul este realizat în vertex shader. Coordonata tuturor vârfurilor se modifică după cum urmează:

$$ Pozitie_{v} = Pozitie_{v} - \vec{control} \cdot \|{Pozitie_{camera}-Pozitie_v}\|^2 \cdot factorCurbura $$

  • $Pozitie_v$ - poziția în spațiul lumii a vârfului procesat de vertex shader
  • $Pozitie_{camera}$ - poziția în spațiul lumii a personajului controlat de jucător
  • $\vec{control}$ - un vector de control a directiei in care se realizeaza curbura
    • In situatia in care se doreste realizarea curburii in jos, se utilizeaza vectorul $\vec{control}= \begin{bmatrix} 0 & -1 & 0 \end{bmatrix} $ .
    • In situatia in care se doreste realizarea curburii in stanga jos, vectorul este $\vec{control}= \begin{bmatrix} -1 & -1 & 0 \end{bmatrix} $
  • $factorCurbura$ - un factor ce controlează curbura geometriei

Factorul de curbură este proporțional cu dimensiunea obiectelor din lume. O valoare posibila pentru factorul de curbura este 0.02.

Animatii

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.

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
ipg/tema/2025.1765193621.txt.gz · Last modified: 2025/12/08 13:33 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