2016-05-12 20 views
0

Eine 3D-Dreiecksnetzform wird durch Scheitelpunkte und Dreiecksflächen dargestellt. Zum Beispiel shape in Matlab, die shape.X, shape.Y, shape.Z(the vertices) and shape.TRIV(the triangle faces) hat, kann als eine 3D-Dreieck-Mesh-Form gesehen werden.Wie zeichnet man eine 3D-Dreiecksnetzform mit einer bestimmten Farbtabelle in MATLAB?

Meine Frage ist wie man eine solche Form in MATLAB mit einer bestimmten Colormap visualisieren.

(zum Beispiel die colormap kann als Abstandsvektor von length(shape.X) deren Elemente euklidischen Abstände aller Eckpunkte zu einem einzelnen Scheitelpunkt M, in dieser Situation definiert werden, die kühleren Farben im Zusammenhang mit der kleinere Abstände und die wärmeren Farben zu den größeren Entfernungen im Zusammenhang.)

Antwort

-1

Basierend auf @ Suever Antwort, füge ich einige zusätzliche Code die Form Plot glattere und fügen Sie eine Kamera Licht zu machen. Wenn es sich bei der Form um eine Punktwolke ohne Flächen handelt, wählen Sie besser scatter3 anstelle von plot3.

vertices = cat(2, shape.X(:), shape.Y(:), shape.Z(:)); 

%// Compute distance of each vertex from the origin 
distances = sqrt(sum(bsxfun(@minus, vertices, [0 0 0]).^2, 2)); 

%// Create the patch object 
h = patch('Vertices', vertices, 'Faces', shape.TRIV); 

%// Set the vertex colors and use interpolation to shade the faces 
set(h, 'FaceColor', 'interp', 'FaceVertexCData', distances,'EdgeColor', 'none'); 
%or use shading interp instead of setting 'EdgeColor'=='none' to make the shape smooth; 

%// Scale the color limits to your data 
set(gca, 'clim', [min(distances(:)), max(distances(:))]) 

% add a colorbar 
colorbar 

% change the colormap 
colormap(jet(64)) 

%use the same unit length along each axis and fit the axes box tightly around the data. 
axis image 

% turn off the coordinate 
axis off 

% set the camlight strength, trial and error 
set(h, 'AmbientStrength',0.25, 'SpecularStrength',0.0,'DiffuseStrength',0.5); 
lighting phong; 
camlight left; %left,right,head 
set(gcf,'Renderer','opengl'); %‘opengl’,'zbuffer' 

Wenn es eine Punktwolke:

h2=scatter3(X,Y,Z,'.'); 
view([0,90]); 
h2.CData=distances; 
axis image; 
set(gca, 'clim', [min(distances(:)), max(distances(:))]); 
colormap(jet(64)); 
5

können Sie ein patch Objekt verwenden, um Ihre 3D-Form zu zeigen und dann die FaceVertexCData und FaceColor Eigenschaften des resultierenden Patch verwenden se t ein Wert, der automatisch den Achsenfarbgrenzen zugeordnet werden kann.

vertices = cat(2, shape.X(:), shape.Y(:), shape.Z(:)); 

%// Create the patch object 
h = patch('Vertices', vertices, ... 
      'Faces', shape.TRIV); 

%// Compute distance of each vertex from the origin 
distances = sqrt(sum(bsxfun(@minus, vertices, [0 0 0]).^2, 2)); 

%// Set the vertex colors and use interpolation to shade the faces 
set(h, 'FaceColor', 'interp', ... 
     'FaceVertexCData', distances); 

%// Scale the color limits to your data 
set(gca, 'clim', [min(distances(:)), max(distances(:))]) 
+0

Was ist, wenn die Form eine Punktwolke ohne Gesichter (shape.TRIV) ist? –

+0

@GuWang Wenn Sie eine Punktwolke haben, dann müssen Sie 'plot3' oder' scatter3' verwenden. – Suever

+0

Wie kann ich die Form, die durch den Patch geglättet wird, verbessern? Und wie fügt man der Form eine Lichtquelle hinzu? –