【OCC学习20】使用TKSTL输出stl格式文件
一、STL文件格式
1. 简介
STL文件格式,是3D System公司于1988年制定的一个结构协议,是一种快速原型制造服务的三维图形文件格式。 STL文件由许多三角形面片组成,每个三角形面片由三个顶点的三维坐标和三角形面片的法线向量描述。STL文件仅描述三维物体的表面几何形状,没有颜色、材质贴图等其他属性。
2. 数据存储格式
STL文件的数据存储格式分为二进制格式和ASCII格式两种。
2.1 二进制格式 二进制STL文件用固定的字节数来给出三角面片的几何信息。 文件起始的84个字节用于描述3D模型文件信息。其中前80个字节是文件头,用于存储文件名;紧接着用 4个字节的整数来描述模型的三角面片个数。 后面逐个给出每个三角面片的几何信息。每个三角面片占用固定的50个字节,依次是 3个4字节浮点数(三角面片的法矢量)、3个4字节浮点数(第一个个顶点的坐标)、3个4 字节浮点数(第二个顶点的坐标)、3个4 字节浮点数(第三个顶点的坐标),最后2个字节用来描述三角面片的属性信息。
2.2 ASCII格式 ASCII码格式的STL文件逐行给出三角面片的几何信息,每一行以1个或2个关键字开头。在STL文件中的三角面片的信息单元 facet 是一个带矢量方向的三角面片,STL 三维模型就是由一系列这样的三角面片构成。整个STL文件首行给出了文件路径及文件名。在一个 STL 文件中,每一个 facet 由 7 行数据组成,facet normal是三角面片指向实体外部的法矢量坐标,outer loop说明随后的3行数据分别是三角面片的 3 个顶点坐标,3 顶点沿指向实体外部的法矢量方向逆时针排列。
solid filename stl //自定义文件头 facet normal x y z //三角面片法向量的3个 outer loop vertex x y z //三角面片第一个顶点坐标 vertex x y z //三角面片第二个顶点坐标 vertex x y z //三角面片第三个顶点坐标 endloop endfacet //完成一个三角面片定义 …… endsolid filename stl ∥整个STL文件定义结束
3. STL文件规则 (1)共顶点规则 每一个三角面片必须与其相邻的每一个面片共两个顶点 ,即一个三角面片的顶点不能落在相邻的任何三角面片的边上; (2)取向规则 单个面片法向量符合右手法则且其法向量必须指向实体外面; (3)充满规则 小三角面片必须布满三维模型的所有表面,不得有任何遗漏; (4)取值规则 每个顶点的坐标值必须为非负 ,即 STL 文件的实体应该在坐标系的第一象限。
二、OCC输出stl文件
OCC提供了TKSTL模块,可以实现STL文件的输出读入。TKSTL模块暴露的API是StlAPI文件,里面有Write、Read静态方法,实现STL文件的读写,核心逻辑在StlAPI_Writer、StlAPI_Reader中。
但在写STL文件之前,需使用BRepMesh_IncrementalMesh将Shape进行面片化,不然写的时候是取不到三角面片的,自然也不会写成功STL文件。此类有两个主要的选项来控制三角网格化:线性偏差Linear deflection和角度偏差Angular deflection。这两个参数设置过低会造成面片稀疏,影响显示精度,太小会造成面片过密,浪费计算资源。
Demo见如下,输出一个简单的box:
#include <BRepPrimAPI_MakeBox.hxx> #include <StlAPI.hxx> #include <BRepMesh_IncrementalMesh.hxx> int main() { TopoDS_Shape x = BRepPrimAPI_MakeBox(1, 2, 3); const Standard_Real aLinearDeflection = 0.01; const Standard_Real anAngularDeflection = 0.5; BRepMesh_IncrementalMesh aMesher(x, aLinearDeflection, Standard_False, anAngularDeflection, Standard_True); aMesher.Perform(); StlAPI::Write(x, "box.stl"); return 0; }
打开box.stl会看到12个面片及其法向。
参考资料: