图片缩略图

二进制STL文件读取器

version 1.0.0.0 (2.44 KB) by 弗朗西斯Esmonde-White
这个二进制STL文件读取器比现有的读取器快得多。
4.7
22日评级

36下载

更新2011年1月04

查看许可协议

该函数用于加载二进制STL文件。

已经有两辆了。mathworks文件交换站点上可用的M个文件。Harlev的版本读取数据并返回带有X/Y/Z格式顶点数据的矩阵。Johnson的程序读取数据并返回Face/Vertex/Normal矩阵。

这个提交也导出了Face/Vertex/Normal矩阵,但是比Johnson的版本快30倍,比Harlev的版本快13倍(它不导出Face Normal数据)。

此提交也将正确读取颜色值(如果存在)和STL文件标题。

更多信息(包括时间信息)参见:http://www.esmonde-white.com/home/diversions/matlab-program-for-loading-stl-files

引用作为

弗朗西斯Esmonde-White(2021)。二进制STL文件读取器(//www.tatmou.com/matlabcentral/fileexchange/29906-binary-stl-file-reader), MATLAB中央文件交换。检索

意见及评分(47

w Z

Aitor Arana

伟大的功能!

Bojan

Rbk

艾玛Bangun

您好,感谢您提供这个伟大的功能!
我能够运行这个函数并读取STL二进制文件。函数返回关于顶点的信息等等。这个函数可以生成STL ASCII格式的文件吗?或者正如Vincent在这里解释的那样,这个函数不能将二进制数据转换成ASCII码?请回复。谢谢!

文森特Hielscher

我可以自己解决这个问题。
我将文件保存为STL ASCII格式。不能被你的函数转换的。
当我把它们保存为STL二进制格式时,一切工作正常。

文森特Hielscher

嘿@Franzis(或者其他任何可以帮忙的人),
我试着用你的函数。我以前用过埃里克·约翰逊的方法,它很有效。现在你和他都不能处理我的stl文件。我用stlwrite (https://de.mathworks.com/matlabcentral/fileexchange/20922-stlwrite-filename--varargin-),有超过60万点。在Autodesk Meshmixer我重塑数据和减少顶点。现在我有38679个顶点和74618个三角形。然后我导出了stl文件。但是当我尝试使用你的程序这个错误弹出:

错误使用repmat
请求的48x808792373 (289.2GB)数组超过了最大数组大小首选项。创建大于此限制的数组可能需要很长时间
导致MATLAB变得无响应。有关更多信息,请参阅数组大小限制或首选项面板。

stlread错误(第72行)
印第安纳州=重塑(repmat (50 * (0: (numFaces-1)),[48岁,1]),[1,48 * numFaces]) + repmat (trilist [1, numFaces]);

很高兴帮忙
文斯

安娜·纳格尔

对我有用吗?我特别发现演示文件帮助我弄清楚如何查看和点亮我的stl导入后。

马特奥Verardo

非常感谢你们的盛情款待。我用一个巨大的文件(160万个三角形)测试了它,它速度快,运行良好。
我不需要颜色,所以我没有测试。
我写了一个函数读取STL ascii,如果它是感兴趣的人。

李他

亲爱的作者,我想知道如何使用它,我是一个matlab初学者

贾斯汀L

伟大的脚本就是不能让它生成颜色

道格拉斯Isenberg

内森问

它很快,不是开玩笑的。为我在6秒内读取一个400m的8M三角形文件。

鲍比·布朗

Ron Perrone -输入文件名作为字符串。

如。stlread(“mySTLfile.stl”)

罗恩Perrone

不幸的是,我无法运行这个脚本。我有一个二进制stl文件在我的MATLAB文件夹,但当我把文件的名字在函数它只是说未定义的函数或变量…有什么建议吗?

罗恩Perrone

不幸的是我不喜欢。说它需要更多的输入参数,而不仅仅是stl文件名。游手好闲的人。有什么建议吗?

wayclif乔丹

非常感谢分享!向格鲁吉亚问好:-)

查尔斯Eloquin勒克莱尔

内存昂贵,脚本很快崩溃,因为计算机内存不足。这个脚本从我的80Mb STL文件中提取了大约20亿个face (numFaces)。根据我的计算,我需要大约100gb的内存来导入我的文件......

有人有解决这个问题的办法吗?

嗨。感谢收看本期节目。你能发给我流程图吗?
致以最亲切的问候。

Emmanuel Farhi

一个非常好的工作读取STL二进制文件。谢谢。

Andreas J。

亲爱的Rooha,

这个stl文件读取器加载二进制stl文件。我不熟悉Catia,也不熟悉Catia导出的STL文件类型。如果您没有二进制STL文件,您应该尝试文件交换中可用的ASCII STL文件读取器之一。

你读过这个项目的帮助吗?当你运行这个程序时,它会从STL模型输出面、顶点和法线。

我还觉得很奇怪,你给这个程序打了三颗星,但好像根本没用过。

Rooha西迪基

你好,
我有个问题。我用stl格式保存了一个catia图
现在我想在MATlab中读取它的顶点和法线
你能帮我做这个功能吗?这和我最后一年的项目有关。

Bouta

你好,

我有一个问题,导入STL图形文件到Simulink图。金宝app我尝试在UGS NX和SolidWorks中制作模型,但当我导入它时,尺寸是1000倍。

我想这是因为Simulink的默认长度单位金宝app是'm',但每个CAD软件都用'mm'来写。当我查找二进制文件,没有关于单位在STL文件的真实信息,所以我的问题是:我如何改变Matlab中的默认单位或我如何转换STL文件本身,以匹配我的要求。

弗朗西斯Esmonde-White

你好,

你完全可以改变贴面(或贴面边缘)的颜色,甚至指定透明度。有关更多信息,我建议您阅读补丁命令的mathworks/matlab文档。例如,在命令行中输入'doc patch',然后查看'Coloring Patches'下面的部分。

你们HUICHAO

嗨,弗朗西斯,

谢谢你的文件,对项目帮助很大。我只是不明白,当我运行文件打开我的stl文件,情节是正确的,但颜色是完全黑色。那是网眼吗?我可以用patch('Faces',f,'Vertices',v,'r')改变颜色吗?

弗朗西斯Esmonde-White

你好大卫,

我已经向Mathworks文件交换器提交了一个新文件,该文件交换器使用基于三角形区域的平滑方法计算补丁法线。需要一段时间才能得到mathworks的批准,所以我会在此期间发邮件给你。我认为这是一个有趣的练习,所以我创建了我自己的函数'STLVertexNormals'。你所链接的编译后的“Patch Normals”提交几乎肯定更快(我还没有尝试过它),但我提交的代码(希望)相当可读。

欢呼,
弗朗西斯

大卫·罗伯逊

嗨,弗朗西斯,

首先,非常感谢你花时间发布这个功能,它非常容易使用,并确切地做它所说的。我只有一个问题,这个函数返回一个法线矩阵根据它的大小,我假设它包含面法线。但是Matlab在做补丁光照计算时使用了Vertex法线。显然,它可以计算这些正常的本身执行这些计算,但这似乎对我不工作。所以我想知道你是否知道如何把这些面法线转换成顶点法线?所以我可以强迫Matlab使用它们来照明。

我已经研究过调整这个功能
//www.tatmou.com/matlabcentral/fileexchange/24330-patch-normals
因为他似乎先计算面法线然后用它们来计算顶点法线,就像我想做的,但迄今为止没有任何成功。

如果你有任何想法,可以帮助我,这将是非常感激的。

不管怎样,再次感谢分享这个功能。

亲切的问候,
大卫

大卫·罗伯逊

弗朗西斯Esmonde-White

你好,安东尼奥,

问题是您有一个acsii STL,而不是二进制STL。二进制文件读取器假设前几个字节描述了面的数量。在ascii STL文件中,前几个字节将是文本,并定义一些任意大的数字。如果你可以导出到二进制文件,它们会更小,加载更快。

如果你用写字板打开文件,你可以看到ascii文本。试试这个m-file:http://people.sc.fsu.edu/~jburkardt/m_src/stla_io/stla_io.html

我在我的个人网站上有更多关于STL文件的信息:http://www.esmonde-white.com/home/diversions/matlab-program-for-loading-stl-files

如果我还能帮上什么忙,请告诉我!

欢呼,
弗朗西斯

安东尼奥·德·Nittis

我有55mb stl文件的1.7022e+009面和相同的问题的1mb stl文件和代码发现1.9193e+009面(var numFaces)。是正常的吗?

弗朗西斯Esmonde-White

亲爱的安东尼奥,

一个55mb的二进制STL文件相当大。模型的每个三角形面需要50个字节。因为你的大文件是55mb,我估计面的数量为115万个基于(55*1024*1024)/50的三角形。

程序的第72行将需要115万三角形矩阵的3个拷贝(每个字节低效地存储为8字节——matlab双精度格式)。这将占用至少1.32 GB内存。此外,您还需要另一个与实际数据大小相同的矩阵,总共需要1760 MB(我可能低估了),这肯定超出了您的系统内存限制(您试图运行此数据的计算机的规格是什么?)。你能不能做一个分辨率稍微低一点的模型,或者把它拆成几块?

如果需要的话,我还可以使用一些技巧来减少程序的内存占用,比如降低中间矩阵的数值精度,并且只有在创建了“ind”矩阵之后才从文件中读取数据。其中一些更改会减慢程序的运行速度,另一些则会限制可处理的三角形面的总数,因此进行这些更改并不理想。

你试过装载较小的型号吗?加载一个1mb的stl文件应该没有问题,即使是在一个老旧的PC上。

谢谢!

安东尼奥·德·Nittis

亲爱的弗朗西斯,
谢谢你提交这个m-file。我遇到了一个问题:我有两个stl文件(55mb和1mb)和matlab说
"超过程序允许的最大可变大小。

错误在==> stlread在72
印第安纳州=
重塑(repmat (50 * (0: (numFaces-1)),[48岁,1]),[1,48 * numFaces]) + repmat (trilist [1, numFaces]);“
这个问题有可能解决吗?

感谢您的帮助。

弗朗西斯Esmonde-White

你好凯伊斯,

1.Lee White在这个页面上描述了使用补丁对象,他的评论就在你的第一个评论之前。想了解更多信息,请看:
//www.tatmou.com/help/techdoc/ref/hgtransform.html

2.如果您有一个组件,那么您还应该有构成组件的每个单独部件的文件。您可以从每个部分分别创建STL文件。

3.您可以为每个单独的部件加载STL文件,然后使用HGtransform来虚拟地组装部件。这将比在solidworks中直接使用装配工具更加困难。如果您从solidworks组件创建STL,没有直接的方法将三角形与原始部件重新关联。

凯伊斯AlKhazraji

亲爱的弗朗西斯,
非常感谢你的回复。关于你提到的以下几点,我还是不明白:
1.Lee White在哪里描述养育“补丁对象到hgtransform对象来操作从stls构建的补丁”,因为我不知道他是什么意思(hgtransform)。
2.如果我的组装部分包含几个部分,我不能为每个部分创建单独的stl文件,因为整个部分是一个部分,正如你知道的。
3.你有没有想过我是怎么把三角形和原来的部分联系起来的?
感谢您的帮助。

弗朗西斯Esmonde-White

你好凯伊斯,

不幸的是,如果模型是一个单一的STL文件,它可能已经变成了一个单一的patch对象(一个由三角形描述的封闭表面)。虽然您可能会确定一种方法,将特定的三角形与它们来自的原始部分联系起来,但您不会有整个部分的描述。没有办法,你将能够恢复准确的Solidworks模型从STL文件。如果你想从Solidworks加载STL模型到Matlab中,你应该将每个部分导出为一个STL文件,然后将它们全部加载到Matlab中作为不同的STL模型,并按照Lee White上面的描述转换它们。此外,STL模型将是部分的不完美的表示(曲面将被一个细分曲面近似)。

我希望这对你有所帮助。

凯伊斯AlKhazraji

你好弗朗西斯
我感兴趣的是将stl文件细分为补丁,其中每个补丁代表构建一个对象的子部分。我在做装配技术,装配部分包含几个部分,我在SolidWorks中绘制它们。据我所知,那个STL文件是无序文件,所以我在STL文件中丢失了跟踪哪个数据与哪个子部分相关。当我复制一些stl文件输出并使用SolidWork重画它们时,我将得到一些不是我原来的部分。我非常感谢您在这个问题上的帮助,以及我如何得到订购stl文件,以便它将反映我在SolidWork上的准确数据表示。

李白

伟大的工作。Liana,你可以通过hgtransform对象来操作从stls构建的补丁。每个hgtransform对象都有一个由变换矩阵定义的位置和方向。你可以像机器人手臂那样创造一系列的机制。hgtransform对象在一个链中是彼此的父对象。移动父对象会同时移动所有的子对象。

iokinberistain贝斯坦

弗朗西斯Esmonde-White

嗨,藤本植物,

STLread程序根本没有移动模型,并且在这段代码中也没有旋转3D矩阵的功能。3D旋转可以通过将所有顶点乘以适当的旋转矩阵来实现。看到http://en.wikipedia.org/wiki/Rotation_matrix#Rotations_in_three_dimensions有关旋转矩阵的更多信息。

如果我有时间,我会编写并发布一个3D模型旋转程序。

阿努普库马尔

嗨弗朗西斯!我将文件下载到Matlab目录,并将stl文件重命名为MyModel.stl。

在代码的第一行,我将stlread(filename,verbose)更改为stlread('MyModel.stl')。我试过各种方法,但总是得到这个错误,

/////////
???错误:文件:stlread。m行:1列:43
意想不到的MATLAB表达式。

谢谢!

露露

嗨弗朗西斯!

谢谢你提供的这个功能,非常有帮助。请问我如何使用你的函数的输出,根据XYZ零点来改变加载模型的方向?让我们说,我想要一个多面体对象(简单的房子模型)从STL文件加载将放置在XY平面而不是ZX平面。谢谢!

弗朗西斯Esmonde-White

你好阿,

我不太确定你为什么对把物体分成多个部分感兴趣。是不是想要一个复合对象,让不同的部分可以相对移动?如果是这样,就将每个子部分视为一个独立的对象。我很乐意帮助,请发送我的电子邮件与更多的信息,你试图加载的部分(弗朗西斯*removethis*@esmonde-white.com)。

另外,请包含更多关于你是如何使用文件加载器的信息。从错误消息来看,可能是STL文件不太正确(可能是ascii STL文件,或者它不符合标准),或者您正在错误地使用程序。

弗朗西斯

你好。我对划分stl很感兴趣。文件分成不同的段(由顶点定义,这样我就可以一次加载对象的各个部分。我希望能够分别保存对象的每个部分,并有能力将它们加载在一起作为一个组件,以形成整个对象。这个函数有用吗?我用Unigraphics制作了一个简单的部分来尝试,当我试图用patch(…)来显示模型时,我得到了一条错误消息

???使用==>补丁时出错
面值必须是>= 1.0
顶点数组必须至少有2列,最多3列(或为空)
FaceVertexCData必须是一个mx向量(索引颜色)或mx矩阵(RGB颜色)

你知道我有什么问题吗?该文件被保存为二进制stl。

谢谢你!

弗朗西斯Esmonde-White

嗨方形住宅区,

您不需要更改stlread中的任何代码。m文件。

有关使用'stlread'的更多信息,请下载stlread。M文件,并复制到您的matlab工作目录(在您的matlab窗口顶部的地址栏显示的目录)。接下来,输入'help stlread',它将显示程序帮助信息。

要使用该程序,请使用以下命令来加载模型。

[v, f, n, c, stltitle] = stlread('MyModel.stl');

这将把模型读入v和f矩阵中。要显示模型,请尝试以下操作:

补丁('脸' f“顶点”,v, FaceVertexCData, c);

一个重要的考虑因素是,STL文件是二进制的还是ascii的STL文件。如果您尝试用文本编辑器(如写字板)打开STL模型,如果您可以看到一个清晰的数字列表,那么您就有了一个ascii STL文件。以上程序只适用于二进制STL文件。如果您需要一个ascii STL阅读器,请尝试查看//www.tatmou.com/matlabcentral/fileexchange/24233-stlimport-import-function-for-stl-files

quadro1327

谢谢你提交这个m-file。你能指导我如何阅读我的STL文件吗?我是matlab的初学者。我需要在您的程序中更改一些行吗?再次感谢你。

MATLAB版本兼容性
创建R2009a
与任何版本兼容
平台的兼容性
窗户 macOS Linux

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!