Visualizing Volume Data
This example shows several methods for visualizing volume data in MATLAB®.
Display Isosurface
An isosurface is a surface where all the points within a volume of space have a constant value. Use the isosurface
function to generate the faces and vertices for the outside of the surface and the isocaps
function to generate the faces and vertices for the end caps of the volume. Use the patch
command to draw the volume and its end caps.
load mri D D = squeeze(D); limits = [NaN NaN NaN NaN NaN 10]
limits = 1×6
NaN NaN NaN NaN NaN 10
[x, y, z, D] = subvolume(D, limits); [fo,vo] = isosurface(x,y,z,D,5); [fe,ve,ce] = isocaps(x,y,z,D,5); figure p1 = patch('Faces', fo, 'Vertices', vo); p1.FaceColor = 'red'
p1 = Patch with properties: FaceColor: [1 0 0] FaceAlpha: 1 EdgeColor: [0 0 0] LineStyle: '-' Faces: [23351x3 double] Vertices: [12406x3 double] Use GET to show all properties
p1.EdgeColor = 'none'
p1 = Patch with properties: FaceColor: [1 0 0] FaceAlpha: 1 EdgeColor: 'none' LineStyle: '-' Faces: [23351x3 double] Vertices: [12406x3 double] Use GET to show all properties
p2 = patch('Faces', fe, 'Vertices', ve, ... 'FaceVertexCData', ce)
p2 = Patch with properties: FaceColor: [0 0 0] FaceAlpha: 1 EdgeColor: [0 0 0] LineStyle: '-' Faces: [27265x3 double] Vertices: [14250x3 double] Use GET to show all properties
p2.FaceColor = 'interp'; p2.EdgeColor = 'none'; view(-40,24) daspect([1 1 0.3]) colormap(gray(100)) box on camlight(40,40) camlight(-20,-10) lighting gouraud
Create Cone Plot
The coneplot
command plots velocity vectors as cones at x, y, z points in a volume. The cones represent the magnitude and direction of the vector field at each point.
cla load wind u v w x y z [m,n,p] = size(u)
m = 35
n = 41
p = 15
[Cx, Cy, Cz] = meshgrid(1:4:m,1:4:n,1:4:p); h = coneplot(u,v,w,Cx,Cy,Cz,y,4); set(h,'EdgeColor', 'none') axis tight equal view(37,32) box on colormap(hsv) light
Plot Streamlines
The streamline
function plots streamlines for a velocity vector at x, y, z points in a volume to illustrate the flow of a 3-D vector field.
cla [m,n,p] = size(u); [Sx, Sy, Sz] = meshgrid(1,1:5:n,1:5:p); streamline(u,v,w,Sx,Sy,Sz) axis tight equal view(37,32) box on
Plot Streamtubes
The streamtube
function plots streamtubes for a velocity vector at x, y, z points in a volume. The width of the tube is proportional to the normalized divergence of the vector field at each point.
cla [~,n,p] = size(u); [Sx, Sy, Sz] = meshgrid(1,1:5:n,1:5:p); h = streamtube(u,v,w,Sx,Sy,Sz); set(h, 'FaceColor', 'cyan') set(h, 'EdgeColor', 'none') axis tight equal view(37,32) box on light
Combine Volume Visualizations
Combine volume visualization in a single plot to get a more comprehensive picture of a velocity field within a volume.
cla spd = sqrt(u.*u + v.*v + w.*w); [fo,vo] = isosurface(x,y,z,spd,40); [fe,ve,ce] = isocaps(x,y,z,spd,40); p1 = patch('Faces', fo, 'Vertices', vo); p1.FaceColor = 'red'
p1 = Patch with properties: FaceColor: [1 0 0] FaceAlpha: 1 EdgeColor: [0 0 0] LineStyle: '-' Faces: [5340x3 double] Vertices: [2727x3 double] Use GET to show all properties
p1.EdgeColor = 'none'
p1 = Patch with properties: FaceColor: [1 0 0] FaceAlpha: 1 EdgeColor: 'none' LineStyle: '-' Faces: [5340x3 double] Vertices: [2727x3 double] Use GET to show all properties
p2 = patch('Faces', fe, 'Vertices', ve, ... 'FaceVertexCData', ce)
p2 = Patch with properties: FaceColor: [0 0 0] FaceAlpha: 1 EdgeColor: [0 0 0] LineStyle: '-' Faces: [464x3 double] Vertices: [301x3 double] Use GET to show all properties
p2.FaceColor = 'interp'
p2 = Patch with properties: FaceColor: 'interp' FaceAlpha: 1 EdgeColor: [0 0 0] LineStyle: '-' Faces: [464x3 double] Vertices: [301x3 double] Use GET to show all properties
p2.EdgeColor = 'none'
p2 = Patch with properties: FaceColor: 'interp' FaceAlpha: 1 EdgeColor: 'none' LineStyle: '-' Faces: [464x3 double] Vertices: [301x3 double] Use GET to show all properties
[fc, vc] = isosurface(x, y, z, spd, 30); [fc, vc] = reducepatch(fc, vc, 0.2); h1 = coneplot(x,y,z,u,v,w,vc(:,1),vc(:,2),vc(:,3),3); h1.FaceColor = 'cyan'; h1.EdgeColor = 'none'; [sx, sy, sz] = meshgrid(80, 20:10:50, 0:5:15); h2 = streamline(x,y,z,u,v,w,sx,sy,sz); set(h2, 'Color', [.4 1 .4]) axis tight equal view(37,32) box on light