STL文件的读取显示

合集下载

10种仿真文件格式介绍 -回复

10种仿真文件格式介绍 -回复

10种仿真文件格式介绍-回复关于仿真文件格式的介绍仿真文件格式是用于存储和交换仿真数据的特定文件格式。

它们在许多领域的仿真和建模应用中具有重要作用,包括工程、科学、计算机图形学等。

本文将介绍10种常见的仿真文件格式,并逐步回答与其相关的问题。

1. STL(Standard Tessellation Language)格式:STL格式主要用于存储三维模型的表面几何信息。

它将模型分解为小的三角形面片,并存储每个面片的顶点坐标和法线方向。

常用于3D打印、计算机辅助设计等领域。

以下是一些关于STL格式的常见问题:- STL格式有哪些变体?STL格式主要包括ASCII和二进制两种变体。

ASCII格式以文本形式存储,可读性强,但文件体积较大;而二进制格式通过使用二进制编码来存储数据,文件体积较小,但不易直接阅读。

- 如何读取和写入STL文件?读取STL文件的方法是解析文件中的顶点坐标和法线信息,并创建相应的三角形表面。

写入STL文件的方法是将三角形表面的顶点坐标和法线信息写入文件。

2. STEP(Standard for the Exchange of Product model data)格式:STEP格式是一种规范化的3D模型数据交换格式,广泛应用于CAD/CAM 领域。

它以中性的方式存储了完整的产品模型信息,并支持多种几何和非几何数据类型。

以下是一些关于STEP格式的常见问题:- STEP文件包含哪些数据?STEP文件包含模型的几何信息、拓扑信息、材料属性、装配关系、注释等多种数据。

- 如何解释和使用STEP文件的数据?解释和使用STEP文件的数据通常需要使用专门的CAD或CAD/CAM软件。

这些软件可读取STEP文件,并将其转换成可编辑的几何和非几何数据。

3. VTK(Visualization Toolkit)格式:VTK格式是一种用于科学可视化和图像分析的文件格式。

它支持多种数据类型,包括网格数据、图像数据、分子数据等。

Magics RP 指南

Magics RP 指南

Magics RP 教程该教程介绍了一些Magics RP 的工具。

使用该教程将使用户更快的了解和使用本软件。

一、视图和测量visualization and measuring目测教程所使用的文件是在目录../Magics RP .../demo_files 下的文件“Good.stl”。

打开文件可以用快捷键‘Ctrl + L’或按按钮。

这时也可以到网上浏览,查找STL格式的文件。

图1-1一个文件可以有不同的显示方式(在View 工具栏里)。

图1-2试用这些模式。

用'F4'键或图标可以控制视角。

在零件上托动鼠标可以看到零件是如何旋转的。

当指针接近窗口中心时,指针将会变成四角箭头形状,指针的移动将转变为零件绕屏幕的轴转动。

当指针靠近窗口边界时,指针将变成圆弧箭头形状,零件就可以绕垂直于屏幕的轴转动。

用户同样可以按住鼠标右键来旋转零件。

要快速定位可以用默认的视图。

该图标可以在view 工具栏中的Rotate标签下找到。

本软件预设了七种默认视图:主视、后视、左视、右视、俯视、仰视和ISO视图。

这些视图可通过点击某一个箭头来切换(当指针移过箭头时箭头会高亮显示)。

当立方体的所有边界都高亮显示时就选中了ISO视图(在紫色区域内点击,或在边界上点击)。

使用图标,用户可以在窗口平面内托动零件移动(按住鼠标左键不放)。

该功能也可以通过以下方法实现:菜单Main Menu/View/Pan 或用快捷键'Alt + M'。

或同时按着鼠标右键+SHIFT。

可以用SECTIONS 指令来检查零件内部。

Sections 指令在view工具栏下的Sections标签内。

图1-3用户可以在垂直于X、Y和Z轴方向上取得截面。

用户可以隐藏前面部分并让零件挖空显示。

二、修改STL文件的“远程控制”Fixing STL Files "remote control"修改远程控制本教程主要介绍一些STL修改工具。

UG软件STL数据使用说明

UG软件STL数据使用说明

UG软件STL格式数据使用说明
五、面导角
选中
导角的 半径
UG软件STL格式数据使用说明
五、面导角
导角的效 果
UG软件STL格式数据使用说明
六、总结
STL面的意思:STL面的数据其实是由无数组三个点连成面的和集;也叫STL三角面。 STL面的优点:STL面的好处是数据量比海量的点云数据小,它多能反映的物体的 特征比点云要清晰并且渲染效果好,使用方便。 在UG里面使用点构造器里面的在面上的选项,可以使我们很方便的在STL数据上 取得我们要的数据;结合截面的功能可以很方便的在STL数据上做截面线;将截 面线重构成曲线以后通过拉伸,扫掠来得到曲面,最后加厚成。
三、通过所获得截面做线
选择插入菜单曲线下 样条曲线命令来做一 跟曲线
UG软件STL格式数据使用说明
三、通过过所获得截面做线
点击样条命令以后选择通过 点选项来做下一步操作
UG软件STL格式数据使用说明
三、通过所获得截面做线
接着选择点构造器命令
UG软件STL格式数据使用说明三、通过所获得截面做线
此选择项类似 于UGII的点构 造器
选中右边 的STL数据
选择三个点做一个 用于坎截面的平面
关联选项取消选择
UG软件STL格式数据使用说明
二、在STL三角面上做截线
对象选择过滤器, 也称点构造器
这个选项叫做在面 上,选中它就可以 在导入的STL数据上 取数据了
所砍截面的效果 选中在面上, 直接在STL数 据上点击获得 相应的位置。
UG软件STL格式数据使用说明
UG软件STL格式数据使用说明
四、通过线得到面
如图通过插 入菜单的扫 略沿引导线 扫略命令绘 制曲面

海量STL文件的快速读取与显示

海量STL文件的快速读取与显示

第25卷2006年第8期8月机械科学与技术MECHAN I CAL SC I E NCE AND TECHNOLOGY Vol .25August No .82006收稿日期:20050902基金项目:国家自然科学基金项目(50475041),霍英东教育基金高校青年教师基金项目(91053),教育部优秀青年教师教学科研奖励计划资助作者简介:卫 炜(1972-),男(汉),江苏,博士研究生E 2mail:mee wwei@nuaa .edu .cn卫 炜 文章编号:100328728(2006)0820935204海量ST L 文件的快速读取与显示卫 炜,周来水,张丽艳(南京航空航天大学C AD /CAM 工程研究中心,南京 210016)摘 要:ST L 文件作为一种通用的三维数据文件格式,广泛应用于快速成型及其他领域。

