3D body plot ( visualization )
19 ビュー (過去 30 日間)
古いコメントを表示
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:
5 件のコメント
Sean de Wolski
2012 年 1 月 26 日
It must be how your data is stored in x,y,z. Does it change if you change the isovalue to 0? Should the output be convex? The output from ISOSURFACE looks like it could/should be correct (i.e. not wrong). Can you post your sample data in a matfile to somewhere?
採用された回答
Sean de Wolski
2012 年 1 月 26 日
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)));
3 件のコメント
Sean de Wolski
2012 年 1 月 26 日
You could perhaps use SMOOTH3. However, the pictjure you're expecting is _not_ convex. Thus this approach won't work. You need to define your own constraints or use an alpha shape. I'd begin looking here:
http://www.mathworks.com/matlabcentral/fileexchange/?term=alpha+shape
その他の回答 (0 件)
参考
カテゴリ
Help Center および File Exchange で Surface and Mesh Plots についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!