This shows you the differences between two versions of the page.
vdvac:lab1 [2024/03/06 09:40] anca.morar [Cerinte laborator] |
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 99: | Line 100: | ||
- Să se modifice izovaloarea la apăsarea unor taste (în ''onInputUpdate()''). La modificarea izovalorii, trebuie reapelată funcția ''reconstructSurface()'' | - 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 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 | + | - 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 calculeze 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ă | + | - 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 ==== | ==== 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> |