如何快速读取海量数据的ST L 文件并显示,是模型后续操作的一个首要环节。

本文针对海量数据的特点,采用内存映射手段、基于哈希表结构的冗余顶点删除和OpenG L 中显示列表技术等,对海量ST L 文件的快速读取和显示进行了研究,并和国外先进软件进行了比较,实验数据表明本文方法较Surfacer 软件和Rap idFor m 软件提高效率25%~40%左右。

关 键 词:ST L 文件;海量数据;图形显示中图分类号:TP391 文献标识码:ARap i d STL F ile L oad i n g and V isua li za ti onW eiW ei,Zhou Laishui,Zhang L iyan(CAD /CAM Research Center,Nanjing University of Aer onautics and A str onautics,Nanjing 210016)Abstract:A s a general three 2di m ensi onal data file f or mat,stereo lithographic (ST L )files have been widely used in rap id p r ot otyp ing syste m s and many other fields .How t o l oad and visualize ST L files rap id 2ly is key t o subsequent model mani pulati on .According t o the characteristics of massive data,me mory mapp ing and Hash table 2based method f or deleting redundancy vertex fast in ST L files and OpenG L dis 2p lay lists have been used t o accelerate the l oading and visualizati on .Experi m ent shows that the p r oposed method is 25%~40%more efficient than the commercial s oft w are packages Surfacer and Rap idFor m.Key words:ST L file;massive data;visualizati on ST L (stereo lithographic )文件格式由3D Syste m s 公司于1987年推出,采用三角形面片离散地近似表示三维模型,目前已成为快速原型技术领域最为常用的文件格式和事实上的接口标准,在逆向工程、有限元分析、医学成像系统、文物保护等方面有广泛的应用。

STL文件读取显示与操作

STL文件读取显示与操作

