This is an old revision of the document!


Temă - Asteroid Hills

  • 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 vizuale. 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 ține cont de curbura si deformarea terenului.

Detalii de implementare

Constructie si desenare suprafa asteroid

Procesul de desenare a suprafetei asteroidului se realizeaza in mai multi pasi:

Primul pas necesita realizarea unei geometrii suport sub forma unui plan creat dintr-o retea poligonala ce contine cel putin 10 000 de varfuri. Un exemplu pentru aceasta geometrie se gaseste in urmatoarea imagine:

Geometria suport se realizeaza pe CPU si se trimite la desenare pentru a se deforma conform urmatorilor pasi.

Al doilea pas realizeaza deformarea geometriei suport conform unei harti de inaltimi, similar precum in laboratorul 8. Rezultatul acestei operatii se poate observa in imaginea de mai jos:

Suprafata deformata la pasul anterior se coloreaza prin esantionarea a 2 texturi, pe baza inaltimii suprafetei, similar precum in bonusul din laboratorul 8. Rezultatul se poate vedea in urmatoarea imagine:

Ultimul pas este descris in sectiunea urmatoare si reprezinta deformarea suprafetei pentru a se obtine o curbura. Se poate observa rezultatul in imaginea de mai jos:

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 elicopterului, astfel că acesta poate ajunge la limita geometriei lumii, altfel spus la capătul ei și să și depășească acest capăt :) .

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 din care este realizata suprafata asteroidului. Procesul este creat în vertex shader. Componenta y a tuturor vârfurilor se modifică după cum urmează:

$$ Pozitie_{v_y} = Pozitie_{v_y} - \|{Pozitie_{elicopter}-Pozitie_v}\|^2 \cdot factorCurbura $$

  • $Pozitie_v$ - poziția în spațiul lumii a vârfului procesat de vertex shader
  • $Pozitie_{elicopter}$ - 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.

Plasare obiecte pe suprafata asteroidului

Pentru plasarea unui obiect pe suprafata asteroidului trebuie sa realizam urmatoarele transformari:

  1. Translatia coordonatei varfurilor cu deplasamentul dat de deformarea suprafatei in punctul de pe suprafata pe care se afla obiectul pe care doriti sa il plasati pe asteroid. Pentru acest pas, trebuie esantionata harta de inaltimi in punctul corect.
  2. Translatia coordonatei varfurilor cu deplasamentul dat de curbarea suprafetei in punctul de pe suprafata pe care se afla obiectul pe care doriti sa il plasati pe asteroid.

Pentru prima transformare, NU utilizati coordonatele de textura ale obiectului pe care doriti sa il plasati pe suprafata pentru esantionarea hartii de inaltime. Puteti utiliza coordonata obiectului in spatiul lumii pentru calcularea coordonatei de textura in care sa esantionati harta de inaltimi.

Pentru realizarea transformarilor de mai sus, aveti 2 optiuni:

  1. Esantionarea hartii de inaltime si calcularea curbarii pe baza coordonatei in spatiul lumii a varfului. In aceasta situatie, obiectul este deformat similar cu suprafata pe care se afla. Aceasta optiune trebuie sa fie utilizata pentru desenarea tuturor obiectelor din scena cu exceptia elicopterului.
  2. Esantionarea hartii de inaltime si calcularea curbarii pe baza coordonatei in spatiul lumii a unei pozitii comune pentru toate varfurile unui obiect. In aceasta situatie, obiectul isi pastreaza forma initiala. Aceasta optiune trebuie sa fie utilizata doar pentru desenarea elicopterului.

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.

Pentru a nu se deforma geometria elicopterului si in plus, pentru a nu suferi o animatie continua de deformare de-a lungul deplasarii, in procesul de desenare, se utilizeaza optiunea 2 de plasare pe suprafata asteroidului, descrisa mai sus.

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.

Pentru a se deforma geometria marcajului cu scopul de a lua forma zonei de teren pe care se afla, in procesul de desenare, se utilizeaza optiunea 1 de plasare pe suprafata asteroidului, descrisa mai sus.

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 frunzisul 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 frunzis al coroanei;
  3. Paralelipipedele de pe nivelul 6, respectiv ultimul nivel al ierarhiei, sunt desenate prin aplicarea texturii de frunzis 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.

Pentru o deformare suplimentara a geometriei copacului, in procesul de desenare a ierarhiei de paralelipipede, se utilizeaza optiunea 1 de plasare pe suprafata asteroidului, descrisa mai sus.

Selectie destinatie

TODO: explicatii: - RGBA, float

- Explicatii blit pe framebuffer-ul implicit

Control elicopter

TODO: Descriere generala

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.

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 inaltime + 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
    • Depunctare: Lipsa plasare elicopter pe suprafata asteroidului - -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
    • Depunctare: Lipsa plasare copac pe suprafata asteroidului - -0.2p

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.1733838498.txt.gz · Last modified: 2024/12/10 15:48 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