This shows you the differences between two versions of the page.
vdvac:lab1 [2024/03/06 08:34] anca.morar [Metode] |
vdvac:lab1 [2024/03/07 08:52] (current) anca.morar [Concepte teoretice] |
||
---|---|---|---|
Line 13: | Line 13: | ||
* un cub cu vârfuri care au asociate valori scalare | * un cub cu vârfuri care au asociate valori scalare | ||
**Izosuprafața** - suprafața care are aceeași valoare scalară (izovaloare) în toate punctele sale | **Izosuprafața** - suprafața care are aceeași valoare scalară (izovaloare) în toate punctele sale | ||
+ | |||
**Izovaloarea** - o valoare care are o anumită semnificație în funcție de domeniu. Exemple: | **Izovaloarea** - o valoare care are o anumită semnificație în funcție de domeniu. Exemple: | ||
* densitate (medicină) | * densitate (medicină) | ||
Line 28: | Line 29: | ||
* **tabela de laturi**: laturile care sunt intersectate de izosuprafață pentru o combinație de vârfuri | * **tabela de laturi**: laturile care sunt intersectate de izosuprafață pentru o combinație de vârfuri | ||
* **tabela de triunghiuri**: modul în care trebuie conectate punctele de intersecție | * **tabela de triunghiuri**: modul în care trebuie conectate punctele de intersecție | ||
- | Tabelele - adresate de un index pe 8 biți: | + | Tabelele - adresate de un indice pe 8 biți: |
* $b_i=1$ dacă $v_i$ e interior izosuprafeței | * $b_i=1$ dacă $v_i$ e interior izosuprafeței | ||
* $b_i=0$ dacă $v_i$ e exterior izosuprafeței | * $b_i=0$ dacă $v_i$ e exterior izosuprafeței | ||
Line 46: | Line 47: | ||
===== Implementare ===== | ===== Implementare ===== | ||
- | Framework-ul de laborator se poate descărca de aici. | + | Framework-ul de laborator se poate descărca de [[https://graphics.cs.pub.ro/~anca/Vizualizare_volumetrica/|aici]] sau de pe Moodle. |
==== Atribute ==== | ==== Atribute ==== | ||
Line 76: | Line 77: | ||
* ''grid.n[]'' conțin normalele vârfurilor voxelului curent (calculate conform **Fig. 4**): de exemplu, | * ''grid.n[]'' conțin normalele vârfurilor voxelului curent (calculate conform **Fig. 4**): de exemplu, | ||
<code> grid.n[0] = glm::vec3(volumeData[z * xsize * ysize + y * xsize + (x+1)] - volumeData[z * xsize * ysize + y * xsize + (x-1)],volumeData[z * xsize * ysize + (y+1) * xsize + x] - volumeData[z * xsize * ysize + (y-1) * xsize + x],volumeData[(z+1) * xsize * ysize + y * xsize + x] - volumeData[(z-1) * xsize * ysize + y * xsize + x]); | <code> grid.n[0] = glm::vec3(volumeData[z * xsize * ysize + y * xsize + (x+1)] - volumeData[z * xsize * ysize + y * xsize + (x-1)],volumeData[z * xsize * ysize + (y+1) * xsize + x] - volumeData[z * xsize * ysize + (y-1) * xsize + x],volumeData[(z+1) * xsize * ysize + y * xsize + x] - volumeData[(z-1) * xsize * ysize + y * xsize + x]); | ||
- | grid.n[1] = glm::vec3(volumeData[z * xsize * ysize + y * xsize + (x+2)] - volumeData[z * xsize * ysize + y * xsize + x],volumeData[z * xsize * ysize + (y+1) * xsize + x] - volumeData[z * xsize * ysize + (y-1) * xsize + x],volumeData[(z+1) * xsize * ysize + y * xsize + x] - volumeData[(z-1) * xsize * ysize + y * xsize + x]); | + | grid.n[1] = glm::vec3(volumeData[z * xsize * ysize + y * xsize + (x+2)] - volumeData[z * xsize * ysize + y * xsize + x],volumeData[z * xsize * ysize + (y+1) * xsize + (x+1)] - volumeData[z * xsize * ysize + (y-1) * xsize + (x+1)],volumeData[(z+1) * xsize * ysize + y * xsize + (x+1)] - volumeData[(z-1) * xsize * ysize + y * xsize + (x+1)]); |
//Atentie sa nu ieșiti din volum !!! | //Atentie sa nu ieșiti din volum !!! | ||
</code> | </code> | ||
Line 83: | Line 84: | ||
<code> int PolygoniseCube(GRIDCELL g, double iso, TRIANGLE *tri); </code> | <code> int PolygoniseCube(GRIDCELL g, double iso, TRIANGLE *tri); </code> | ||
Această funcție este completată parțial. Ea | Această funcție este completată parțial. Ea | ||
- | * determină configurația voxelului relativ la suprafață: indicele ''cubeindex'' din tabela de muchii (din LookupTables) care identifică muchiile din voxel care sunt intersectate de suprafață. | + | * determină configurația voxelului relativ la suprafață: indicele ''cubeindex'' din tabela de muchii (din ''LookupTables'') care identifică muchiile din voxel care sunt intersectate de suprafață. |
* calculează (prin interpolare) vârfurile unde suprafața intersectează voxelul | * calculează (prin interpolare) vârfurile unde suprafața intersectează voxelul | ||
- | * creează suprafața triunghiulară rezultată, pe baza tabelei de triunghiuri (din LookupTables). | + | * creează suprafața triunghiulară rezultată, pe baza tabelei de triunghiuri (din ''LookupTables''). |
Line 95: | Line 96: | ||
+ | ==== Cerinte laborator ==== | ||
+ | - Să se completeze pozitiile și valorile scalare ale vârfurilor voxelilor din volum, ''grid.p[]'' și ''grid.val[]''. Dacă se completează corect, pe ecran va apărea suprafața triunghiulară (cu normale per triunghi) | ||
+ | - Să se modifice izovaloarea la apăsarea unor taste (în ''onInputUpdate()''). La modificarea izovalorii, trebuie reapelată funcția ''reconstructSurface()'' | ||
+ | - Să se calculeze normalele vârfurilor voxelilor din volum, ''grid.n[]'' prin diferențe finite (și apoi să se normalizeze) | ||
+ | - Să se completeze ''normallist[]'' - tabloul cu normalele asociate punctelor de intersecție de pe muchiile voxelului curent (calculate prin interpolare între normalele din vârfurile voxelului) | ||
+ | - Să se determine normalele ''normal1'', ''normal2'' și ''normal3'' asociate triunghiului curent care rezultă în urma intersecției dintre izosuprafață și voxel. Să se înlocuiască normala per triunghi cu normalele per vârfurile triunghiului. Dacă se completează corect, pe ecran va apărea suprafața triunghiulară netedă | ||
+ | |||
+ | ==== Demo ==== | ||
+ | |||
+ | <html> | ||
+ | <p style="text-align:center;margin:auto;"> | ||
+ | <iframe width="430" height="250" src="https://www.youtube.com/embed/BPVjnVhJ27g" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> | ||
+ | </p> | ||
+ | </html> |