|
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 |