This is an old revision of the document!


Temă -

  • Lansare: 10 decembrie 2024
  • 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 aceasta tema, veti avea de realizat un joc in care jucatorul controleaza un elicopter ce se deplaseaza pe suprafata unui asteroid deluros. Misiunea jucatorului este sa culeaga mai multe mostre dintr-o resursa speciala ce se gaseste pe acest asteroid, ce are forma unui copacel. Controlul jocului este in totalitate cu butonul dreapta de la mouse. Acest buton este utilizat pentru selectia pozitiei de destinatie pentru deplasarea elicopterului si pentru selectia copacilor de pe asteroid.

Puteți viziona mai jos un filmuleț demonstrativ cu o aplicație construită pe baza framework-ului de laborator, care acoperă cerințele.

Curbura si deformarea terenului sunt doar efecte vizual. Toate calculele de control prin deplasare si orientare ale elicopterului si de pozitionare a obiectelor in lume se realizează într-un spațiu in totalitate 2D, care nu țin cont de curbura si deformarea terenului.

Detalii de implementare

Constructie si desenare teren asteroid

Plasare obiecte pe terenul asteroidului

Constructie geometrie elicopter

Geometria elicopterului poate fi vizualizata in animatia de mai jos.

Geometria elicopterului este compusa din doua cuburi redimensionate neuniform pentru a defini cabina si coada elicopterului, impreuna cu 4 cuburi, de asemenea redimensionate neuniform pentru a reprezenta cele 2 elice. Geometria cabinei si a cozii are o culoare diferita de cea a elicelor.

Dupa cum se poate vedea si in imaginea de mai sus, cele 2 elice au o animatie continua de rotatie.

Constructie si animatie marcaj destinatie elicopter

Geometria marcajului destinatie pentru elicopter poate fi vizualizata in imaginea de mai jos.

Paralelipipedul din partea superioara este obtinut prin redimensionarea neuniforma a unui cub. Acesta are o animatie continua de oscilatie in directia sus-jos.

In partea de jos a marcajului, se afla un disc de cerc ce se afla putin de-asupra terenului. Acest disc ia forma zonei de teren pe care se afla pentru a pastra un rezultat vizual placut.

Constructie si desenare geometrie copac

Constructie geometrie copac

Geometria copacului se realizeaza prin desenarea unei ierarhii de paralelipipede cu mai multe niveluri, unde fiecare la fiecare nivel, se deseneaza un paralelipiped redimensionat uniform, rotit si translatat in capatul paralelipipedului de la nivelul anterior. Pentru a finaliza desenarea, se aplica la final toate transformarile utilizate in desenarea paralelipipedului de la nivelul anterior. Rezultatul se poate vedea in imaginea de mai jos.

La fiecare nivel al ierarhiei de paralelipipede, se deseneaza 3 ramuri de ierarhie, fiecare rotita la 120 de grade fata de axa OY, una fata de cealalta. Pentru copacul din imagine, s-au utilizat 6 niveluri ale ierarhiei de paralelipipede.

Va recomand sa nu utilizati redimensionari neuniforme in procesul de constructie a geometriei copacului. Creati din start geometria unui paralelipiped.

Desenare geometrie copac

Pentru colorarea copacului, se utilizeaza procesul de mapare cilindrica. Se folosesc 2 texturi, una pentru trunchiul copacului si una pentru foliajul coroanei. Pentru a calcula coordonatele de textura in varfurile geometriei ce descrie copacul, se utilizeaza procesul de mapare cilindrica ce are urmatoarele formule:

$$ u = \frac{1}{2\pi}arctan(z/x) \\ v = \frac{y}{treeHeight} $$

unde u si v sunt componentele x si y ale coordonatei de textura si (x, y, z) reprezinta componentele coordonatei varfului in spatiul lumii.

Suplimentar, pentru imbunatatirea calitatii vizuale, desenarea se realizeaza dupa cum urmeaza:

  1. Paralelipipedele din primele 4 niveluri ale ierarhiei sunt desenate prin aplicarea texturii de trunchi de copac;
  2. Paralelipipedele de pe nivelul 5 al ierarhiei sunt desenate prin combinarea culorii din texturile de copac si de foliaj al coroanei;
  3. Paralelipipedele de pe nivelul 6, respectiv ultimul nivel al ierarhiei, sunt desenate prin aplicarea texturii de foliaj al coroanei.

Aveti libertate sa utilizati ce texturi doriti voi, impreuna cu modificarea numarului de niveluri, comportamentului de imprastiere a ramurilor pe un nivel, numarul de ramuri pe un nivel si regula de colorare prezentata de mai sus, atata timp cat texturile alese de voi si modificarile realizate urmaresc scopul de simulare a suprafetei componentelor unui copac si au un rezultat vizual similar.

Rezultatul poate fi vizualizat in imaginea de mai jos.

Suplimentar, pentru o deformare suplimentara a geometriei copacului, in procesul de desenare a ierarhiei de paralelipipede, se tine cont de forma terenului in punctul in care este plasat copacul.

Selectie destinatie

Control elicopter

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

Orientare elicopter

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.

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.

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.

Barem

Funcționalități obligatorii (3 puncte)

  • Asteroidul (0.8p total)
    • Constructie si desenare geometrie suport - 0.3p
      • NU este permisa utilizarea modelului plane50.obj. Geometria suport trebuie generata din cod si trebuie sa aiba cel putin 10000 de varfuri.
    • Desenare teren cu deformare pe baza hartii de inaltimi + multitexturare + curbura - 0.5p
      • Aceasta cerinta NU se puncteaza partial. Trebuie realizate toate elementele specificate in cerinta.
  • Selectie + marcare selectie cu marcajul din demo + animatie marcaj - 0.5p
    • Aceasta cerinta NU se puncteaza partial. Trebuie realizate toate elementele specificate in cerinta.
  • Elicopterul (1p total)
    • Constructie si desenare geometrie elicopter - 0.2p
    • Animatie cele 2 elice - 0.2p
    • Camera ce urmareste elicopterul - 0.2p
    • Control prin selectie (0.4p total)
      • Deplasare elicopter - 0.2p
      • Orientare elicopter pe baza directiei de deplasare - 0.2p
  • Copacul (0.7p total)
    • Constructie si desenare geometrie copac (0.6p total)
      • Constructie geometrie - 0.45p
      • Aplicare textura cu mapare cilindrica - 0.15p
    • Disparitie copac prin selectie - 0.1p

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/2024.1733774455.txt.gz · Last modified: 2024/12/09 22:00 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