前言:

3D 的stl 模型文件分为两种 二进制和Ascii

明码的Ascii 内容清晰可以打开看,但是文件比较大
二进制的文件 看不到内容 但是占用空间小

我是用 qt + opengl 加载 stl 模型

本章写 qt c++ 加载 ascii 格式 和 二进制格式的 stl 文件

ASCII 格式:

 /*          ASCII STL 格式*** solid*      facet normal +0.0000000E+00 +1.0000000E+00 +0.0000000E+00outer loopvertex   +8.0000000E+01 +1.0000000E+02 +6.0000000E+01vertex   +8.0000000E+01 +1.0000000E+02 +0.0000000E+00vertex   +0.0000000E+00 +1.0000000E+02 +0.0000000E+00endloopendfacet......endsolid
*/

文件头 solid 后面跟着的是文件描述
下面的7行 是一个三角形的描述
有多少个三角形就有多少个7行

然后包含1行法向量信息
3行顶点信息

文件结尾 endsolid

读取ASCII 格式代码

void loadAsciiSTL(std::string path,std::vector<FACET> &facetVec);void Widget::loadAsciiSTL(std::string path, std::vector<FACET> &facetVec)
{/*          ASCII STL 格式*** solid*      facet normal +0.0000000E+00 +1.0000000E+00 +0.0000000E+00outer loopvertex   +8.0000000E+01 +1.0000000E+02 +6.0000000E+01vertex   +8.0000000E+01 +1.0000000E+02 +0.0000000E+00vertex   +0.0000000E+00 +1.0000000E+02 +0.0000000E+00endloopendfacet......endsolid* 共计7行****** */FILE* file = fopen(path.c_str(),"r");//把文件指针移动到文件末尾,并计算文件大小fseek(file,0L,SEEK_END);long fileSize = ftell(file);fclose(file);file = fopen(path.c_str(),"r");//计算文件有多少行int fileLines = 0;for(long i = 0;i<fileSize;i++)//一个字符一个字符的读取 当读到换行符说明读到了一行 直到结束if(getc(file) == '\n')fileLines++;//计算三角形的个数int triangleCount = 0;//一段三角形的描述是7行 stl文件格式决定的triangleCount = fileLines / 7;//文件指针移到文件头rewind(file);//跳过文件头 solidwhile(getc(file) != '\n');for(auto i = 0; i< triangleCount;i++){FACET temp;//读法向量fscanf(file,"%*s %*s %f %f %f\n",&temp.normal[0],&temp.normal[1],&temp.normal[2]);//跳过 outer loopfscanf(file,"%*s %*s");//读顶点数据fscanf(file,"%*s %f %f %f\n",&temp.vertex[0][0],&temp.vertex[0][1],&temp.vertex[0][2]);fscanf(file,"%*s %f %f %f\n",&temp.vertex[1][0],&temp.vertex[1][1],&temp.vertex[1][2]);fscanf(file,"%*s %f %f %f\n",&temp.vertex[2][0],&temp.vertex[2][1],&temp.vertex[2][2]);//跳过 endloopfscanf(file,"%*s");//跳过 endfacetfscanf(file,"%*s");facetVec.push_back(temp);}//跳过文件尾部 endsolidwhile(getc(file) != '\n');fclose(file);delete file;}

二进制文件的格式

起始是80个字节的 头
下面是 UINT32 三角形的个数 4字节

三角形信息部分

法向量 float3 4x3 12字节字节
顶点1 float
3 4x3 12字节
顶点2 float3 4x3 12字节
顶点3 float
3 4x3 12字节
uint16 三角形的属性信息没有用 2字节

共计 12*4 +2 = 50字节

读取二进制文件代码

void loadBinarySTL(std::string path,std::vector<FACET> &facetVec);void Widget::loadBinarySTL(std::string path, std::vector<FACET> &facetVec)
{FILE* file = fopen(path.c_str(),"r");/*80字节文件头*/char header[80];fread(header,80,1,file);uint32_t triangleNum;fread(&triangleNum,sizeof(uint32_t),1,file);for(auto i = 0; i< triangleNum;i++){/*12字节法向量*/FACET temp;fread(&temp.normal[0],sizeof(float),1,file);fread(&temp.normal[1],sizeof(float),1,file);fread(&temp.normal[2],sizeof(float),1,file);/*36字节顶点*/for(auto j = 0; j< 3;j++){fread(&temp.vertex[j][0],sizeof(float),1,file);fread(&temp.vertex[j][1],sizeof(float),1,file);fread(&temp.vertex[j][2],sizeof(float),1,file);}/*2字节三角型面片的属性信息*/char c[2];fread(c,2,1,file);facetVec.push_back(temp);}fclose(file);delete file;}

注意我们要先判断是Ascii还是二进制然后在确定调用哪个接口

我这里写了一个函数来判断是什么格式

bool isAsciiFileType(QString path);bool Widget::isAsciiFileType(QString path)
{QFile file(path);char ch[80];if(file.open(QIODevice::ReadOnly)){file.read(ch,80);file.close();//读取80个字节 如果是ascii 就会换行了 如果是二进制的不会有换行for(auto i = 0; i< 80;i++){if(ch[i] == '\n'){qDebug()<<"this is ascii";return true;}}return false;}qDebug()<<"Open File Failed!";return false;
}

因为2进制的 第一行是80字节 但是ascii 第一行没有80字节
所以我们读取80字节 如果包含换行符说明就是ASCII 因为它换行了

使用的话就这样


if(isAsciiFileType(""))loadAsciiSTL()
elseloadBinarySTL()

后续我会写 解析 stl 模型并画出来

用的是 qt + opengl

谢谢您的点赞和关注 支持我

Qt/C++ + opengl 解析stl文件(二进制和Ascii两种格式)相关推荐

  1. Java 解析Excel(xls、xlsx两种格式)

    Java 解析Excel(xls.xlsx两种格式) 一.环境 JDK 1.8 二.JAR 1.commons-collections4-4.1.jar 2.poi-3.9-20121203.jar ...

  2. java excel api xlsx_Java 解析Excel(xls、xlsx两种格式)

    Java 解析Excel(xls.xlsx两种格式) 一.环境 JDK 1.8 二.JAR 1.commons-collections4-4.1.jar 2.poi-3.9-20121203.jar ...

  3. excel 解析 java_java解析Excel(xls、xlsx两种格式)

    https://www.cnblogs.com/hhhshct/p/7255915.html ***************************************************** ...

  4. java excel解析视频教程_java解析Excel(xls、xlsx两种格式)

    一.需要导入的jar 1.commons-collections4-4.1.jar 2.poi-3.17-beta1.jar 3.poi-ooxml-3.17-beta1.jar 4.poi-ooxm ...

  5. QT+OpenGL导入STL文件(二进制/ascll码格式),鼠标交互实现缩放旋转

    碎碎念 由于课设和大创涉及到了模型的旋转,因此专门去学习了模型的导入,也是废了不少心思,现在总结一下两种格式的简单导入,以及对stl模型两种格式的简单介绍.网上有很多大佬都有详细的解答,结尾附上链接: ...

  6. 通过Node.js解析stl文件

    通过Node.js解析stl文件 在此之前请确认已安装Node.js,已配置环境变量.如未安装与配置,请查看Node.js安装及环境配置(Windows) 一.下载Node项目文件 Node项目文件下 ...

  7. stl格式说明和stl文件生成(ascII,binary),vs2005,文件生成后imageware读取成功

    转自:http://blog.csdn.net/scudz/article/details/7758141 1引言 STL(Stereo lithographic)文件格式是美国3D SYSTEMS公 ...

  8. 简述使用ftp进行文件传输时的两种登录方式?它们的区别是什么?常用的ftp文件传输命令是什么?

    简述使用ftp进行文件传输时的两种登录方式?它们的区别是什么?常用的ftp文件传输命令是什么? 参考答案: (1)ftp有两种登录方式:匿名登录和授权登录.使用匿名登录时,用户名为:anonymous ...

  9. common-io-2.0的新功能之文件监控FileAlteration(文件监听的两种实现方法《很全的监听文件例子》)...

    common-io-2.0的新功能之文件监控FileAlteration(文件监听的两种实现方法<很全的监听文件例子>) 转载于:https://www.cnblogs.com/rocky ...

最新文章

  1. 男女共厕,考验男生心理素质的时候到了......
  2. ❤️六W字《计算机基础知识》(一)(建议收藏)❤️
  3. CSS类选择器选择多个类用逗号隔开
  4. 计算机用键盘能干什么,年轻人的第一块智能键盘-半台MBP能干什么?
  5. js题集25--编程训练
  6. wltp和nedc续航差多少_继续退坡,2021年买纯电动汽车补贴多少?_搜狐汽车
  7. 多层交换综合实验(二)
  8. 数据结构(十七)数组和矩阵
  9. 电影下载地址大集合,只要是电影就能找到
  10. 传统方法车道线标注及相关知识
  11. 计算机应用期刊投中难吗,计算机应用研究投稿水平高吗
  12. redis cluster 集群 HA 原理和实操(史上最全、面试必备)
  13. 学习java必读书籍
  14. display:flex的讲解
  15. 如何解释“运维到底是干啥的”?
  16. 大数据Python基础学习——练习(一)
  17. python数据分析可视化项目——游戏销售量
  18. 【转】Linux那些事儿 之 戏说USB(23)设备的生命线(二)
  19. Oracle时间与Unix时间戳的转换
  20. 验证码的本意是安全而不是困难

热门文章

  1. 一种实现物联网设备自动注册及发现的方法与流程
  2. a标签download属性下载excel
  3. 徽章 css_蓝色徽章
  4. jquery 的mmgrid 加载数据时的传参数的方式
  5. 为什么三进制计算机没有商业化?
  6. docker 删除镜像image报错 Error response from daemon: conflict: unable to remove repository reference
  7. 【时序数据库InfluxDB】Windows环境下配置InfluxDB+数据可视化,以及使用 C#进行简单操作的代码实例...
  8. 去除select选中时的边框以及文本居中
  9. GPG 配置2021-05-27
  10. Spring Cloud OAuth2中访问/oauth/token报invalid_client问题的解决