读取STL文件模型

STL是CAD软件中出来的一种3D模型文件格式,wiki已经解释的很清楚了。

STL文件两种格式,ASCII STL和Binary STL。

ASCII STL,每一个facet由7行数据组成,outer loop后面三个顶点的顺序沿法线矢量逆时针排序,格式如下:

solid name // 文件名及文件路径

facet normal ni nj nk          // 三角形法向量的三个分量
    outer loop
        vertex v1x v1y v1z     // 第一个顶点坐标
        vertex v2x v2y v2z     // 第二个顶点坐标
        vertex v3x v3y v3z     // 第三个顶点坐标
    endloop
endfacet                       // 完成一个三角形的定义

endsolid name                  // 整个文件结束

Binary STL,起始有80个字节文件头用于存储文件名,紧接4个字节表示三角形数量,而每个三角面片占用固定的50个字节,3个4字节浮点数(法线矢量),3个4字节浮点数(第一个顶点坐标),3个4字节浮点数(第二个顶点坐标),3个4字节浮点数(第三个顶点坐标),接着2个字节描述三角形基本属性,那么一个完整的二进制STL文件的字节大小就是三角形面数乘50再加上84字节,格式如下:

UINT8[80] – Header             // 文件头
UINT32 – Number of triangles   // 三角形数量

foreach triangle
REAL32[3] – Normal vector      // 法线矢量
REAL32[3] – Vertex 1           // 第一个顶点坐标
REAL32[3] – Vertex 2           // 第二个顶点坐标
REAL32[3] – Vertex 3           // 第三个顶点坐标
UINT16 – Attribute byte count  // 文件属性
end

下面为代码,

#include <fstream>
#include <string>
#include <vector>
bool ReadSTLFile(const char *cfilename)
{
    if (cfilename == NULL)
        return false;

    std::ifstream in(cfilename, std::ifstream::in);

    if (!in)
        return false;

    std::string headStr;
    getline(in, headStr, ‘ ‘);
    in.close();

    if (headStr.empty())
        return false;

    if (headStr[0] == ‘s‘)
    {
        ReadASCII(cfilename);
    }
    else
    {
        ReadBinary(cfilename);
    }
    return true;
}

bool ReadASCII(const char *cfilename)
{
    std::vector<float> coorX;
    std::vector<float> coorY;
    std::vector<float> coorZ;

    int i = 0, j = 0, cnt = 0, pCnt = 4;
    char a[100];
    char str[100];
    double x = 0, y = 0, z = 0;

    std::ifstream in(cfilename, std::ifstream::in);

    if (!in)
        return false;
    do
    {
        i = 0;
        cnt = 0;
        in.getline(a, 100, ‘\n‘);
        while (a[i] != ‘\0‘)
        {
            if (!islower((int)a[i]) && !isupper((int)a[i]) && a[i] != ‘ ‘)
                break;
            cnt++;
            i++;
        }

        while (a[cnt] != ‘\0‘)
        {
            str[j] = a[cnt];
            cnt++;
            j++;
        }
        str[j] = ‘\0‘;
        j = 0;

        if (sscanf(str, "%lf%lf%lf", &x, &y, &z) == 3)
        {
            coorX.push_back(x);
            coorY.push_back(y);
            coorZ.push_back(z);
        }
        pCnt++;
    } while (!in.eof());

    return true;
}

bool ReadBinary(const char *cfilename)
{
    std::vector<float> coorX;
    std::vector<float> coorY;
    std::vector<float> coorZ;

    char str[80];
    std::ifstream in(cfilename, std::ifstream::in | std::ifstream::binary);

    if (!in)
        return false;

    in.read(str, 80);

    //number of triangles
    int triangles;
    in.read((char*)&triangles, sizeof(int));

    if (triangles == 0)
        return false;

    for (int i = 0; i < triangles; i++)
    {
        float coorXYZ[12];
        in.read((char*)coorXYZ, 12 * sizeof(float));

        for (int j = 1; j < 4; j++)
        {
            coorX.push_back(coorXYZ[j * 3]);
            coorY.push_back(coorXYZ[j * 3 + 1]);
            coorZ.push_back(coorXYZ[j * 3 + 2]);
        }

        in.read((char*)coorXYZ, 2);
    }

    in.close();

    return true;
}

ReadSTLFile

时间: 2024-10-14 06:47:34

读取STL文件模型的相关文章

opengl 读取stl文件

