Surface To Solid
Jiro's pick this week is surf2solid by Sven.
Sven is no stranger to Pick of the Week. His inpolyhedron was Picked by Sean recently, and he's also active in other areas of MATLAB Central. In fact, this entry was inspired by a post written by my colleague Paul on "Printing the 3D L-Shaped Membrane".
3D Printing allows you to easily create 3D objects from a digital model, such as models created in MATLAB. People are already using MATLAB for 3D printing, and we've written about it a few times, including the post above by Paul, as well as "Printing Math" and "Anamorphic 3D Printing".
In order to create a 3D object, we can't print a surface which has no thickness. Paul's post above talks about the process of adding that thickness. Sven took some of those techniques and created surf2solid. It's very easy to use with very good instructions (help). You simply provide the data that you would normally pass into surf or patch, and optionally specify the thickness (for a uniform thickness), the elevation (for a block with a flat bottom), and the triangulation method.
Since I don't have one of those fancy 3D printing machines, I'll show an animation of a vibrating (thick) membrane. This is a modification of a shipping demo called vibes.
% Eigenvalues lambda = [9.6397238445, 15.19725192, 2*pi^2, ... 29.5214811, 31.9126360, 41.4745099, 44.948488, ... 5*pi^2, 5*pi^2, 56.709610, 65.376535, 71.057755]; % Eigenfunctions for k = 1:12 L{k} = membrane(k); end % Get coefficients from eigenfunctions for k = 1:12 c(k) = L{k}(25,23)/3; end % Construct solids for animation S = struct('faces',cell(1,500),'vertices',cell(1,500)); x = (-15:15)/15; t = 0; for id = 1:length(S) % Coefficients t = t + 0.02; % increment time s = c.*sin(sqrt(lambda)*t); % Amplitude A = zeros(size(L{1})); for k = 1:12 A = A + s(k)*L{k}; end % Convert SURF data to SOLID data S(id) = surf2solid(x,x,A,'thickness',-0.1); end % Create patch and modify view pHandle = patch(S(1),'EdgeColor','r'); view(3) axis([-1 1 -1 1 -.5 1]) axis off % Animate for id = 1:length(S) set(pHandle,'Faces',S(id).faces,'Vertices',S(id).vertices); drawnow end
Comments
Let us know what you think here or leave a comment for Sven.
- 类别:
- Picks
评论
要发表评论,请点击 此处 登录到您的 MathWorks 帐户或创建一个新帐户。