【OCC学习20】使用TKSTL输出stl格式文件_occ格式输出-程序员宅基地

技术标签: 学习  算法  c++  OpenCascade学习笔记  

一、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个面片及其法向。

参考资料:

STL格式简介_Skyline_98的博客-程序员宅基地_stl格式

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/loveoobaby/article/details/126823075

智能推荐

ROS2初级知识(4): 理解【服务】的概念_ros2服务发现-程序员宅基地

文章浏览阅读3.6k次。ROS2通信基本的概念有九个,分别是:Node、topic、service、actions、rqt、launch、record-play、backdata、parameter;本文着重讲述service概念。_ros2服务发现

微信查券机器人搭建_淘客机器人管理后台-程序员宅基地

文章浏览阅读519次。微信查券机器人搭建1、淘客机器人是什么?有什么价值?简单的说,淘客机器人是一个可以帮你赚钱的工具,它通过帮助用户查询商品的优惠券来获得官方联盟(一般指阿里妈妈、京东联盟、多多进宝等)的佣金。如果你想让更多的用户来使用你的机器人,可以返利一部分佣金给购买者,这样用的人越多,你就可以躺着赚钱了。参考2、公众号淘客机器人系统免费版:公众号淘客机器人自助搭建教程http://www.wlkankan.cn/cate50/221.html3、微信订阅号可以接入吗?可以,系统支持订阅号的的淘客机器人系统,_淘客机器人管理后台

深入浅出XDL(二):embedding_深入浅出embedding pdf-程序员宅基地

文章浏览阅读2.3k次。XDL(X-DeepLearning)是阿里巴巴开源的一款深度学习框架。官方介绍,此框架针对广告、推荐、搜索的场景做了很多优化。广告、推荐和搜索的模型,一个重要的特点是存在大量的稀疏特征,为此xdl提供了稀疏API:APIxdl.embedding计算单路稀疏特征的embeddingxdl.merged_embedding同时计算多路稀疏特征的embedding,..._深入浅出embedding pdf

告警处理子系统(SNET)-程序员宅基地

文章浏览阅读719次。《空中交通管制自动化系统最低安全高度告警及短期飞行冲突告警功能》(MH/T4022-2006) SNET将和MSDP部署在同一台服务器上。 SNET子系统读取共享内存中更新的多监视源融合数据(包括MS..._空管 ntz告警实现

c语言 json 请求_cJson的用法(一) -C语言解析/生成 json数据-程序员宅基地

文章浏览阅读120次。cJson这个库开源 跨平台,用来解析和生成json数据很方便。项目地址:https://github.com/DaveGamble/cJSON只需要把cJson.c,cJson.h拷进项目就ok. 下面直接上代码:#include#include#include"cJSON.h"int main(){/*************json的解析***************************..._c语言截取 jsondata

java rsa加密_数据加密、HTTPS、线上充值原理?看这篇就够啦-程序员宅基地

文章浏览阅读80次。专注于Java领域优质技术号,欢迎关注作者:肥朝内容大纲.png目的面试很多时候都会问一些通用的东西,比如多线程,比如数据加密,比如HTTPS,换句话说,无论你从事前端还是后端,数据加密和HTTPS都是必须掌握的数据加密首先,我们为什么要数据加密?因为HTTP所有访问都是明文的,只要能监听到网络所有的请求数据都是透明的,比如任何浏览器的开发者工具就能很清楚的看到表单提交的参数和地址,在Androi...

随便推点

探索大数据架构之美:揭秘《BigDataArchitect》项目-程序员宅基地

文章浏览阅读314次,点赞3次,收藏6次。探索大数据架构之美:揭秘《BigDataArchitect》项目项目地址:https://gitcode.com/bjmashibing/BigDataArchitect项目简介在数字化时代的洪流中,大数据已经成为企业和开发者不可或缺的一部分。《BigDataArchitect》 是一个专注于大数据解决方案和架构设计的开源项目,由知名数据专家BJMashibing 创建并维护。它旨在为大数据..._big data architecture

formSelects为多选下拉动态改变现有选项与选中值,对下拉内容进行更新并赋新值,再刷新。_formselects 为页面动态添加的多选下拉列表框赋值-程序员宅基地

文章浏览阅读110次。【代码】formSelects为多选下拉动态改变现有选项与选中值,对下拉内容进行更新并赋新值,再刷新。_formselects 为页面动态添加的多选下拉列表框赋值

C++中档题:统计元音_统计每个元音字母在字符串中出现的次数。 输入 输入数据首先包括一个整数n,表示测-程序员宅基地

文章浏览阅读986次,点赞2次,收藏2次。统计元音题目描述统计每个元音字母在字符串中出现的次数。输入输入数据首先包括一个整数n,表示测试实例的个数,然后是n行长度不超过100的字符串,只由小写字母组成。输出对于每个测试实例输出5行,格式如下: a:num1 e:num2 i:num3 o:num4 u:num5 多个测试实例之间由一个空行隔开。 请特别注意:最后一块输出后面没有空行:)样例输入 Copy2aeioumy name is ignatius样例输出 Copya:1e:1i:1o:1u:1a:2e:_统计每个元音字母在字符串中出现的次数。 输入 输入数据首先包括一个整数n,表示测

Flowable入门系列文章177 - 组信息的管理_flowable怎么关联自己的组-程序员宅基地

文章浏览阅读2.9k次。flowable入门、flowable现状、flowable开源产品、flwoable入门系列、flowable课程、flowable与activiti区别Flowable是用Java编写的轻量级业务流程引擎。Flowable流程引擎允许您部署BPMN 2.0流程定义(用于定义流程的行业XML标准),创建流程定义的流程实例,运行查询,访问活动或历史流程实例以及相关数据等等。本节将逐步介绍各种概念和API,通过您可以在自己的开发机器上进行的实例进行实现。_flowable怎么关联自己的组

java8 日期时间Api LocalDate、LocalTime、LocalDateTime_java8 季度-程序员宅基地

文章浏览阅读408次。1、LocalDate(1)构造通过字符串构造LocalDate stringParse = LocalDate.parse("2021-09-29");通过年月日构造LocalDate ofLocalDate = LocalDate.of(2021, 9, 29); // 年月日LocalDate ofLocalDate1 = LocalDate.ofYearDay(2021, 255); // 年 天数静态方法构造LocalDate nowLocalDate = Loca_java8 季度

python实训主要成果_完整word版,Python实训周总结-程序员宅基地

文章浏览阅读531次。Python实训周总结Python的学习到现在已经有半个月了,通过讲解与企业化标准的培训,使我加深了对python的认识。因为之前有学Java的基础,所以这次实训入门时也相对容易许多。这是我第一次接触到Python语言,但不是我学习的第一种编程语言。它的逻辑规则和C语言和JAVA存在很大的相似之处,在对数据进行处理时有种似曾相识之感。实习安排是逐渐加深的,所以跟随课程学习相对容易。Python是一..._python实训成果

推荐文章

热门文章

相关标签