2 基 于 Op n e GL的 S L模 型 的读 取 与 T
显 示
21 . Op n e GL概述
gNo maBd n ,ln ) l r l (0n ,2 ;
gV r x dv 0v 1v 2 ; l et 3 (0 , ,0 ) e 0
gVetx d v 0v lv 2 ; l re 3 ( l , l ,1 ) gVetx d v 0v 1v 2 ; l re 3 (2 ,2 ,2 ) gEn 0; l d



_
Tr n lt X =d g m X + m Tr nsae ; a sae i . a ]t X
_ _
_
Tr nsae : di m Y + m a l t Y ; a lt Y g. Tr ns a e
_
n_ ' n ltZ:dg m_ l1 a sae r l. Z+m a s tZ; Trn l e a I v l ae n ai tO; d
】 }
< >定 向定 量旋 转 : 2
v i T ViweViw: ViwRo ae odCS L e r e : On e tt0 {
向量 { , , ) nn n 与三角形三个 顶点( ,) 。 xYZ 满足右手定
0 引 言
目 , 前 机器人施釉 已经在陶瓷领 域有所应用 , 然
而, 在施 釉 作 业 中 , 釉 机 器人 喷枪 运 动 轨 迹 的 生产 施

则: 即右 手 环握 三 角形 , 四指 指 向 三 角形 顶 点 的排 序 方向 , 则拇指 所 指方 向 即为 该三 角 形面 片的 法矢 量方 向 。 根 据 数 据 存 储 方 式 的 不 同 ,T S L文 件 可 分 为

opencascade中stlreader实现方法

opencascade中stlreader实现方法

我们需要了解什么是 OpenCASCADE 和 STLReader。

OpenCASCADE 是一个开源的三维几何建模内核,它提供了一组用于处理和呈现三维几何数据的工具和函数。

STLReader 是OpenCASCADE 中的一个模块,用于读取和解析 STL 文件,STL 文件是一种常见的三维模型文件格式,它由许多小的三角形面片组成,用于描述物体的几何形状。

接下来,我们将介绍如何在 OpenCASCADE 中使用 STLReader 模块来实现 STL 文件的读取和处理。

1. 引入头文件我们需要在我们的代码中引入 OpenCASCADE 中与 STLReader 相关的头文件。

这可以通过以下代码实现:```cpp#include <StlAPI_Reader.hxx>```2. 创建 STLReader 对象接下来,我们需要创建一个 STLReader 对象,这可以通过以下代码实现:```cppStlAPI_Reader reader;```3. 打开 STL 文件接下来,我们需要打开我们要处理的 STL 文件。

这可以通过以下代码实现:```cppreader.ReadFile("example.stl");```4. 获取三角形面片数据一旦我们成功地打开了 STL 文件,我们就可以使用 STLReader 对象来获取其中的三角形面片数据。

这可以通过以下代码实现:```cppTopoDS_Shape shape = reader.Shape();```5. 处理三角形面片数据我们可以对获取到的三角形面片数据进行进一步的处理,比如计算其表面积、体积,或者进行网格简化等操作。

我们可以看出,在 OpenCASCADE 中,使用 STLReader 模块来实现STL 文件的读取和处理非常简单。

通过一系列的操作,我们可以轻松地将一个 STL 文件中的几何信息导入到我们的程序中,并进行进一步的处理和分析。

读取STL文件模型

读取STL文件模型

读取STL⽂件模型STL是CAD软件中出来的⼀种3D模型⽂件格式,已经解释的很清楚了。

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

ASCII STL,每⼀个facet由7⾏数据组成,outer loop后⾯三个顶点的顺序沿法线⽮量逆时针排序,格式如下:solid name // ⽂件名及⽂件路径facet normal ni nj nk // 三⾓形法向量的三个分量outer loopvertex v1x v1y v1z // 第⼀个顶点坐标vertex v2x v2y v2z // 第⼆个顶点坐标vertex v3x v3y v3z // 第三个顶点坐标endloopendfacet // 完成⼀个三⾓形的定义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 triangleREAL32[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 trianglesint 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。

3D打印机文件格式及其转换方法解析

3D打印机文件格式及其转换方法解析

3D打印机文件格式及其转换方法解析随着科技的不断发展,3D打印技术逐渐走进了人们的生活。

而要实现3D打印,首先需要将设计好的模型转化为打印机能够识别的文件格式。

本文将对一些常见的3D打印机文件格式及其转换方法进行解析,帮助读者更好地理解和应用3D打印技术。

一、STL文件格式STL(Standard Tessellation Language)是一种用于描述3D模型的文件格式。

它将模型分解为许多小的三角形面片,并记录下每个面片的顶点坐标信息。

STL文件格式简单易懂,适合用于3D打印,因此被广泛应用。

STL文件格式的转换方法主要有两种:导出和导入。

导出即将其他文件格式的模型转化为STL格式,而导入则是将STL格式的模型转化为其他文件格式。

1. 导出STL格式导出STL格式可以通过许多3D建模软件实现,如AutoCAD、SolidWorks等。

通常在软件中选择导出选项,并选择STL格式即可完成导出。

2. 导入STL格式导入STL格式同样可以通过各种3D建模软件实现。

在导入时,软件会将STL文件中的三角形面片重新组合成模型。

但需要注意的是,STL文件格式只记录了模型的外表面信息,而没有包含内部结构,因此在导入STL格式时可能会丢失一些细节。

二、OBJ文件格式OBJ(Wavefront OBJ)是一种广泛应用于3D建模和动画领域的文件格式。

与STL文件格式相比,OBJ文件格式更加复杂,可以保存更多的模型信息,如纹理、材质等。

OBJ文件格式的转换方法与STL文件格式类似,同样可以通过各种3D建模软件进行导入和导出。

在导入OBJ格式时,软件会将OBJ文件中的模型信息还原,包括顶点坐标、纹理坐标等。

三、AMF文件格式AMF(Additive Manufacturing File Format)是一种用于描述3D打印模型的文件格式。

与STL和OBJ文件格式相比,AMF文件格式更加灵活,可以保存更多的模型信息,如颜色、材料、纹理等。

STL模型的立体显示及其多屏拼接

STL模型的立体显示及其多屏拼接

系统仿真学报V ol. 16 No. 4JOURNAL OF SYSTEM SIMULATION April 2004• 740 •STL模型的立体显示及其多屏拼接郎兴华,郭阳,林亨,张伟(清华大学工业工程系, 北京 100084)摘要:介绍了基于微机的多通道STL模型交互式立体显示系统。

首先由程序提取STL文件三角形面片以及向量坐标信息,进行数据冗余处理和顶点向量的光滑处理,并通过OpenGL生成可视化的STL三维实体模型。

利用偏振光叠加的方法实现立体显示功能,提出了以网络同步功能为基础的多通道多屏拼接方案,开发了基于SpaceBall的交互功能,实现对STL模型的位置及姿态进行控制。

作为低成本的虚拟现实系统,该系统方案可应用于多种领域。

关键词:STL模型;立体显示;多屏拼接;虚拟现实;可视化;人机交互文章编号:1004-731X (2004) 04-0740-05 中图分类号:TP391.9 文献标识码:AStereo and Multi-screen Visualization of STL ModelsLANG Xing-hua,GUO Yang,LIN Heng,ZHANG Wei(Department of Industrial Engineering, Tsinghua University, Beijing 100084, China)Abstract: A PC-based multi-channel STL model display system is introduced. Firstly, the coordination information of triangle facets and their vectors in STL model file is extracted. The vertex coordinate and vector data are then processed to solve the redundancy problem of STL model and to make the model look smooth. Stereo display of the processed model is achieved through programming with OpenGL functions in software and realized through a polarized dual-projector system.Multi-channel display is based on LAN network synchronization. With Spaceball adopted in the system, natural manipulation of STL model for both position and orientation is realized. As a low-cost virtual reality system, the proposed method will possibly be applied in various research and development fields.Keywords: STL model; stereo display; multi-screen; virtual reality; visualization; human-computer interaction引言随着计算机技术近年来的不断进步和发展,虚拟现实作为一种新兴的综合技术已经越来越成熟地被应用于现实中的各个领域 [1][2]。

c++读取整个文件内容的最简洁高效写法

c++读取整个文件内容的最简洁高效写法

题目:C++读取整个文件内容的最简洁高效写法在C++编程中,读取整个文件的内容是一个常见的需求。

有时候我们需要对文件进行处理或者分析,而需要先将文件内容读取到内存中。

在这篇文章中,我们将探讨C++中读取整个文件内容的最简洁高效写法,帮助大家更好地理解和应用这一技巧。

1. 使用STL库中的ifstream和string在C++中,我们可以使用STL(标准模板库)中的ifstream和string来实现快速读取文件内容的操作。

下面是一个简单的示例代码:```cpp#include <iostream>#include <fstream>#include <string>std::string readEntireFile(const std::string& filename) {std::ifstream file(filename);if (file) {return std::string((std::istreambuf_iterator<char>(file)), (std::istreambuf_iterator<char>()));}return "";}int main() {std::string content = readEntireFile("example.txt");std::cout << content << std::endl;return 0;}```在这段代码中,我们首先包含了iostream、fstream和string这三个头文件。

然后定义了一个读取整个文件内容的函数readEntireFile,以及在main函数中调用该函数并输出文件内容的示例。

这段代码的关键点是使用了std::ifstream来打开文件,然后利用std::istreambuf_iterator<char>构造了一个string对象,从而将文件内容读取到了内存中。

基于VC的STL文件读取

基于VC的STL文件读取

第23卷第2期湖 北 工 业 大 学 学 报2008年4月Vol.23No.2 Journal of Hubei University of Technology Apr.2008[收稿日期]2007-12-01[作者简介]张贞贞(1982-),女,湖北枣阳人,武汉理工大学硕士研究生,研究方向:计算机辅助设计与仿真.[文章编号]1003-4684(2008)02-0044-03基于VC 的ST L 文件读取张贞贞1,陈定方2(1武汉理工大学计算机科学学院,湖北武汉430063;2武汉理工大学物流工程学院,湖北武汉430063)[摘 要]就CAD 系统较常用文件格式ST L 的快速读取问题展开讨论,分析了ST L 两种文件格式的特点,并讨论了冗余数据的消除.[关键词]ST L 文件;ASC Ò;二进制[中图分类号]T P 391[文献标识码]:AST L (Stereo Lithography interface specifica -tion)文件格式[1]最初出现于1989年美国3D SYS -T EM 公司生产的SLA 快速成型系统,是一种应用于CA D 模型与成型系统之间数据转换的文件格式,现在已为大多数CAD 系统和快速成型系统制造商所接受和采用,并且已经在快速成型技术领域中被誉为工业标准.本文旨在研究如何高效率读取STL 文件.1 STL 文件格式的结构ST L 类似于实体数据模型的表面有限元网格划分.STL 模型的数据通过给出组成三角形法向量的3个分量及三角形的3个顶点坐标来实现,STL 文件记载了组成实体模型的所有三角形面片的法向量数据和顶点坐标数据,有文本文件(ASCII)和二进制文件(BINARY)两种格式.1.1 STL 的ASC II 文件格式ASC Ò码格式STL 文件逐行给出三角面片的几何信息,每一行以1个或2个关键字开头.在STL 文件中的三角面片的信息单元facet 是一个带矢量方向的三角面片,ST L 模型就是由一组这样的三角面片构成.在一个STL 文件中,每一个facet 由7行数据组成,第1行是三角面片指向实体外部的法向失量数据,第2行说明随后的第3,4,5行数据分别是三角面片的3个顶点信息,沿指向实体外部的法向矢量(第1行数据)方向逆时针排列.ASC Ò[2]格式的STL 文件结构如下:solid filen am e stl M 文件路径及文件名facet n ormal x y z M 三角面片法向量的3个分量值outer loop vertex x y z M 三角面片第一个顶点的坐标vertex x y z M 三角面片第二个顶点的坐标vertex x y z M 三角面片第三个顶点的坐标endloop endfacet M 第一个三角面片定义完毕,,,,,,endsolid filename stlM 整个文件结束1.2 STL 的二进制文件格式二进制ST L 文件用固定的字节数来给出三角面片的几何信息.文件的起始80字节是文件头存储零件名,可以放入任何文字信息;紧随着用4个字节的整数来描述实体的三角面片个数,后面的内容就是逐个给出每个三角面片的几何信息.每个三角面片占用固定的50字节,它们依次是3个4字节浮点数,用来描述三角面片的法矢量;3个4字节浮点数,用来描述第1个顶点的坐标;3个4字节浮点数,用来描述第2个顶点的坐标;3个4字节浮点数,用来描述第3个顶点的坐标,每个三角面片的最后2个字节用来描述三角面片的属性信息(包括颜色属性等)暂时没有用.一个二进制STL 文件的大小为三角形面片数乘以50再加上84个字节.比较这2种方式可知,二进制格式文件较小(通常是ASC Ò码格式的1/5)[3],节省存储空间,但ASC Ò码格式的文件可读性更强,能被人工识别并被修改.2STL文件的读取与显示ST L文件是由一系列的三角形面片无序排列组合在一起的,没有反映三角形面片之间的拓扑关系,而且每一个小三角形面片必须与相邻的三角形面片共用2个顶点,每个顶点通常被重用6次左右,文件数据重复很多,造成了ST L文件在读取、存储等方面的效率问题.本文研究了如何消除冗余数据并快速读取ST L文件,这对于后续三维图形的现实,是一个重要和基本的环节.去除冗余点的实质是,从ST L文件中依次取出三角形,通过比较三角形顶点的坐标值,归并重复的点,从而建立一个无重复点的点表,去除冗余点最直接的方法就是比较法.对于新的顶点,读进来时依次对X坐标、Y坐标和Z坐标进行比较,且保证所有顶点依次按照X坐标、Y坐标和Z坐标排序.这样大大减少了查找范围,提高了排序和插入的效率,采用上述分析方法建立点表,有3个步骤:第一步,按三角形为单元,从文件中读入该三角形的3个顶点,逐点进行比较.第二步,判断该顶点是否已经在点表中存在,1)进行X坐标的比较.a)X坐标相同的顶点不存在,转入第三步.b)X坐标相同的顶点存在,转入2).2)在所有X坐标相同的顶点中,比较Y坐标.a)Y坐标相同的顶点不存在,转入第三步.3)Y坐标相同的顶点存在,转入4).4)在所有X坐标和Y坐标都相同的顶点中,比较Z坐标.a)Z坐标相同的顶点不存在,转入第三步.b)Z坐标相同的顶点存在,说明该顶点已经在存在于点表中所以新的顶点不加入点表中.第三不,向点表中插入新的顶点,同时完成排序.这样建立无冗余点的点表,效率很高,而且在搜索比较的同时,具有相同坐标值(X、Y或Z)的顶点自动排在一起,实现了自动分段功能,提高了后续搜索效率,实现上面的步骤.为实现上述步骤使用的Visual C++数据结构如下:struct Vertex{d ou ble x;M顶点的X坐标值d ou ble y;M顶点的Y坐标值d ou ble z;M顶点的Z坐标值vertex*x_s am e;M指向X坐标值相同的下一个顶点vertex*y_same;M指向X坐标和Y坐标值都相同的下一个顶点vertex*next;M指向X坐标值不相同的下一个顶点}vertex;struct Facet{d ou ble x;M面片法向量的X坐标值d ou ble y;M面片法向量的Y坐标值dou ble z;M面片法向量的Z坐标值vertex*vertex1;M指向该面片的第一个顶点vertex*vertex2;M指向该面片的第二个顶点vertex*vertex3;M指向该面片的第三个顶点}facet;使用上述方法对所读入的STL文件进行处理后,去除冗余点的同时也建立了点表,表中坐标值X 升序排列,而每个X值后有一个或多个Y值,其中Y值也按升序排列;同理,每个Y值后有一个或多个Z值,其中Z值也是按升序排列的.图1给出了点表形成后的逻辑结构图.图1点表的逻辑结构图如图1所示,所有顶点以多重链表[4]形式连接:顶点v1,v2,v3,v4形成的链中各自的X坐标值互不相同;v1,v5,v8形成的链中各自的X坐标相同,Y坐标互不相同;v5、v7形成的链中各自的X坐标和Y坐标都相同,Z坐标不同;v2、v6形成的链类似于v5、v7形成的链,其中各自的X坐标和Y坐标都相同,Z坐标不同.此外,由结构体facet形成的链表(面表)记录了每个面片的法向量以及它的3个顶点的信息,使得面表和点表联系在一起,后续要显示三维图形时顺序读取面表,通过面表间接在点表中找到各顶点.这样,整个STL文件所有三角面片的数据可由facet结构的一个数组m_facet来记录.为实现动态存储,该数组定义如下:CArray<facet,facet>m_facet;用指针vertex*head作为点表的头指针,判断一个顶点是否在点表中存在具体算法如下:vertex*Sort(vertex*v,vertex*head){vertex*p;veretex*q;M链表为空时插入点vif(head==NUL L){head=v;return v;}else{p=head;q=NULL;w hile(p){if(v->x==p->x){M在X坐标值相同的链中查找w hile(p){if(v->y==p->y){M在X,Y坐标值都相同的链中查找w hile(p){M点表中已存在点v,返回其位置if(v->z==p->z){r eturn p;}else{M在X,Y坐标值相同的链中查找并插入点vif(v->z>p->z){q=p;p=p->y_same;}45第23卷第2期张贞贞等基于V C的ST L文件读取els e{if(q==NUL L){head=v;}els e{if(q->next==p){q->next=v;}if(q->x_same==p){q->x_same=v;}if(q->y_same==p){q->y_sam e=v;}}v->y_s ame=p;v->x_same=p->x_same;p->x_same=NU LL;v->next=p->n ext;p->n ext=NU LL;return v;}}}if(p==NU LL){q->y_sam e=v;return v;}}els e{M在X坐标值相同的链中查找并插入点vif(v->y>p->y){q=p;p=p->x_same;}els e{if(q==NUL L){head=v;}els e{if(q->next==p){q->next=v;}if(q->x_same==p){q->x_same v;}}v->x_sam e=p;v_next=p->n ext;p->n ext=NU LL;return v;}}}if(p==NU LL){q->x_same=v;retu rn v;}}els e{M在X,Y,Z坐标值均不同的链中查找并插入点vif(v->x>p->x){q=p;p=p->n ext;}els e{if(q==NUL L){head=v;}els e{q->nex t=v;}v->n ext=p;return v;}}}if(p==NU LL){q->next=v;retu rn v;}}}然后读取A SCÒ形式的ST L文件,存储文件信息,具体算法如下:BOOL L oadST LFile(L PCT ST R stlfile){FILE*file;if((file=fopen(stlfile,"r"))==NUL L)return fals e;char s tr[80];vertex*v1,v2,v3;facet*f;w h ile(fscanf(file,"%s",str)==1){if(strn cmp(str,"n orm al",6)==0){v1=(vertex*)m alloc(sizeof(vertex));v2=(vertex*)m alloc(sizeof(vertex));v3=(vertex*)m alloc(sizeof(vertex));f=(facet*)malloc(s izeof(facet));M读取面片的法向量fs canf(file,"%1f%1f%1f",&(f->x),&(f->y),&(f->z)); fs canf(file,"%*s%*s");M读取面片的三个顶点信息到v1,v2,v3fs canf(file,"%*s%1f%1f%1f",&(v1->x),&(v1->y),& (v1->z));fs canf(file,"%*s%1f%1f%1f",&(v2->x),&(v2->y),& (v2->z));fs canf(file,"%*s%1f%1f%1f",&(v3->x),&(v3->y),& (v3->z));分别判断v1,v2,v3是否在点表中出现过并完成面表到点表的映射f->vetex1=Sort(v1,head);f->vetex1=Sort(v2,head);f->vetex1=Sort(v3,head);m_facet.Add(f);}}}最后,通过顺序读取面表m_facet可以获取所有三角面片信息,在VC中利用OpenGL[5]来实现三维图形的显示.具体算法如下:for(int i=0;i<num ber;i++){g lBegin(GL.TRIAN GLES);g lNorm al3f(m_triang le[i].x,m_tr iangle[i].y,m_ triang le[i].z);g lVer tex3f(m_triangle[i].vertex1->x,m_trian-gle[i].v ertex1->y,m_triang le[i].vertex1-> z);g lVer tex3f(m_triangle[i].vertex2->x,m_trian-gle[i].v ertex2->y,m_triang le[i].vertex2-> z);g lVer tex3f(m_triangle[i].vertex3->x,m_trian-gle[i].v ertex3->y,m_triang le[i].vertex3-> z);g lEnd();}函数glBegin[5]实用参数GL.T RIANGLES将产生实体造型效果,即真实感图形显示.3结语ST L文件中每个顶点通常被重用6次左右,因而文件数据重复很多.通过消除冗余顶点信息可以极大地减少存储空间,提高对STL文件的读取和存储效率,为三维物体的建模提供了方便.此外,采用多重链表形式存储定点信息在消除冗余顶点的同时,使坐标值相同的点连在一起,并且按照坐标值的升序排列,减少了在查找新的顶点是否在点表中存在时的比较次数,提高了查找效率.[参考文献][1]张红玲.ST L格式实体真实感图形显示工具[J].电脑学习,2000(4):31-32.[2]王清辉,王彪.V isual C++CA D应用程序开发技术[M].北京:机械工业出版社,2003.[3]卫炜,周来水,张丽艳.海量ST L文件的快速读取与显示[J].机械科学与技术,2006,25(6):935-938. [4]严蔚敏,吴伟民.数据结构[M].北京:清华大学出版社,2007.[5]Shr einer D,Woo M,Neider J,et al.OpenG L编程指南[M].徐波译.北京:人民邮电出版社,2005.(下转第73页)46湖北工业大学学报2008年第2期[ 参 考 文 献 ][1] 申忠如,郭福田,丁 晖.现代测试技术与系统设计[M ].西安交通大学出版社,2006:102-106.[2] 赵浪涛.BP 神经网络PID 控制器研究[J].兰州工业高等专科学校学报,2007,14(2):34-35.[3] 凌振宝,王 君,朱凯光.数字温度传感器在热电偶冷端温度补偿中的应用[J].传感器技术,2003,22(6):45-46.The Research on the Intelligent Instrument for MeasuringTemperature Based on PID Neural NetworkZH U Ke 1,LIU H ong -li 1,ZH EN Yu -yun1,2(1The School of A utomation ,Wuhan Univ.of T echnology ,Wuhan 430063,China;2I nstitute of I ntelligent M anuf actur ing ,Wuhan Univ.of T echnolog y ,Wuhan 430063,China)Abstract:T herm oco uple is w idely applied in industry temper ature measurem ent,but it is no t a linear rela -tion betw een its temper ature and potential,w hich lim its the pr ecision of measur ing tem perature.In order to solve the pr oblem o f the accuracy of therm oco uple temper ature calculatio n,the hardw are circuit of Inte-l lig ent Instrument is designed w ith feed fo rw ar d correction function of the PID N eural Netw o rk.The result show s that this com puting method has g ood reliability and pr acticability.Keywords:thermo couple;PID neural netw or k;intelligent instrument for measuring temperature[责任编校:张 众](上接第46页)STL File Loading Based On VCZH ANG Zhen -zhen 1,CH EN Ding -fang 2(1S chool of Com p uter S cience,Wuhan Univ .of T echnology ,Wuhan 430063,China;2School of L ogistics E ngine,Wuhan Univ .of T echnology ,Wuhan 430063,China)Abstract:ST L has been the industry standar d in the field of rapid prototype technolo gy.H ow to load and visualize the STL file rapidly w ith deleting r edundancy vertex in STL files is discussed in this paper in theaspects o f ST L rapid processing of comm on file for mats and the analysis of tw o STL file form ats.Keywords:ST L;A SC Ò;binary[责任编校:张 众]73第23卷第2期 朱 科等 基于PID 神经网络的智能温度仪表研究。

