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

Switch to unified view

a b/FindExternalVoxels.asv
1
function [FV]=FindExternalVoxels(VoxelMat,Vox_Size)
2
% FindExternalVoxels scans VoxeLMat (a 3D matrix) and finds which voxels
3
% are external by checking if they have nieghbors from all 6 sides
4
% (TOP,BOTTOM,FRONT,BACK,LEFT,RIGHT). After finding if the voxel is
5
% external it finds which faces are external by calling FindExternalFaces
6
% function and generating an FV structure for visualization
7
8
%initializing variables
9
FV.vertices=zeros(8*size(VoxelMat,1)*size(VoxelMat,2)*size(VoxelMat,3),3);
10
FV.faces=zeros(6*size(VoxelMat,1)*size(VoxelMat,2)*size(VoxelMat,3),4);
11
12
13
FaceIndex=1;
14
VertexIndex=0;
15
counter=1;
16
17
ExternalIndexes=zeros(size(VoxelMat,1)*size(VoxelMat,2)*size(VoxelMat,3),3);
18
voxel_size=2^(Vox_Size-1)*[1 1 1];
19
h=waitbar(0,'loading voxels, please wait...');
20
21
for i=1:size(VoxelMat,1)
22
    for j=1:size(VoxelMat,2)
23
        for k=1:size(VoxelMat,3)
24
            if VoxelMat(i,j,k)==1                                     %if value is only one ....
25
                if i==1 || j==1 || k==1 || i==size(VoxelMat,1) || j== size(VoxelMat,2) || k== size(VoxelMat,3)                 
26
                    ExternalIndexes(counter,1:3)=[i j k] ;
27
                    [FV,FaceIndex,VertexIndex]=FindExternalFaces(VoxelMat,ExternalIndexes,voxel_size,counter,FaceIndex,VertexIndex,Vox_Size,FV);
28
                    counter=counter+1;                
29
                else
30
                    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
31
                        ExternalIndexes(counter,1:3)=[i j k] ;
32
                        [FV,FaceIndex,VertexIndex]=FindExternalFaces(VoxelMat,ExternalIndexes,voxel_size,counter,FaceIndex,VertexIndex,Vox_Size,FV);
33
                        counter=counter+1;
34
                    end
35
                end
36
            end
37
        end
38
    end 
39
    waitbar(i/size(VoxelMat,1));
40
end
41
42
counter=counter-1;
43
FV.vertices=FV.vertices(any(FV.vertices,2),:);
44
FV.faces=FV.faces(any(FV.faces,2),:);
45
close(h) ;
46
end
47
48
function [FV,FaceIndex,VertexIndex]=FindExternalFaces(VoxelMat,ExternalIndexes,voxel_size,i,FaceIndex,VertexIndex,LOD,FV)
49
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];
50
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]; ...
51
    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)]; ...
52
    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)]]';
53
if ExternalIndexes(i,2)~=1
54
    if VoxelMat(ExternalIndexes(i,1),ExternalIndexes(i,2)-1,ExternalIndexes(i,3))==0  %if val is zero no front neighbour
55
        %No Front neighbor
56
        FV.faces(FaceIndex,:)=faces(1,:)+VertexIndex;
57
        FaceIndex=FaceIndex+1;
58
    end
59
else
60
    % Bounding Box Front
61
    FV.faces(FaceIndex,:)=faces(1,:)+VertexIndex;
62
    FaceIndex=FaceIndex+1;
63
end
64
if ExternalIndexes(i,1)~=size(VoxelMat,1)
65
    if VoxelMat(ExternalIndexes(i,1)+1,ExternalIndexes(i,2),ExternalIndexes(i,3))==0
66
        %No Right neighbor
67
        FV.faces(FaceIndex,:)=faces(2,:)+VertexIndex;
68
        FaceIndex=FaceIndex+1;
69
    end
70
else
71
    % Bounding Box Right
72
    FV.faces(FaceIndex,:)=faces(2,:)+VertexIndex;
73
    FaceIndex=FaceIndex+1;
74
end
75
if ExternalIndexes(i,2)~=size(VoxelMat,2)
76
    if VoxelMat(ExternalIndexes(i,1),ExternalIndexes(i,2)+1,ExternalIndexes(i,3))==0
77
        % No Back neighbor
78
        FV.faces(FaceIndex,:)=faces(3,:)+VertexIndex;
79
        FaceIndex=FaceIndex+1;
80
    end
81
else
82
    % Bounding Box Back
83
    FV.faces(FaceIndex,:)=faces(3,:)+VertexIndex;
84
    FaceIndex=FaceIndex+1;
85
end
86
if ExternalIndexes(i,1)~=1
87
    if VoxelMat(ExternalIndexes(i,1)-1,ExternalIndexes(i,2),ExternalIndexes(i,3))==0
88
        %No Left neighbor
89
        FV.faces(FaceIndex,:)=faces(4,:)+VertexIndex;
90
        FaceIndex=FaceIndex+1;
91
    end
92
else
93
    % Bounding Box Left
94
    FV.faces(FaceIndex,:)=faces(4,:)+VertexIndex;
95
    FaceIndex=FaceIndex+1;
96
end
97
if ExternalIndexes(i,3)~=size(VoxelMat,3)
98
    if VoxelMat(ExternalIndexes(i,1),ExternalIndexes(i,2),ExternalIndexes(i,3)+1)==0
99
        %No Top neighbor
100
        FV.faces(FaceIndex,:)=faces(5,:)+VertexIndex;
101
        FaceIndex=FaceIndex+1;
102
    end
103
else
104
    % Bounding Box Top
105
    FV.faces(FaceIndex,:)=faces(5,:)+VertexIndex;
106
    FaceIndex=FaceIndex+1;
107
end
108
if ExternalIndexes(i,3)~=1
109
    if VoxelMat(ExternalIndexes(i,1),ExternalIndexes(i,2),ExternalIndexes(i,3)-1)==0
110
        %No Bottom neighbor
111
        FV.faces(FaceIndex,:)=faces(6,:)+VertexIndex;
112
        FaceIndex=FaceIndex+1;
113
    end
114
else
115
    % Bounding Box Bottom
116
    FV.faces(FaceIndex,:)=faces(6,:)+VertexIndex;
117
    FaceIndex=FaceIndex+1;
118
end
119
VertexIndex=VertexIndex+8;
120
end