没有解决: mark 几个网站: 1 http://blog.csdn.net/icebergkevin/article/details/18974235 能实现二维的 2 http://www.cnblogs.com/xds1224/p/3565280.html 编译一直出现问题 现在还没搞定??? 3 http://blog.csdn.net/cracent/article/details/51049246 最后的代码有问题. 我下载的 MFC_Graphics 可以运行 但是没有渲染效果

C#中常用的几种读取XML文件的方法

XML文件是一种常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,还有许多重要的场所都有它的身影.Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具.XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用.微软也提供了一系列类库来倒帮助我们在应用程序中存储XML文件. “在程序中访问

[计算机图形学] OpenGL读取obj文件并显示其3D效果

? 读取三维网格模型(Wavefront OBJ文件) 无法向立方体:cube.obj 有法向兔子模型:bunny.obj 有法向有纹理八字模型:Eight.obj OBJ文件的格式可参考:http://www.cnblogs.com/youthlion/archive/2013/01/21/2870451.html ? 利用OpenGL显示该模型的绘制效果(全部) 顶点显示 线条显示 面片显示 ? 核心代码说说 1.下面的点.纹理.法向量.面用于构成一个PIC的类,PIC用于存储从OBJ文件中

使用WebGL实现一个Viewer来显示STL文件

关键字:WebGL,STL,ThreeJS,Chrome,Viewer,Python3.4, HTML5,Canvas. OS:Windows 10. 本文介绍如何使用ThreeJS来实现一个WebGL的Viewer,用来浏览STL文件. STL 文件是在计算机图形应用系统中,用于表示三角形网格的一种文件格式. 它的文件格式非常简单, 应用很广泛. STL是最多快速原型系统所应用的标准文件类型.STL是用三角网格来表现3D CAD模型. 1.新建一个STL.html文件如下: <!DOCTYPE

Cocos2d-x Lua 读取Csv文件,更方便的使用数据

我的书上或者是我曾经出售的源码里,都有Csv文件的影子. 也许是先入为主吧,我工作那会用的最久的配置文件就是Csv,所以我在很多游戏里都会情不自禁地优先选择它. Csv文件,格式很简单,就是一行一条数据,字段之间用逗号分隔,策划也可以方便地使用Excel进行编辑. Csv格式的文件,解析起来也很简单,所以自己动手写写很快~(小若:我就喜欢拿来主义,你怎么着) 最近在用Lua写游戏,对于技能.怪物等配置,我还是选择用Csv~ 不得不说,Lua等脚本语言,在某些方面是C++没法比的,这次我就用Csv

基于PLY的STL文件基本信息统计方法

1.摘要 STL文件是快速成型设备中常用的文件格式,随着3D打印技术的发展,STL格式文件的应用日益广泛.Python语言具有丰富和强大的类库,其语言简洁而清晰,因而Python语言越来越受欢迎.PLY是具名的LEX.YACC的Python版本,本文介绍了利用PLY模块对STL文件进行基本信息统计. KeyWord:PLY.语法分析.词法分析.STL 2.简介 计算机语言是计算机软件的系统的基础,经过几十年的发展,实现了从低级语言到高级语言的转变.原始的机器语言,到低级的汇编语言,它们虽然可以运

使用 Materialise magics 对 STL文件进行切片

我们在3D打印中常用的STL文件怎么转换成sla打印机需要的slc文件呢? 无疑我们需要一款切片软件,那就是Materialise magics了 Materialise magics 这款业内领先.针对增材制造而打造的通用数据准备和STL编辑软件具备STL文件格式转换.修复.设计编辑.打印平台准备等多项功能.赶快准备好您的3D打印模型吧! 使用Materialise magics对STL切片 如图所示是你下载好的Materialise magics软件 新建平台 加工准备 --> 新建平台 新

C#读取Excel文件,准换为list

经常会用到,废话不多说直接贴代码 //读取Excel文件 public static DataTable ReadExcelToTable(string path)//excel存放的路径{try{ //连接字符串string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1';"

【赵强老师】在Spark SQL中读取JSON文件

Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用.为什么要学习Spark SQL?如果大家了解Hive的话,应该知道它是将Hive SQL转换成MapReduce然后提交到集群上执行,大大简化了编写MapReduce的程序的复杂性,由于MapReduce这种计算模型执行效率比较慢.所以Spark SQL的应运而生,它是将Spark SQL转换成RDD,然后提交到集群执行,执行效率非常快!同时Spark SQL