This is an old revision of the document!
Voxel
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:
Un vârf al unui voxel poate fi
Exista 15 configurații posibile ale vârfurilor unui voxel față de suprafață Pentru codificarea configurațiilor: 2 tabele de căutare
Tabelele - adresate de un index pe 8 biți:
Calculul coordonatelor punctelor de intersecție
Calculul normalei intr-un vârf al unui voxel
Framework-ul de laborator se poate descărca de aici.
unsigned int xsize, ysize, zsize; // dimensiunile volumului de date unsigned char *volumeData; //tablou care conține valorile scalare din volum double isolevel; //izovaloarea izosuprafeței TRIANGLE *tri; //tabloul în care se stochează suprafața triunghiulară
Încărcare date din fișier
bool loadRAWFile(const string& fileLocation, unsigned int xsize, unsigned int ysize, unsigned int zsize);
Această funcție este deja completată.
Se încarcă în volumeData
datele dintr-un fișier .raw
.
Fișierele .raw
se găsesc în \assets\volumes\
iar informațiile despre dimensiunea fiecărui volum, în \assets\volumes\readme.txt
Interpolare liniară
glm::vec3 VertexInterp(double isolevel, glm::vec3 p1, glm::vec3 p2, double valp1, double valp2);
Această funcție este deja completată.
Se întoarce poziția punctului de intersecție de pe muchia dintre p1
și p2
, în funcție de izovaloare (isolevel
) și de valorile punctelor p1
și p2
.
Reconstrucție suprafață
void reconstructSurface(Mesh *mesh)
Această funcție este completată parțial.
Aici se completează informațiile pentru voxelul curent GRIDCELL grid;
:
grid.p[]
conțin pozițiile vârfurilor voxelului: de exemplu, pentru iteratorii x, y, z
prin volum, grid.p[0]=glm::vec3(x,y,z) grid.p[1]=glm::vec3(x+1,y,z) //A se vedea ordinea vârfurilor în LookupTables.h !!!
grid.val[]
conțin valorile scalare ale voxelului curent: de exemplu, grid.val[0] = volumeData[z * xsize * ysize + y * xsize + x]; grid.val[1] = volumeData[z * xsize * ysize + y * xsize + (x+1)];
grid.n[]
conțin normalele vârfurilor voxelului curent (calculate conform Fig. 4): de exemplu,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]); //Atentie sa nu ieșiti din volum !!!
Calcul intersecție dintre un voxel și suprafață
int PolygoniseCube(GRIDCELL g, double iso, TRIANGLE *tri);
Această funcție este completată parțial. Ea