STL两种格式:文本格式与二进制格式

STL格式

​ 一个StL(Stereolithography,光固化立体造型术的缩写)文件是 3 维表面几何的三角形表示。表面被细分或逻辑分解为一系列小三角形(面)。每个面由一个垂直方向(法线向量)和代表三角形顶点(角)的三个点描述。切片算法使用这些数据来确定制造商要构建的 3 维形状的横截面。

ASCII格式

StL 文件由一系列(方)面数据组成。每个面由单位法线(垂直于三角形且长度为 1.0 的线)和三个顶点(角)唯一标识。法线和每个顶点分别由三个坐标指定,因此每个面总共存储了 12 个数字。如图1所示。
在这里插入图片描述 图1

二进制格式

二进制STL文件用固定的字节数来给出三角面片的几何信息。文件起始的80个字节是文件头,用于存贮零件名;紧接着用 4 个字节的整数来描述模型的三角面片个数,后面逐个给出每一个三角面片的几何信息。每一个三角面片占用固定的50个字节,依次是3个4字节浮点数(角面片的法矢量)3个4字节浮点数(1个顶点的坐标)3个4字节浮点数(2个顶点的坐标)3个4字节浮点数(3个顶点的坐标)个三角面片的最后2个字节用来描述三角面片的属性信息。一个完整二进制STL文件的大小为三角形面片数乘以 50再加上84个字节,总共134个字节。
在这里插入图片描述 图2
或者写成如下形式:
UINT8[80]//Header//文件头
UINT32//Numberoftriangles//三角面片数量
//foreachtriangle(每个三角面片中)
REAL32[3]//Normalvector//法线矢量
REAL32[3]//Vertex1//顶点1坐标
REAL32[3]//Vertex2//顶点2坐标
REAL32[3]//Vertex3//顶点3坐标
UINT16//Attributebytecountend//文件属性统计
在编程中遇到有限元前处理建模时候,可以实现模型中SURFACE的面输出为标准STL格式。
在这里插入图片描述图3

这里是引用“STL文件在医学软件开发中的应用”

FACET法线向量的求取

在这里插入图片描述为了求解一个三角形 Δ p 0 p 1 p 2 \Delta \mathbf{p}_{0} \mathbf{p}_{1} \mathbf{p}_{2} Δp0p1p2 的平面法线,我们必须先计算该三角形边上的两个向量 :
u = p 1 − p 0 \mathbf{u}=\mathbf{p}_{1}-\mathbf{p}_{0} u=p1p0
v = p 2 − p 0 \mathbf{v}=\mathbf{p}_{2}-\mathbf{p}_{0} v=p2p0
然后求得平面法线为:
n = u × v ∥ u × v ∥ \mathbf{n}=\frac{\mathbf{u} \times \mathbf{v}}{\|\mathbf{u} \times \mathbf{v}\|} n=u×vu×v
1.思路 :
1)e0和e1两个向量叉乘得到垂直于该平面的法线
2)对法线向量单位化
2.MATLAB代码
P0=[x0,y0,z0]
P1=[x1,y1,z1]
P2=[x2,y2,z2]
normal = cross(P0-P1, P0-P2);
normal = normal / norm( normal ); % just to make it unit length
figure
quiver3(P0(1), P0(2), P0(3), normal(1), normal(2), normal(3));
axis equal
disp(dot((P0 - P1, normal));
disp(dot((P0 - P2, normal));

PYTHON语言读取STL二进制格式文件

1.代码1
#! /usr/bin/env python 3
with open(“stlbinaryfile.stl”, “rb”) as fichier :
#! /usr/bin/env python3
with open(“stlbinaryfile.stl”, “rb”) as fichier :
head=fichier. read(80)
nbtriangles=fichier.read(4)
print(nbtriangles)
head=fichier.read (80)
nbtriangles=fichier. read (4)
print(nbtriangles)
2.代码2
import stl
with open (‘kiki.stl’, ‘rb’) as f:
import stl
with open(‘kiki.stl’, ‘rb’) as f :
kiki = stl.read_binary_file(f)
print(kiki.facets[0]. normal, kiki.facets[0].vertices)
print(kiki.name)
kiki = stl.read_binary_file(f)
print(kiki.facets[0]. normal, kiki.facets[0].vertices)
print(kiki.name)
3.代码3
import numpy
from stl import mesh
your_mesh = mesh.Mesh.from_file(‘cube.stl’)
print(‘法线’, your_mesh.normals)
print(‘点’, your_mesh.points)
print(‘v0表示三角面第一个点’, your_mesh.v0)
print(‘x表示所有点的x坐标’, your_mesh.x)
4.实例
import vtkplotlib as vpl
from stl.mesh import Mesh
path = “your path here.stl”
mesh = Mesh.from_file(path)
vpl.mesh_plot(mesh)
vpl.show()
#If you want the brick to be blue you can replace the mesh_plot with
vpl.mesh_plot(mesh, color=“blue”)
在这里插入图片描述

这里是引用"python读取stl文件三维坐标,在Python中从STL文件渲染2D图像"

结论

STL格式在建模过程中的应用比较有潜力,研究这种格式的模型文件读取具有重要意义。PYTHON在编程之前需要安装STL库(pip install stl)

  • 7
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weiyiwen1982

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值