MATLAB社区

MATLAB、社区及更多

保罗打印L形薄膜

正如所承诺的,Paul Kassebaum这周回来了,深入讨论了如何从MATLAB中的数学对象到你可以握在手中的固体对象。保罗是真正意义上的创造者。如果在他和他想要创造的东西之间有100个奇怪的和意想不到的障碍,他会有条不紊地处理它们,并仔细地记录他的工作。当我试图调整我的割草机时,我感到非常沮丧。另一方面,保罗可能只需要一把剪刀、一盒活页夹和一台坏掉的复印机就能造出一台能用的割草机。

基于MATLAB的三维打印

保罗·卡斯鲍姆

许多3D打印对象是通过使用CAD软件组合和雕刻球体和圆锥体等原始形状来设计的。这篇文章将展示如何使用MATLAB创建基于方程式或数据的3D可打印对象,这是大多数CAD程序都不打算完成的任务。

这篇文章的结构如下。首先,我们将解释3D打印机读取的文件格式,称为立体光刻文件或STL文件。然后,我们将展示如何从基于矩阵的曲面图开始生成这些文件,这些曲面图是从照片和偏微分方程的解(如钟爱的L-sha)等源创建的最后,我们将能够掌握一个MATLAB绘图。金宝搏官方网站

目录

立体光刻(STL)文件

STL文件以三角形面描述闭合曲面。这些文件由三角形列表组成,每个三角形由其三个顶点的笛卡尔坐标和从闭合曲面向外定向的法向量描述。以下是ASCII STL文件的摘录:

刻面法线nx ny nz外循环顶点v1x v1y v1z顶点v2x v2y v2z顶点v3x v3y v3z端循环端刻面

在实践中,它可能是这样的:

面法线6.6998060E-01-6.6246430E-01 3.3506277E-01外环顶点7.9166667E-01 2.5000000E-01 9.4328269E-01顶点7.5000000E-01 2.5000000E-01 1.0265980E+00顶点7.916666667E-01 2.0833333E-01 8.6090207E-01端环端面

在对3D打印机有用之前,必须将STL文件描述的曲面切片为定义打印机跟踪路径的层。许多3D打印机都有自己的切片程序来执行此转换,因此我们将不讨论此阶段。值得注意的是,根据所用打印机的类型,方向表面粗糙度可能会影响打印质量。

打印曲面图

在MATLAB中创建曲面图最自然的方法是使用高度值矩阵。考虑MathWorks标志的表面plot,基于l形膜。

n=12;%每个维度中的分区数。[X,Y]=meshgrid(linspace(0,1,2*n+1));L=(40/51/0.9)*膜(1,n);surf(X,Y,L);彩色地图粉红色;集(gca,“dataAspectRatio”, [1 1 1]);

将基于矩阵的图转换为stl文件的第一步是将网格中的每个正方形元素分解为两个三角形元素。我们可以使用DELAUNAY函数来创建直线网格的DELAUNAY三角剖分。

面=delaunay(X,Y);面片=三曲面(面,X,Y,L);集合(gca,“dataAspectRatio”, [1 1 1]);

注意,这个网格没有厚度,所以它还不能用来进行实体3D打印。我们可以用这个表面做一个壳层。首先,将三角形的所有顶点沿法向量向下投影,创建一个厚度不低于原曲面的第二个曲面。然后沿着它们的边界连接这两个曲面来定义第三个曲面。

让我们先创建一个3 × 3 × n的张量,称为“facet”,它可以让我们很容易地通过构成曲面的n个三角形中的3个顶点的3个笛卡尔坐标进行索引。

顶点=获取(面片,“顶点”);面=顶点';面=重塑(面(:,面'),3,3,[]);

我们会说,顶点处的法线是共享该顶点的面法线的平均值。因此,我们需要知道每个面的法线。我们可以通过计算面两条边的叉积来计算每个面的法线,注意它们的方向,以确保整个曲面的法线一致支架。

