This is an old revision of the document!


Tema 3: Simularea apei

  • Responsabil: Oana Ferche
  • Perioada de lucru: 8 Decembrie 2016 - 8 Ianuarie 2017 (2 saptamani + 1 zi)
  • Depunctare intarziere: 2.5p/zi pana la maxim 40p din totalul de 100p
  • Perioada vacantei: 24 Decembrie 2016 - 8 Ianuarie 2017 (nu este considerata perioada de lucru deci nu exista ni depunctare asociata acestei perioade)

Actualizari enunt:

22 Decembrie:

  • A fost modificata perioada de lucru (+1zi)
  • 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

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

  • Ai este amplitudinea undei
  • Di (x,z) este directia undei
  • wi este frecventa undei - are legatura cu lungimea de unda L astfel: w = 2π/L
  • φi este faza - are legatura cu viteza S (distanta cu care creasta valului se deplaseaza
  • per secunda): φ = S x 2π/L
  • x este produs normal (nu vectorial), iar · este produs scalar

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

  • Una in varful curent V(i,j). Rezulta coordonatele varfului V1
  • Una in varful predecesor pe axa X, V(i-1,j). Rezulta varful V2
  • Una in varful urmator pe axa X, V(i+1,j). Rezulta varful V3
  • Una in varful predecesor pe axa Z, V(i,j-1). Rezulta varful V4
  • Una in varful urmator pe axa Z, V(i,j+1). Rezulta varful V5

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

  • Crearea plasei poligonale initiale 5%
  • Sfera controlata din taste si lansarea de picaturi cu bouncing effect 20%
  • Calculul varfurilor din plasa poligonala deformata 15%
  • Calculul normalelor varfurilor in plasa deformata 20%
  • Atenuarea undelor in timp 10%
  • Efect de slow-motion (sau fast-forward) fara sacadare 10%
  • Iluminarea folosind modelul de shading Phong 10% (lumina poate fi deplasata cu tastele)
  • Camera FPS functionala 5%
  • Readme 5%

Posibile bonusuri

  • Alte metode de generare a undelor, mai avansate decat cea explicata aici (de exemplu:
  • Gerstner, Stokes-Navier)
  • Posibilitatea de a lansa mai multe picaturi in acelasi timp pe pozitii diferite
  • Modificarea formei picaturii de apa in cadere
  • Orice aduce realism scenei

  • 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:

egc/teme/03.1482447987.txt.gz · Last modified: 2016/12/23 01:06 by gabriel.ivanica
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