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

STL两种格式:文本格式与二进制格式,第1张

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)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/662204.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-18
下一篇 2022-04-18

发表评论

登录后才能评论

评论列表(0条)

保存