As for the problem in your code, it seems that you set the points inside the sphere to 1, and then set all the remaining points outside the sphere to 2, and then through the y plane to 3. There is no value 0 in volume in this case, so try to get isosurface if set to 0, it will not find anything.
However, if you prefer to create a “voxelized” Minecraft surface, as in your sample showing the edges of your voxels, then I have one more option for you ...
First, I created a volume dataset, as in your example, except that I omitted the for loop, which sets the values to 2, and instead sets the solid bar to 2.
Then I used the build_voxels function, which I used in several of my 3D projects:
function [X, Y, Z, C] = build_voxels(roiMask) maskSize = size(roiMask); % Create the ROI surface patches pointing toward -x: index = find(diff(padarray(roiMask, [1 0 0], 'pre'), 1, 1) > 0); [X1, Y1, Z1, C1] = make_patches([-1 -1 -1 -1], [1 1 -1 -1], [-1 1 1 -1]); % Create the ROI surface patches pointing toward +x: index = find(diff(padarray(roiMask, [1 0 0], 'post'), 1, 1) < 0); [X2, Y2, Z2, C2] = make_patches([1 1 1 1], [-1 -1 1 1], [-1 1 1 -1]); % Create the ROI surface patches pointing toward -y: index = find(diff(padarray(roiMask, [0 1 0], 'pre'), 1, 2) > 0); [X3, Y3, Z3, C3] = make_patches([-1 -1 1 1], [-1 -1 -1 -1], [-1 1 1 -1]); % Create the ROI surface patches pointing toward +y: index = find(diff(padarray(roiMask, [0 1 0], 'post'), 1, 2) < 0); [X4, Y4, Z4, C4] = make_patches([1 1 -1 -1], [1 1 1 1], [-1 1 1 -1]); % Create the ROI surface patches pointing toward -z: index = find(diff(padarray(roiMask, [0 0 1], 'pre'), 1, 3) > 0); [X5, Y5, Z5, C5] = make_patches([1 1 -1 -1], [-1 1 1 -1], [-1 -1 -1 -1]); % Create the ROI surface patches pointing toward +z: index = find(diff(padarray(roiMask, [0 0 1], 'post'), 1, 3) < 0); [X6, Y6, Z6, C6] = make_patches([-1 -1 1 1], [-1 1 1 -1], [1 1 1 1]); % Collect patch data: X = [X1 X2 X3 X4 X5 X6]; Y = [Y1 Y2 Y3 Y4 Y5 Y6]; Z = [Z1 Z2 Z3 Z4 Z5 Z6]; C = [C1 C2 C3 C4 C5 C6]; function [Xp, Yp, Zp, Cp] = make_patches(Xo, Yo, Zo) [Xp, Yp, Zp] = ind2sub(maskSize, index); Xp = bsxfun(@plus, Xp, Xo./2).'; Yp = bsxfun(@plus, Yp, Yo./2).'; Zp = bsxfun(@plus, Zp, Zo./2).'; Cp = index(:).'; end end
This function takes a 3D matrix, ideally a logical mask of volume area (s) to create a surface for and returns 4 4-on-N matrices: X/Y/Z matrices for voxel face patches and an index matrix C , which can be used to obtain values from the volume data matrix to use when painting each surface.
Here is the code for visualizing surfaces:
[X, Y, Z, C] = build_voxels(Img > 0); rgbData = reshape([1 0 0; 1 1 0], [2 1 3]); hSurface = patch(X, Y, Z, rgbData(Img(C), :, :), ... 'AmbientStrength', 0.5, ... 'BackFaceLighting', 'unlit', ... 'EdgeColor', 'none', ... 'FaceLighting', 'flat'); axis equal; axis tight; view(45, 45); grid on; xlabel('x-axis (voxels)'); ylabel('y-axis (voxels)'); zlabel('z-axis (voxels)'); light('Position', get(gca, 'CameraPosition'), 'Style', 'local');
And here is the plot:

Please note that the surfaces of the sphere and the rod are colored differently, since they are marked with values 1 and 2, respectively, in the volume data Img . These values are extracted from Img using C , and then used as an index in rgbData , which contains red (first row) and yellow (second row) RGB triplets. This will create an N-by-1-by-3 matrix of the polygon color .