This shows you the differences between two versions of the page.
vdvac:lab1 [2024/03/06 08:48] anca.morar [Concepte teoretice] |
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 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 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> |