MATLAB: 3D body plot ( visualization )

MATLABvolume visualization 3d

Hi, I have little or no experience with volumetric data in MATLAB, I found next appropriated descriptions: http://www.mathworks.com/help/techdoc/ref/isonormals.html
I need to complete next task:
I have 3 vectors ( rows ):
x_ = vector(1:smpl:max_row,1);
y_ = vector(1:smpl:max_row,2);
z_ = vector(1:smpl:max_row,3);
that are samples from large 3 columns array vector with height max_row. x_ , y_ , z_ are points of 3D figure – surface points of the figure ( volume ). They represent 3D body that should be drawn in matlab.
I created linear grid:
%linear grid
a = -1.1:step:(-1.1+step*(length(x_)-1));
b = -1.1:step:(-1.1+step*(length(y_)-1));
c = -1.1:step:(-1.1+step*(length(z_)-1));
[x,y,z] = meshgrid(-1.1:step:(-1.1+step*(length(x_)-1)));
and also I create array v length(x_)*length(x_)*length(x_) that contains '1' in cells that are of 3D body representation function points and '0' another.
I tryied to make interpolation:
vi = interp3(x,y,z,v,x,y,z,'nearest');
but then vi = v that I've already created.
Now I need to plot the v array on 3D and form 3D body like in
for example.
I make that next way:
%plotting:
figure
p = patch(isosurface(x,y,z,v,1e- 5,'verbose'),'FaceColor','green','EdgeColor','none');
grid on;
isonormals(v,p);
daspect([1 1 1])
view(3);
axis tight;
camproj perspective;
camlight
lighting gouraud
colormap(hsv)
I expect to get body enclosed by the points where v = 1 , but I get then only small rectangles in place of function '1' that are not connected ( see attached picture ) Does anybody know what is the problem , how to draw 3D body from the x,y,z,v vectors ?
Thanks in advance.
image:

Best Answer

The output from:
fv = isosurface(v,0);
patch(fv);
Is expected, i.e. each object (voxel) is being patched. Since you want to whole thing to be treated as one object, you need to use convhulln or DelaunayTri. If you did not want the output to be convex (concave shape), then you'll have to define a set of constraints to define your shape and/or manually create the object. Alpha shapes would be another approach too.
If it is convex, this will draw the convex hull for your data:
%Import the data:
x = importdata('X_data.mat');
y = importdata('Y_data.mat');
z = importdata('Z_data.mat');
v = importdata('V_data.mat');
idx = logical(v); %which indices?
xidx = x(idx);
yidx = y(idx);
zidx = z(idx);
%Delaunay Triangulation
dt = DelaunayTri(xidx,yidx,zidx);
%Draw
tetramesh(dt,ones(size(dt)));