%挤压压缩空维度。边1=挤压(面(:,2,:)-面(:,1,:);边2=挤压(面(:,3,:)-面(:,1,:);法线=边1([2 3 1],:).*边2([3 1 2],:)...-edge2([2 3 1],:).*edge1([3 1 2],:);法线=bsxfun(@times,...法线,1./sqrt(和(法线。*法线,1));

我们可以通过平均每个顶点的相邻面法线来计算每个顶点的法线。

平均法线=零(3,长度(顶点));%预先分配内存。对于k = 1:长度(顶点)%查找顶点共享的所有面[sharedFaces,~]=find(faces==k);%计算顶点共享的所有面的平均法线平均正常值(:,k)=平均值(正常值(:,共享面),2);结束meanNormal=bsxfun(@次,meanNormal,...1./sqrt(总和(平均正常值。*平均正常值,1));

现在我们只需要复制并沿着它们的法线向下移动所有顶点。我们称这些新顶点为underVertices。

外壳厚度=0.05;欠电压=顶点-外壳厚度*平均法线';

让我们看看到目前为止我们都做了些什么。

底面=delaunay(欠高(:,1),欠高(:,2));trisurf(底面,...低估率(:,1),...underVertices (:, 2),...欠温(:,3));设定值(gca,“dataAspectRatio”, [1 1 1],...“xLim”[0, 1],“yLim”,[0 1]);

请注意,还有一些我们不想看到的额外方面。这些由2D Delaunay三角剖分产生,默认情况下,该剖分连接包含在整个顶点集的凸包中的顶点。这在我们的原始曲面中不构成问题,因为边界由一个正方形组成,它是它自己的凸包。新曲面的边界是原始方形边界,通过计算的法向量平移每个顶点而变形。因此,我们的新曲面的边界不是它自己的凸包。MATLAB的DELAUNAYTRI类允许我们在2D中指定边界,这解决了我们的问题。

为了解决这个问题,我们将首先找到原始曲面的边界的索引,它也将索引下曲面的边界。这些边界指标将用于约束Delaunay三角剖分,并将用一个新的曲面连接两个曲面。首先,让我们找到边界指标。

边界指数=...[查找(顶点(:,2)=min(顶点(:,2));%米尼查找(顶点(:,1)=max(顶点(:,1));x %马克斯查找(顶点(:,2)=max(顶点(:,2));%马克斯y查找(顶点(:,1)=min(顶点(:,1))];%最小x

接下来我们将重新排列索引,使其参数化边界。也就是说,随着索引的增加,我们以逆时针方向遍历边界。

边界索引=[...边界指数(1:楼层(结束/4-1));%半开区间[1,end/4)。边界索引(楼层(结束/4+1):楼层(结束/2));%[完四,二)boundaryIndices(地板(结束* 3/4-1):1:地板(2 + 1)/结束);%[完/2,完*3/4)边界指数(结束-1:-1:楼层(结束*3/4+1));%[完*3/4,完)

DELAUNAYTRI构造函数期望每个约束边根据其终端顶点来定义。我们可以通过错开边界顶点来创建一系列边。

constrainedEdges =[边界索引(1:end-1),边界索引(2:end)];underFaces = DelaunayTri (...[低值(:,1),低值(:,2)],限制性差;

DELAUNAYTRI构造器创建了一个由两部分组成的三角剖分:一个区域在受约束的边缘内,另一个区域在边缘外。因为我们只关心里面的区域,所以我们把它挑出来。

内侧=底面.inOutStatus;%1=输入,0=输出。: underFaces = underFaces.Triangulation(内部);

下表面的法线与原始表面的方向相同,这是因为我们构建它的方式。然而,我们将通过连接这两个曲面来制作一个封闭的曲面,在这一点上,下曲面的法线将需要反向指向外。我们来翻转下表面的法线。

底面=翻转LR(底面);

让我们看看到目前为止我们都做了些什么。

trisurf (underFaces...低估率(:,1),...underVertices (:, 2),...欠温(:,3));设定值(gca,“dataAspectRatio”, [1 1 1],...“xLim”[0, 1],“yLim”,[0 1]);

这看起来好多了。现在我们可以继续将这两个曲面与第三个曲面连接起来,我们称之为“墙”。墙将由顶部和底部曲面的边界顶点组成。我们将通过定义墙的每个面,使其在一个曲面上有一个顶点,在另一个曲面上有两个顶点,对这些顶点进行三角化。

墙顶点=[顶点(边界指数,:);欠重力(边界指数,:)];每个表面上的壁面顶点数(nwv)。nwv=长度(壁顶点)/2;%为墙面分配内存。墙面=零(2*(nwv-1),3);%定义面。对于wallFaces(k,:) = [k+1,k,k+nwv];wallFaces (k + nwv-1:) = (k + nwv, k + 1 + nwv, k + 1];结束

让我们看看到目前为止我们都做了些什么。

trisurf(墙面,...墙顶点(:,1),...墙顶点(:,2),...wallVertices (:, 3));集(gca),“dataAspectRatio”, [1 1 1],...“xLim”[0, 1],“yLim”,[0 1]);

现在让我们把三个面组合成一个封闭的面,我们称之为“壳层”。

%移动索引以与原始曲面连接。底面=底面+长度(顶点);墙面=墙面+2*长度(顶点);%连接结果。外壳顶点=[顶点;欠高;墙顶点];外壳面=[面;底面;墙面];

大多数3D打印机要求所有的顶点坐标是非负的,所以我们将壳层向上移动以满足这个约定。

minZ=min(外壳顶点(:,3));外壳顶点=外壳顶点...-repmat([0 minZ],长度(壳顶点),1);

让我们看看最后的结果。

trisurf(壳面,...shellVertices (: 1),...shellVertices (:, 2),...外壳顶点(:,3));集合(gca,“dataAspectRatio”, [1 1 1],...“xLim”[0, 1],“yLim”,[0 1]);

最后一步是将该曲面转换为STL文件stlwrite用于将曲面转换为STL文件。Stlwrite适用于由数据定义的闭合曲面,但不适用于具有边界的曲面,如我们从这里开始的曲面,因为Stlwrite将生成无厚度的网格。

%命名STL文件文件名=“MathWorksLogo.stl”;%创建面。shellFacets=shellVertices';shellFacets=重塑(shellFacets(:,shellFaces'),3,3,[]);%计算它们的法线。edge1=挤压(shellFacets(:,2,:)-shellFacets(:,1,:);edge2=挤压(shellFacets(:,3,:)-shellFacets(:,1,:);shellNormals=edge1([2 3 1],:).*edge2([3 1 2],:)...- edge1([2 3 1],:) .* edge1([3 1 2],:);shellNormals = bsxfun (@times,.../√(sum(shellNormals .* shellNormals, 1)));%将每个面与其法线关联。shellFacets = cat(2,重塑(shell法线,3,1,[]),shellFacets);%打开文件进行写入fid=fopen(文件名,“wb+”);%写入文件内容。%写入标题。fprintf(fid,'实体%s\r\n',文件名);%写数据。fprintf(fid[...'facet normal%.7E%.7E%.7E\r\n'...'外部循环\r\n'...'顶点%.7E%.7E%.7E\r\n'...'顶点%.7E%.7E%.7E\r\n'...'顶点%.7E%.7E%.7E\r\n'...“endloop \ r \ n”...'端面\r\n'), shellFacets);%写页脚。fprintf(fid,'结束实体%s\r\n',文件名);%关闭文件。fclose(fid);

MATLAB实现

有了STL文件,您现在可以打印了!如果您没有自己的3D打印机,您可以查找最近的maker space,查看他们是否有,或者将STL文件发送给3D打印服务提供商,如通道,波诺科,雕塑家,一、具体化ZoomRP或红眼。我是创客空间的一员工匠收容所,它有一个漂亮的3D打印机,还有许多其他工具。这是我完成的L形薄膜的照片。

祝你好运,并有乐趣把你的MATLAB绘图变成有形的对象!

|
  • 打印
  • 发送电子邮件

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。