(持续更新)stl库的使用

(持续更新)stl库的使用

(持续更新)stl库的使⽤字符串处理1、读取整⾏⽤getline(cin,str),遇到换⾏符或者ctrl+z结束。

while(getline(cin,str))在输⼊框中按下ctrl+z即可结束循环。

getline不会读取⾏末的换⾏符,也不会将其留在缓冲区中(?)cin>>x会将换⾏符留在缓冲区中,因此需要cin.get/cin.ignore去吸收。

2、分割字符串。

x=str.find(str1)返回str中第⼀个str1字符出现的位置,如果str中⽆str1,则x为string::nposy=x.substr(pos,len)从pos开始,跨越 len个字符或者到达字符串的结尾 pos可省略,默认为03、字符串反转reverse(str.begin(),str.end());反转之后字符串名仍为strstr1.assign(str.rbegin(),str.rend());反转之后赋值给str1vector1、创建与初始化vector<int>a;容量为0的vectorvector<int>a(100);容量为100的vector ,其中所有元素被初始化为0vector<int>a(10,2);容量为10的vector,其中所有元素被初始化为2vector<int>a(b); a为b的拷贝,此时a,b的元素类型必须⼀致vector<int>a(b.begin+3,b.end()-3); a为两个迭代器指定范围内的元素vector<int>a={1,2,3,4,5,6}; a={1,2,3,4,5,6}2、增加元素vector<int>a1)使⽤push_back或emplace_back⽅法,在vector最后⾯插⼊元素a.push_back(x)a.emplace_back(x)2)使⽤insert⽅法,在指定位置处插⼊元素a.insert(a.begin()+3,x)在vector的第4个元素前插⼊元素x3、删除元素clear删除所有元素erase删除指定元素(erase是⼀个效率⽐较低下的⽅法,因为他删除元素之后会把后⾯的元素全部向前复制,复杂度为O(n),如果数据量过⼤,且数据类型为结构体,可以使⽤存在标志位,或者伪链表,以空间换时间)a.erase(a.begin+4)删除a[4]a.erase(a.begin+4,a.begin+7)删除a[4]到a[7]之间的所有元素pop_back删除末尾元素4、查找元素1)迭代器vector<int>a;vector<int>::iterator it;for(it=a.begin;it!=a.end();it++){if(*it==x) {//code;}}2)使⽤find⽅法vector<int>::iterator it = find(a.begin(),a.end(),x);返回⼀个指向该元素的迭代器3)vector<int>T; T.back()指代尾部元素5、交换元素位置swap(a[4],a[7])6、元素排序bool compare(int a,int b){return a<b; //升序排列}sort(vec.begin(),vec.end(),compare); //compare缺失时默认为升序排序⼀个⼩关键点:compare不能写在class中或结构体中,⼀定要是全局函数。

STL文件的读取显示

STL文件的读取显示
public:
bool Read(VertexArray&vertices);//顶点信息读取函数 private: void ReadL.ne(string&line);//读取行信息函数 void Push Line(Verte×Array&vertices);//读取顶点函数 : 在函数Read(Vene×Array&vertices)中通过ifstream定义对象绑定并打开STL 文件,为进行数据信息的读取、保存做准备。 bool Vertex Reader::Read(Vertex Array & vertices) { Ifstream infile(File Name.C—strO,
2.2 TL的ASCII文件格式
ASCII码格式的STL文件逐行给出三角面片的几何信息,每一行以1个或2个关 键字开头。在STL文件中的三角面片的信息单元facet是一个带矢量方向的三角面 片,STL三维模型就是由一系列这样的三角面片构成。整个STL文件的首行给出了 文件路径及文件名。在一个STL文件中,每一个facet由7行数据组成,facetnormal 是三角面片指向实体外部的法矢量坐标,outer loop说明随后的3行数据分别是 三角面片的3个顶点坐标,3顶点沿指向实体外部的法矢量方向逆时针排列。 ASCII格式的STL文件结构如下: solid filename stl //文件路径及文件名 facet normal X Y z//三角面片法向量的3个分量值 outer loop vertex X Y z //三角面片第一个顶点坐标 vertex X Y Z //三角面片第二个顶点坐标 vertex X Y Z //三角面片第三个顶点坐标 end loop end facet //完成一个三角面片定义 end solid filename stl//整个STL文件定义结束一个具体STL文件如下: solid C:\Temp\NOEL Parts\HMJ—PRT.STL created by Ctrl View V2.70 facet normal 0 1 0 outer loop vertex 67.4752 34.7981 31.693 vertex 68.4358 34.7981 30.3941 vertex 69.1 631 34.7981 28.951 6

如何读STL程序西门子PLCStep

如何读STL程序西门子PLCStep

物装理载上存是储C区PU―模―块存的放部用分户R程AM序 物理上是CPU的部分RAM、EEPROM、外置FEPROM等
动态装载存储区: 存放用户程序
第13页/共21页
名称
输入(I)
输出(O) 外设输入(PI) 外设输出(PO) 位存储区(M)
定时器(T) 计数器(C) 临时本地数据存储
区(L)
数据块(DB)
//双字表示32位,如浮点数为32为双字
第8页/共21页
寻址方式 :
存储器间接寻址
存储器间接寻址 :标识参数由一个存储器给出,存储器的内容
对应该标识参数的值(该值又称为 地址指针) 这种寻址方式能动态改变操作数存储器的地址,常用于程序循环过程中 A I[MD 2] //对由MD 2指出的输入位进行“与的”寻逻辑址操。作,如: MD 2值为
1,外设访问(P)不通过映像区;
2,有些变频器等超出了映像区的范围所以,只能使用外设访问(P) ;
3,外设访问(P)在程序执行到此位置时进行读写操作,而普通的输入输出,则在程序开始读入,结
束输出;
第14页/共21页
状态字:
状态字表示CPU执行指令时所具有的状态,用户程序可以访问和检测 状态字,并可以根据状态字中的某些位决定程序的走向和进程。
寻址方式 :
寄存器间接寻址(指针)
寄存器间接寻址 :在S7中有两个地址寄存器(AR1和AR2)
地址寄存器的内容 + 偏移量 = 地址指针
L P#8.6 //将P#8.6装入A 1
LAR1
//将累加器1的内容传送至地址寄存器1
L P#10.0
//将P#10.0装入A1
LAR2
//将累加器1的内容传送至地址寄存器2

STL文件读写基础

STL文件读写基础

STL⽂件读写基础stl中对⽂件读写的函数在头⽂件fstream中定义,它的基本对象模型如下:其中包含三个对象ifstrea、ofstream和fstream,分别对⽂件提供只读、只写、读写功能,从其对象继承关系也可以看出这⼀点。

下⾯就简单的介绍下基本的⽂件⽅法打开⽂件打开⽂件⼀般有两种⽅式:1、在构造函数中打开ifstream input("r:\\3.txt", ios::in | ios::binary);2、通过open函数打开ofstream output;output.open("r:\\3.txt", ios::out | ios::binary);不管⽤哪种⽅式,都需要传⼊两个参数:第⼀个参数是⽂件名,第⼆个参数是打开选项,常见的选项有:in、out、app(append)、binary 等。

第⼆个参数也可以不传,此时,对于ifstream,就是以读⽅式打开、ofstream以写⽅式打开。

检查是否打开成功可以通过good函数检查⽂件是否打开成功:if (!input.good()){cout << "file open fail" << endl;return 1;}这个good函数也可以去掉,直接检查steam是否为真(这样可读性不好,不建议,但许多历史代码喜欢这么写,还是应该学习⼀下)。

if (!input){cout << "file open fail" << endl;return 1;}定位和获取当前位置有的时候,我们需要对⽂件进⾏随机访问,如连接两个⽂件的时候就要定位到⽂件的末尾。

在stl中可以通过stream对象的seekg实现这⼀功能。

与之相对的就是获取当前位置,函数为tellg,如下代码演⽰了利⽤这两个函数获取⽂件长度。

input.seekg (0, ios::end);int length = input.tellg();tellg函数⽐较简单,没有参数,直接返回当前位置。

基于VC++和OpenGL的STL文件读取显示

基于VC++和OpenGL的STL文件读取显示

基于VC++和OpenGL的STL文件读取显示
严梽铭;钟艳如
【期刊名称】《计算机系统应用》
【年(卷),期】2009(18)3
【摘要】STL是三维模型常用的文件格式.对STL文件进行读取和显示,是对模型进行后续操作的前提.在对STL文件格式进行详细分析的基础上,以VC++作为开发平台;利用C++标准IO库的ifstream类型定义对象并绑定STL文件;再用标准库string类型中的getline逐行读取绑定的STL文件;最后,应用OpenGL中绘制三角面片编程技术实现对STL文件格式的直观显示.通过试验验证了读取和显示效果.【总页数】4页(P172-175)
【作者】严梽铭;钟艳如
【作者单位】桂林电子科技大学,计算机与控制学院,广西,桂林,541004;桂林电子科技大学,计算机与控制学院,广西,桂林,541004
【正文语种】中文
【中图分类】TP3
【相关文献】
1.基于OpenGL的STL格式实体真实感图形显示工具的实现 [J], 程小茁;刘金义;吴涛
2.基于OpenGL的STL文件剖分及填充显示技术研究 [J], 牛晓峰;侯华;徐宏;毛红奎
3.基于VC和OpenGL的STL文件的分层和显示 [J], 庄云良;赵东标;刘凯;章永年;
陈盛
4.基于OpenGL的3DS图形文件读取和显示 [J], 李声弘;周楚涵;董远
5.基于OpenGL技术的STL数据格式的显示 [J], 陈挺;俞子荣
因版权原因,仅展示原文概要,查看原文内容请购买。

海量STL文件的快速读取与显示

海量STL文件的快速读取与显示

海量STL文件的快速读取与显示
卫炜;周来水;张丽艳
【期刊名称】《机械科学与技术》
【年(卷),期】2006(025)008
【摘要】STL文件作为一种通用的三维数据文件格式,广泛应用于快速成型及其他领域.如何快速读取海量数据的STL文件并显示,是模型后续操作的一个首要环节.本文针对海量数据的特点,采用内存映射手段、基于哈希表结构的冗余顶点删除和OpenGL中显示列表技术等,对海量STL文件的快速读取和显示进行了研究,并和国外先进软件进行了比较,实验数据表明本文方法较Surfacer软件和RapidForm软件提高效率25%~40%左右.
【总页数】5页(P935-938,975)
【作者】卫炜;周来水;张丽艳
【作者单位】南京航空航天大学,CAD/CAM工程研究中心,南京,210016;南京航空航天大学,CAD/CAM工程研究中心,南京,210016;南京航空航天大学,CAD/CAM 工程研究中心,南京,210016
【正文语种】中文
【中图分类】TP391
【相关文献】
1.基于VC++和OpenGL的STL文件读取显示 [J], 严梽铭;钟艳如
2.一种基于多核环境的海量数据快速读取方法 [J], 马礼;李敬喆;葛根焰;杨银刚
3.基于内存映射文件技术的海量影像数据快速读取方法 [J], 胡伟忠;刘南;刘仁义
4.基于内存映射文件的海量点云数据快速读取方法 [J], 赵文
5.STL文件读取显示与操作 [J], 肖任贤;张军舰;冯浩;潘海鹏
因版权原因,仅展示原文概要,查看原文内容请购买。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
通过前面对 STL 文件的结构分析可知,STL 文件由文件路径及文件名、三角 面片法向量、三角形面片的顶点、三角形顶点定义开始标识符(outer Ioop)及结 束标识符(endIoop)和三角形面片定义结束标识符(endfacet)等字符串信息构成。 在本文中只需要其中的三角形顶点信息,因此要对读入的字符串进行是否为三角 形顶点信息的判断,这里通过 Push Line(Verte×Array&vertices)函数来实现 判断。
读取STL文件时,只需要读取STL文件中表示向量和三角形顶点的相应数据, 不需要读文件中的其它信息。依次按逆时针方向读入各个三角形面片的3顶点坐 标值。由于三角面片外法矢量可以通过右手螺旋法则由3顶点坐标值计算出来, 因此可不对其进行存储,以节省存储空间。如果后续处理需用到法矢量, 可利用以下的外法矢量计算公式:
ifstream::in);//打开要读取的STL文件 Read Line(Jjne): Push Line(Vert jces): }
Read Line(string&line)函数不对Read(Vertex Array & vertices)函数中 读入的行字符串信息进行是否为三角形顶点字符串信息的判断,而只对读入的字 符串进行存储,并通过strtok(buff,Del)函数对读入的每行字符串信息进行分 隔,以区别读入的每个字符,为下一步对三角形顶点字符串信息的判断做准备。 部分实现程序如下: void Vertex Reader::Read Line(string&line) { 一一一 char★token = strtok(buff。Del);//分解字符串为一组标记串 while(token){ Tken.push..back(token); token=strtok(NULL。Del); }
end loop end facet
通过对STL两种文件格式的分析可知,二进制格式文件较小(通常是ASC¨码 格式的1/5),节省文件存储空间,而ASCII码格式的文件可读性更强,更容易进 行进一步的数据处理。
3 STL文件的读取与显示
本文以STL三维模型文件为数据源,根据对文件格式和内部数据结构的分析, 采用OpenGL作为三维图形接口,并以VC++6.O为开发平台。利用C++标准IO库的 if stream类型定义对象并绑定STL文件:再用标准库string类型中的getline逐 行读取绑定的STL文件:然后对读入的数据进行是否为顶点信息的判断,存储其 中的顶点数据。再应用OpenGL编程技术实现对STL三维模型文件的显示。
2Байду номын сангаас1 TL的二进制格式
二进制STL文件用固定的字节数来给出三角面片的几何信息。文件起始的80 个字节是文件头,用于存贮零件名;紧接着用4个字节的整数来描述模型的三角
面片个数,后面逐个给出每个三角面片的几何信息。每个三角面片占用固定的50 个字节,依次是3个4字节浮点数(角面片的法矢量)3个4字节浮点数(1个顶点的坐 标)3个4字节浮点数(2个顶点的坐标)3个4字节浮点数(3个顶点的坐标)个三角面 片的最后2个字节用来描述三角面片的属性信息。一个完整二进制STL文件的大小 为三角形面片数乘以50再加上84个字节,总共1 34个字节。
文中我们具体用函数 stricmp0 来判断读入信息是否为顶点;由于读入的顶 点信息为字符类型而在显示时要用到的是浮点类型的顶点信息,因此要通过函数 atof0 进行类型的转化。部分实现程序如下:
void Vertex Reader::Push Line(Vertex Array&
vertices) { if(stricrnp(Tken[0].C—str0,”vertex”)==O) {//判断读取的是否为顶点信息 double x=atof(Tken[1].c—strO);//把字符串转化成浮点数 double Y=atof(Tken[2].C—str0); double Z=atof(Tken[3].C—str0); vertices.push—back(Vertex(x, Y,z))://对点进行读入保存 } }
2.2 TL的ASCII文件格式
ASCII码格式的STL文件逐行给出三角面片的几何信息,每一行以1个或2个关 键字开头。在STL文件中的三角面片的信息单元facet是一个带矢量方向的三角面 片,STL三维模型就是由一系列这样的三角面片构成。整个STL文件的首行给出了 文件路径及文件名。在一个STL文件中,每一个facet由7行数据组成,facetnormal 是三角面片指向实体外部的法矢量坐标,outer loop说明随后的3行数据分别是 三角面片的3个顶点坐标,3顶点沿指向实体外部的法矢量方向逆时针排列。 ASCII格式的STL文件结构如下: solid filename stl //文件路径及文件名 facet normal X Y z//三角面片法向量的3个分量值 outer loop vertex X Y z //三角面片第一个顶点坐标 vertex X Y Z //三角面片第二个顶点坐标 vertex X Y Z //三角面片第三个顶点坐标 end loop end facet //完成一个三角面片定义 end solid filename stl//整个STL文件定义结束一个具体STL文件如下: solid C:\Temp\NOEL Parts\HMJ—PRT.STL created by Ctrl View V2.70 facet normal 0 1 0 outer loop vertex 67.4752 34.7981 31.693 vertex 68.4358 34.7981 30.3941 vertex 69.1 631 34.7981 28.951 6
投影方式。透视投影通过函数void gIuPerspectiVe(GIdouble fovy,Gldouble aspect,Gldouble zNear,Gldouble zFar)其中的参数分别表示垂直方向的视野 角度、高度到宽度的纵横比,以及近端和远端裁剪平面之间的距离。恰当的参数 设置可以得到更好的显示效果。
基于 VC++和 OpenGL 的 STL 文件读取 显示
基于 VC++和 OpenGL 的 STL 文件读取显示
摘要:STL是三维模型常用的文件格式。对STL文件进行读取和显示,是对模型
进行后续操作的前提。在对STL文件格式进行详细分析的基础上,以VC+-I-作为 开发平台;利用C++标准lO库的ifstream类型定义对象并绑定STL文件;再用标准 库string类型中的getline逐行读取绑定的STL文件;最后,应用OpenGL中绘制三 角面片编程技术实现对STL文件格式的直观显示。通过试验验证了读取和显示效 果。
关键词: STL 文件 ASCII 三维模型 三角面片 OpenGL
1 引言
STL(Stereo lithographic)文件格式是美国3DSYSTEMS公司提出的三维实体 造型系统的一个接口标准,其接口格式规范。目前已被工业界认为是快速成形 (rapid prototypi ng)领域的标准描述文件格式。在逆向工程、有限元分析、医 学成像系统、文物保护等方面有广泛的应用川。对STL文件的读取与显示是其应 用的基础与前提,本文对STL文件特点进行了详细的分析并在VC++平台上。利用 C++标准库中提供的文件流读取及字符操作等功能结合OpenGL中三角面片绘制的 编程技术实现了对STL文件的读取与显示。
—z=O) :×_(_×),y.(_y),z_(_z)//--坐标变量赋初值 {} private://定义顶点三坐标 double X_: double,y_: double z_: }:
3.2 定义读取功能
由前面的分析我们知道,STL文件以行为标准存储不同信息。根据文件格式 的该特点,本文首先应用C++标准IO库的ifstream类型定义对象绑定待读取的STL 文件:再采用逐行读取的方式用标准库string类型中的getline函数从ifstream 对象绑定的STL文件中读入数据。由于只需用到其中的顶点信息,因此,通过判 断字符Vertex,然后读取其后的数据即可。本文在类Vertex Reader中定义了读 取STL文件的相关操作函数,Vertex Reader类定义的部分代码如下: class Verte×Reader {
(1)
3.1 定义顶点。
STL三维模型文件由一系列的三角面片组成,每一个三角面片由三维空间中 对应的三个顶点组成。STL文件的读取与显示实质就是对STL文件中的顶点信息进 行读取并直观显示,因此,读取显示STL文件首先要解决的就是顶点的定义问题, 本文通过类Vertex定义三角面片顶点,Vertex类定义的部分代码如下: class Vertex { public: Verte×(double—x=0,double—y=O,double
3.3 STL文件的显示
在OpenGL函数库中,提供了直接渲染三角面片的方法glBegin(GLTRIANGLES) 和glEnd(),因而利用OpenGL来实现STL三维模型的真实感图形显示,更加具有优 势。部分实现程序如下: void CWelcomeView::myplane() {⋯ for(int i_0:i<vertices.size();bi+3) {glBegin(GLTRIANGLES);//绘制三角面片 glVerte×3f(Vertices[i].xo,vertices[i].Y0,vertices[i].Z()): gIVertex3f(Vertices[i+1].XO。vertices[i+1】.YO,vertices[i+1].Z0, ): g|Verte×3f(Vertices[i+2].X0。vertices[i+2].YO,vertices[i+2].Z() ): glEnd0; ) } 注意,在OpenGL中投影是进行模型显示的关键技术,主要有两种类型,一种是正 投影(orthograghic projection)另一种是透视投影(perspective projection)。 由于透视投影更符合人类视觉,使模型显示更具有真实感,因此本文采用了该种
相关文档
最新文档