Diff of /FindExternalVoxels.asv [000000] .. [f949a5]

Switch to side-by-side view

--- a
+++ b/FindExternalVoxels.asv
@@ -0,0 +1,120 @@
+function [FV]=FindExternalVoxels(VoxelMat,Vox_Size)
+% FindExternalVoxels scans VoxeLMat (a 3D matrix) and finds which voxels
+% are external by checking if they have nieghbors from all 6 sides
+% (TOP,BOTTOM,FRONT,BACK,LEFT,RIGHT). After finding if the voxel is
+% external it finds which faces are external by calling FindExternalFaces
+% function and generating an FV structure for visualization
+
+%initializing variables
+FV.vertices=zeros(8*size(VoxelMat,1)*size(VoxelMat,2)*size(VoxelMat,3),3);
+FV.faces=zeros(6*size(VoxelMat,1)*size(VoxelMat,2)*size(VoxelMat,3),4);
+
+
+FaceIndex=1;
+VertexIndex=0;
+counter=1;
+
+ExternalIndexes=zeros(size(VoxelMat,1)*size(VoxelMat,2)*size(VoxelMat,3),3);
+voxel_size=2^(Vox_Size-1)*[1 1 1];
+h=waitbar(0,'loading voxels, please wait...');
+
+for i=1:size(VoxelMat,1)
+    for j=1:size(VoxelMat,2)
+        for k=1:size(VoxelMat,3)
+            if VoxelMat(i,j,k)==1                                     %if value is only one ....
+                if i==1 || j==1 || k==1 || i==size(VoxelMat,1) || j== size(VoxelMat,2) || k== size(VoxelMat,3)                 
+                    ExternalIndexes(counter,1:3)=[i j k] ;
+                    [FV,FaceIndex,VertexIndex]=FindExternalFaces(VoxelMat,ExternalIndexes,voxel_size,counter,FaceIndex,VertexIndex,Vox_Size,FV);
+                    counter=counter+1;                
+                else
+                    if VoxelMat(i+1,j,k)==0 || VoxelMat(i-1,j,k)==0 || VoxelMat(i,j+1,k)==0 || VoxelMat(i,j-1,k)==0 || VoxelMat(i,j,k+1)==0 || VoxelMat(i,j,k-1)==0
+                        ExternalIndexes(counter,1:3)=[i j k] ;
+                        [FV,FaceIndex,VertexIndex]=FindExternalFaces(VoxelMat,ExternalIndexes,voxel_size,counter,FaceIndex,VertexIndex,Vox_Size,FV);
+                        counter=counter+1;
+                    end
+                end
+            end
+        end
+    end 
+    waitbar(i/size(VoxelMat,1));
+end
+
+counter=counter-1;
+FV.vertices=FV.vertices(any(FV.vertices,2),:);
+FV.faces=FV.faces(any(FV.faces,2),:);
+close(h) ;
+end
+
+function [FV,FaceIndex,VertexIndex]=FindExternalFaces(VoxelMat,ExternalIndexes,voxel_size,i,FaceIndex,VertexIndex,LOD,FV)
+faces=[1 2 3 4; 2 6 7 3 ; 6 5 8 7; 5 1 4 8; 4 3 7 8 ; 1 2 6 5];
+FV.vertices(VertexIndex+1:VertexIndex+8,:)=[2^(LOD-1)*(ExternalIndexes(i,1)-1)+0.5+[0 voxel_size(1) voxel_size(1) 0 0 voxel_size(1) voxel_size(1) 0]; ...
+    2^(LOD-1)*(ExternalIndexes(i,2)-1)+0.5+[0 0 0 0 voxel_size(2) voxel_size(2) voxel_size(2) voxel_size(2)]; ...
+    2^(LOD-1)*(ExternalIndexes(i,3)-1)+0.5+[0 0 voxel_size(3) voxel_size(3) 0 0 voxel_size(3) voxel_size(3)]]';
+if ExternalIndexes(i,2)~=1
+    if VoxelMat(ExternalIndexes(i,1),ExternalIndexes(i,2)-1,ExternalIndexes(i,3))==0  %if val is zero no front neighbour
+        %No Front neighbor
+        FV.faces(FaceIndex,:)=faces(1,:)+VertexIndex;
+        FaceIndex=FaceIndex+1;
+    end
+else
+    % Bounding Box Front
+    FV.faces(FaceIndex,:)=faces(1,:)+VertexIndex;
+    FaceIndex=FaceIndex+1;
+end
+if ExternalIndexes(i,1)~=size(VoxelMat,1)
+    if VoxelMat(ExternalIndexes(i,1)+1,ExternalIndexes(i,2),ExternalIndexes(i,3))==0
+        %No Right neighbor
+        FV.faces(FaceIndex,:)=faces(2,:)+VertexIndex;
+        FaceIndex=FaceIndex+1;
+    end
+else
+    % Bounding Box Right
+    FV.faces(FaceIndex,:)=faces(2,:)+VertexIndex;
+    FaceIndex=FaceIndex+1;
+end
+if ExternalIndexes(i,2)~=size(VoxelMat,2)
+    if VoxelMat(ExternalIndexes(i,1),ExternalIndexes(i,2)+1,ExternalIndexes(i,3))==0
+        % No Back neighbor
+        FV.faces(FaceIndex,:)=faces(3,:)+VertexIndex;
+        FaceIndex=FaceIndex+1;
+    end
+else
+    % Bounding Box Back
+    FV.faces(FaceIndex,:)=faces(3,:)+VertexIndex;
+    FaceIndex=FaceIndex+1;
+end
+if ExternalIndexes(i,1)~=1
+    if VoxelMat(ExternalIndexes(i,1)-1,ExternalIndexes(i,2),ExternalIndexes(i,3))==0
+        %No Left neighbor
+        FV.faces(FaceIndex,:)=faces(4,:)+VertexIndex;
+        FaceIndex=FaceIndex+1;
+    end
+else
+    % Bounding Box Left
+    FV.faces(FaceIndex,:)=faces(4,:)+VertexIndex;
+    FaceIndex=FaceIndex+1;
+end
+if ExternalIndexes(i,3)~=size(VoxelMat,3)
+    if VoxelMat(ExternalIndexes(i,1),ExternalIndexes(i,2),ExternalIndexes(i,3)+1)==0
+        %No Top neighbor
+        FV.faces(FaceIndex,:)=faces(5,:)+VertexIndex;
+        FaceIndex=FaceIndex+1;
+    end
+else
+    % Bounding Box Top
+    FV.faces(FaceIndex,:)=faces(5,:)+VertexIndex;
+    FaceIndex=FaceIndex+1;
+end
+if ExternalIndexes(i,3)~=1
+    if VoxelMat(ExternalIndexes(i,1),ExternalIndexes(i,2),ExternalIndexes(i,3)-1)==0
+        %No Bottom neighbor
+        FV.faces(FaceIndex,:)=faces(6,:)+VertexIndex;
+        FaceIndex=FaceIndex+1;
+    end
+else
+    % Bounding Box Bottom
+    FV.faces(FaceIndex,:)=faces(6,:)+VertexIndex;
+    FaceIndex=FaceIndex+1;
+end
+VertexIndex=VertexIndex+8;
+end
\ No newline at end of file