和往常一样,上午复习,下午研究MATLAB。过年也是无聊,不过昨天下午在帮我妈染头发。真希望早点出分,然后早点复试,然后找个活干干。

昨天下午我在网上找关于MATLAB读取stl的文件,找来找去发现MathWorks官网上有相关的工具箱,工具箱网址:-iges-toolbox

下面先简单说说stl的文件。我从ug的导出中看到他有两种,一种是Binary(二进制),一种是Text(文本)。我选择的导出类型时Text,导出后是一个文本文件(*.txt)。STL只能用来表示封闭的面或者体,它把这个物体表面分成了紧密相连的一小块一小块的三角形。在导出的文本文件中记录了每一个小三角形的法向量(指向实体外部)和这个三角形的三个顶点坐标。stl只能描述三维物体的几何信息,不支持颜色材质等信息。

我用ug画了一个简单的实体,并导出stl,

导出后的部分(文本)文件:

下面采用工具箱中的stl2matlab获得三角形的各个顶点

VertexData= stl2matlab('Solid.txt');

返回的VertexData是一个1x3的cell,每一个cell中是3xn的array,第一个cell中放的是X的坐标,第二个cell中放的是Y的坐标,第三个cell中放的是Z的坐标。X = VertexData{1},获取各个小三角形片顶点的X坐标,上面说了X是一个3xn的array,X的第i列放的是第i个三角形的三个顶点的X坐标。

采用工具箱中的plotSTL函数可以显示出该实体

hPatch = plotSTL(VertexData,[0 1 0]);

返回的hPatch是一个patch对象。它实际上就是patch了每个三角形。

我看了一下这个工具箱里好像就这两个函数用来读显stl,其他大部分函数是用来读iges文件的(还有部分我也不清除具体有啥用),我试了一下其中的iges2matlab,但是运行不了。我检查了一下,发现他工具箱关于iges文件的函数是与C语言混编的,而他在MATLAB中直接调用C函数,MATLAB报错说未定义该函数(但是这个C函数是存在的),我上网查了一下说要先mex,而我电脑缺东西mex用不了,所以关于iges的我就没去研究了。

下面继续说stl

上面plotSTL画出的如下

怎么是二维的?我ug里画的明明是三维的呀...,

你在命令行中输入view(3)

再把这个patch对象设置地透明点

还是看不清...怎么办?我们写个循环把各个三角形的顶点显示出来,再把三角形的边显示出来。(其实显示出点不用循环,但是显示出线要用循环,不然乱)

clcclearclose allVertexData= stl2matlab('Solid.txt');hPatch = plotSTL(VertexData,[0 1 0]);hPatch.FaceAlpha = 0.3;view(3)set(gca,'NextPlot','add')X = VertexData{1};Y = VertexData{2};Z = VertexData{3};for i = 1 : size(X,2)    line( X(:,i) , Y(:,i) , Z(:,i) , 'Color' , 'b' , 'LineWidth' , 1.5)    scatter3( X(:,i) , Y(:,i) , Z(:,i) , 'SizeData' , 100 , 'MarkerFaceColor' , 'r')end

这个不复杂,没写注释应该都能看懂。

结果如下:

(这个自带的旋转真不好用...)

咦?怎么小片片是矩形.....好吧,来个复杂点的模型看看

我还是把点改小一点,线改细一点把,再把坐标轴的限制去掉...

我看了下,这小飞机导出的stl中有4942个顶点,我想录点GIF,于是加了drawnow结果每秒只刷2个点左右....尼玛,等死我了,与是发在宿舍群里

最后结果

(6不6)

clcclearclose allVertexData= stl2matlab('palne_stl.txt');hPatch = plotSTL(VertexData,[0 1 0]);hPatch.FaceAlpha = 0.3;view(3)set(gca,'NextPlot','add')set(gca,'Clipping','off')axis offset(gca,'Color',get(gcf,'Color'))X = VertexData{1};Y = VertexData{2};Z = VertexData{3};for i = 1 : size(X,2)    line( X(:,i) , Y(:,i) , Z(:,i) , 'Color' , 'b' , 'LineWidth' , 0.5)    scatter3( X(:,i) , Y(:,i) , Z(:,i) , 'SizeData' , 20 , 'MarkerFaceColor' , 'r')    drawnow    i % 没啥用,我用来看进度的end

其实,在结果中最重要的部分就是物体的顶点了....有了这些点你就可以去抓取三维CAD数模的剖面信息,做一些局部布点加密处理,并得到其弦长和弯度信息(这个蓝字是我从别处看到的应用,这里直接粘过来的)。反正我感觉我以后应该会用的上。

到这,这个工具箱中能用上的两个函数就讲完了,总结一下:stl2matlab用于读入stl中的顶点数据,plotSTL用于显示模型。

反正我找到这个工具箱是找了挺久的,只是今天下午偶然发现了。

其实我感觉这个用正则表达式也可以搞出来,可惜我不会正则,它那个语法是真的头疼。以后学会了的话,一定在公众号中分享经验。