Table of Contents

Tema 3: Simularea apei

Actualizari enunt:

22 Decembrie:

  • A fost modificata perioada de lucru (+1 zi)
  • Au fost adaugate explicatii suplimentare in cazul in care existau neclaritati asupra cerintei temei sau a unor termeni utilizati
    • “o unda”, “un val” - un singur varf (amplitudine)
    • efectul de “slow-motion” - trebuie sa permita si (“fast-foward”) adica revenirea la viteza initiala sau cresterea acesteia

Diferenta dintre cele 2 intelesuri in cazul in care s-a inteles gresit termenul de “un val” / “o unda” (adica diferenta dintre unda cu multiple puncte de amplitudine si un singur punct de amplitudine (ce cere tema) consista doar in tratarea unei logici suplimentare ce nu ar trebui sa depaseasca cateva linii de cod, activitate ce ar trebui sa fie acoperita lejer de prelungirea cu 1 zi a perioadei de lucru.

Enunt

In cadrul acestei teme trebuie sa creati o plasa poligonala ce simuleaza apa. Deasupra plasei va exista o sfera ce poate fi deplasata din taste la o inaltime constanta deasupra apei. La apasarea tastei Space, din aceasta sfera se va lansa o “picatura” de apa (practic o alta sfera) ce va cadea pe verticala pe plasa. La contactul cu suprafata acesteia, din punctul de contact se va simula o unda (un singur val, cu un singur punct de amplitudine) sinusoidala circulara, asemeni valurilor generate de o picatura pe suprafata unei ape linistite. Unda respectiva se va atenua in timp.

Se va implementa si bouncing effect: https://www.youtube.com/watch?v=6KKNnjFpGto. Picatura de apa cade, jumatate din ea dispare si creaza un val circular ce se propaga spre marginea plasei poligonale, dupa care jumatatea ramasa face un bounce mic urmand ca si aceasta la randul sau sa cada producand un al 2-lea val circular. Procedeul se repeta de un numar finit de ori (potrivit are fi intre 5-7). Practic o picatura va genera intre 5 si 7 valuri independente (unde cu un singur varf - o singura aplitudine) ci nu 5-7 semnale sinusoidale cu mai multe varfuri de amplitudine.

Miscarea picaturii pentru acest efect se va implementa tinand cont de acceleratia gravitationala precum si de modificarea masei picaturii (la injumatatirea acesteia dupa fiecare bounce, se va reduce si greutatea sa, lucru ce se va reflecta in modul in care aceasta se deplaseaza, conform legii a doua a dinamicii F=m*a).

In tot acest timp, utilizatorul poate continua deplasarea sferei controlate din taste si lansarea de noi “picaturi” in orice alt punct de pe suprafata (undele prezente simultan se vor compune).

Se va implementa si un efect de slow-motion (controlat de la tastatura si cu animatie continua, nu scadata) care sa incetineasca(sau sa creasca bineinteles) miscarea undelor pentru a permite mai buna observare a acestora.

Intreaga scena va fi iluminata folosind modelul de shading Phong.

Va trebui sa creati (intr-un fisier sau programatic) o plasa poligonala ce defineste un grid. Un exemplu de astfel de grid este solul din laboratorul 7. Totusi, nivelul de detaliu al solului din laborator nu este destul de bun pentru cerintele temei. Plasa voastra poligonala trebuie sa aiba cel putin 100 x 100 varfuri.

Teorie

Daca se considera ca lucram intr-o lume in care coordonta y reprezinta inaltimea, pentru a face un teren tridimensional din gridul initial, fiecare varf din grid isi pastreaza coordonatele (x,z) dar isi modifica inaltimea (coordonata y).

Pentru simularea valurilor, se pot folosi diferite modele de deformare a gridului. O metoda posibila de realizare a acestei deformari este insumarea unor curbe de tip sinus cu diferiti parametri, pentru calculul inaltimii:

unde

Daca undele sunt directionale, Di este constanta pe intreaga durata de viata a undei. Daca undele sunt circulare (cum sunt in cazul acestei teme), Di trebuie calculata pentru fiecare varf:

unde Ci(x,z) este centrul udei, iar (x,z) sunt coordonatele x si z ale varfului.

Pentru mai multe explicatii privind formula prezentata, puteti citi articolul urmator: http://http.developer.nvidia.com/GPUGems/gpugems_ch01.html

Implementare

Initial toate varfurile plasei poligonale ar trebui sa aiba normala (0,1,0). Dupa deplasarea varfurilor, aceste normale se modifica si ele, deci, pentru o iluminare corecta, normalele trebuie recalculate. Pentru calculul normalelor se poate alege solutia bazata pe derivate (ca in articol), sau se poate aproxima in modul urmator:

Deoarece in vertex shader aveti prelucrarile pentru varful curent, si nu aveti acces la pozitiile altor varfuri, trebuie sa calculati unde sunt pozitionate varfurile vecine varfului curent. Astfel, pentru varful curent, se calculeaza cinci inaltimi (cu formula precendenta):

Unind V1 cu celelalte varfuri obtinem patru muchii cu care putem defini patru triunghiuri, ca in figura de mai jos. Pentru fiecare din cele patru triunghiuri se calculeaza normala per triunghi (prin produs vectorial intre doua laturi ale triunghiului). Media celor patru normale obtinute este normala varfului curent. Acum daca aveti normala in fiecare varf, puteti calcula corect iluminarea (ca in laboratorul 8).

Cerinte

- Crearea plasei poligonale nedeformate (citire din fisier sau programatic), folosind vao, vbo, ibo si trimiterea la vertex shader a pozitiilor varfurilor.

- Desenarea sferei ce lanseaza picaturile si controlul acesteia din tastatura. Lansarea “picaturilor” de apa care la contactul cu suprafata dispar si genereaza undele circulare sinusoidale.

- Efectul de bouncing.

- Stabilirea parametrilor sinusoidelor: Ai, Di (x,z), Ci(x,z) , wi si φi (pe CPU si trimisi la vertex shader).

- Atenuarea in timp a undelor (practic a fiecarui val creat de impactul picaturii cu suprafata apei).

- Efectul de slow-motion/fast-forward (trebuie sa permita si efect invers de fast-forward)

- Calculul undei in vertex shader folosind procesul prezentat anterior (sau unul mai avansat): atat pozitiile finale ale varfurilor cat si normalele acestora se vor calcula in vertex shader (nu se transmit de la CPU).

- Iluminare folosind modelul de shading Phong (calculul culorii varfurilor in fragment shader) si modelul de reflexie care sa contina si componenta speculara (Phong/Blinn-Phong/etc.)

- Lumina cu care este iluminata scena se poate deplasa cu tastele

- Implementarea unei camere FPS complet functionale (si translatie si rotatie), cu care sa se poata explora spatiul

Barem orientativ

Posibile bonusuri

  • Bonusul se acorda doar daca cerintele de baza ale temei sunt implementate corect
  • Notarea bonusului este la latitudinea asistentului si a calitatii implementarii, nu exista barem dar in principiu se pot accorda 5, 10, 15 pct
  • Pentru implementari foarte speciale bonusul acordat poate ajunge pana la maxim 20 pct
  • Bonusul nu este conditionat de trimiterea la timp a temei. Puteti obtine bonus chiar daca ati trimis tema cu intarziere.

Anexe

Exemplu de plasa deformata de trei unde circulare: