一个StL(Stereolithography,光固化立体造型术的缩写)文件是 3 维表面几何的三角形表示。
表面被细分或逻辑分解为一系列小三角形(面)。
每个面由一个垂直方向(法线向量)和代表三角形顶点(角)的三个点描述。
切片算法使用这些数据来确定制造商要构建的 3 维形状的横截面。
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
FACET法线向量的求取这里是引用“STL文件在医学软件开发中的应用”
为了求解一个三角形
Δ
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=p1−p0
v
=
p
2
−
p
0
\mathbf{v}=\mathbf{p}_{2}-\mathbf{p}_{0}
v=p2−p0
然后求得平面法线为:
n
=
u
×
v
∥
u
×
v
∥
\mathbf{n}=\frac{\mathbf{u} \times \mathbf{v}}{\|\mathbf{u} \times \mathbf{v}\|}
n=∥u×v∥u×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));
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)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)