当前位置:首页 >> 机械/仪表 >>

基于 OpenGL的 STL文件可视化研究


中国科技论文在线

http://www.paper.edu.cn

基于 OpenGL 的 STL 文件可视化研究
胡海欧
北京航空航天大学交通科学与工程学院,北京 (100191)
E-mail:ouhai83@163.com

摘 要:OpenGL 是一个三维模型库,在三维真实感图形制作中具有优秀的性能,广泛运用 于 CAD、大型游戏和仿真模拟软件的开发;STL 是三维模型常用的文件格式,其使用三角面 片来表示三维实体模型。 STL 文件的可视化研究是对模型进行后续处理和软件二次开发的 对 前提, 本文在对 STL 文件进行分析的基础上, 运用 OpenGL 强大的函数功能在 Visual C++6.0 平台上进行 STL 文件的可视化研究,并对读入的 STL 文件进行三维真实感渲染、视角变换、 显示缩放等, STL 数据模型的显示功能更加完善, 使 采取简洁易懂的数据存储结构进行渲染, 结合 C 语言中 fscanf 函数读取 STL 文件,取得了较好的效果,该方法方便实用,具有一定 的使用价值。最后,利用该方法开发出一个基于 STL 文件的数据模型的可视化软件,该软件 为 STL 文件的后续处理及其相应的二次开发提供了有力的支持, 并进行了大量的 STL 文件导 入显示测试实验,到达了预期的目标。 关键词:OpenGL;STL 文件;可视化 中图分类号:TP391.7

1.引言
目前,CAD 系统在三维建模上具有优秀强大的功能,但在功能梯度材料零件建模、3D 模型数据处理等专业领域为了达到特定的目标,往往需要对 CAD 软件进行二次开发。而在 二次开发前期准备阶段,读取 CAD 模型的几何信息和拓扑信息势在必行,这样,对 CAD 模型数据文件的可视化研究必不可少,本文在探讨 STL 文件的基础上,选用简便的数据结 构在 OpenGL 基础上对 STL 文件进行了可视化研究。

2.STL 文件格式
STL 文件是若干空间小三角形面片的集合,通过三维模型表面的三角网格化获得,每个 STL 文件有 三角形面片用三角形的三个顶点和指向模型外部的三角形面片的法向量组成[1]。 两种数据格式,一种是 ASCⅡ格式,如图 1 所示,另一种是二进制格式。二进制的文件格 式要小得多,大约是 ASCⅡ格式的 1/6,但 ASCⅡ格式的文件可读,便于测试。由于 STL 的 ASCⅡ格式文件的可读性,本文选用这种格式作为可视化研究。
STL ASCⅡ格式 solid[零件名] 三角形面片列表 endsolid[零件名]

三角形面片格式 facet normal Nx Ny Nz out loop vertex V1x V1y V1z vertex V2x V2y V2z vertex V3x V3y V3z out loop endfacet

图 1 STL 文件 ASCⅡ格式

-1-

中国科技论文在线
图 2 所示。

http://www.paper.edu.cn

在三角形面片格式里,三个顶点(vertex)跟该三角面片的法向量符合右手螺旋定则,如

图 2 单个三角面片 STL 文件的二进制格式文件较小、易于传输,所以应用较为广发。二进制格式文件的前 84 字节为头记录,其中 80 字节用来描述零件名、作者姓名和一些有关文件的评述;4 个字 节说明三角面片数。接下来对每个三角形面片用 50 个字节来存放三角形的法向矢量和三个 顶点坐标值,每个坐标值占用 4 个字节,共 48 字节,最后两个字节用以备特殊用途。 STL 文件在机械工业领域中有广泛的应用,主要因为有以下的有点: 1、STL 文件生成的简单性。几乎所以 CAD 软件均具有输出 STL 文件的功能,同时还 可以控制输出的 STL 模型的精度。 2、输入文件广泛。大多数三维几何模型都可以通过表面的三角化生成 STL 文件。 3、具有简单的分层算法。由于 STL 文件数据简单,所以分层算法相对要简单的多。 4、模型易于分割。当成型的零件很大而很难在成型机上一次成型时,这时应该将模型 分割为多个小的部分,分别制造,模型分割对于 STL 文件来说相对简单的多。

3.OpenGL 概述
OpenGL(Open Graphic Library, 开放式图形库)是一个三维的计算机和模型库, 在三维真 实感图形制作中具有优秀的性能,广泛运用于三维 CAD、大型游戏和仿真模拟软件的开发
[2]

。OpenGL 是 SGI 公司开发的可以独立于窗口系统、操作系统和硬件系统环境的图形开发

环境,是一个与硬件无关的 API(Application Programming Interface,应用程序接口),可以在 不同的硬件平台上得到实现。由于 OpenGL 是通过点、线、多边形来构造物体模型的,所以 在许多复杂物体的建模上得心应手。 Windows NT 下的 OpenGL 组件有两种,一种是 SGI 公司提供的,一种是 Microsoft 公 司提供的。两者大体上没有什么区别,都是由三大部分组成: 1、函数的说明文件:gl.h、glu.h、glut.h 和 glaux.h; 2、静态链接库文件:glu32.lib、glut32.lib、glaux.lib 和 opengl32.lib; 3、动态链接库文件:glu.dll、glu32.dll、glut.dll、glut32.dll 和 opengl32.dll。 OpenGL 提供了 3 个函数库,它们是基本库、实用库和辅助库。 1、基本库:库函数以“gl”为前缀,包含有 115 个函数。这部分函数用于常规的、核心 的图形处理。由于许多函数可以接收不同数据类型的参数,因此派生出来的函数原形多达 300 多个。 2、 实用库:库函数以“glu”为前缀,包含有 43 个函数。这部分函数通过调用核心库的 函数,为开发者提供相对简单的用法,实现一些较为复杂的操作。如:坐标变换、纹理映射、 绘制椭球、茶壶等简单多边形。 3、 辅助库:库函数以“glu”为前缀,包含有 31 个函数。这部分函数提供窗口管理、输 入输出处理以及绘制一些简单三维物体。 OpenGL 中的基本库和实用库可以在所有的 OpenGL 平台上运行,而 OpenGL 中的辅助 库不能在所有的 OpenGL 平台上运行。OpenGL 有极好的可移植性,可在各种环境下运行,
-2-

中国科技论文在线
从 PC 到工作站,从 Macintosh 系统机到巨型机均可工作[3]。

http://www.paper.edu.cn

4.STL 文件读取与显示
4.1 数据结构定义
根据 STL 文件的 ASCⅡ格式特点,STL 三维模型文件由一系列三角面片构成,每个三 角面片由三维空间中对应的三个顶点及其构成的平面的法向矢量组成。 采用如下全局变量的 形式分别定义顶点和法向量。 typedef struct tagPoint3D { double x;//存储顶点 x 坐标; double y; //存储顶点 y 坐标; double z; //存储顶点 z 坐标; }CPoint3D;// //存储 STL 中的面片顶点坐标; typedef struct tagVector3D { double dx; //存储法向量 x 坐标; double dy; //存储法向量 y 坐标; double dz; //存储法向量 z 坐标; }CVector3D; //存储法向量坐标; 在 STL 文件中,三角面片是构成文件的基本单位,定义类 CTriClass 存储单位三角面 片,结构如下: class CTriClass : public CObject { public: CPoint3D vex[3]; CVector3D normal; public: CTriClass(); virtual ~CTriClass(); virtual void Serialize(CArchive&ar);//串行化存取; }; MFC 中的串行化是一种对对象进行文件 I/O 操作的机制。一个对象能够将状态信息 存储到文件或其他存储介质中, 也可以读取预先存储的对象的状态信息, 并动态建立对象[4]。 CObjict 类已经提供了对串行化的支持, 因此由其派生出来的 CTriClass 类都很好地支持了该 机制,而这些类的对象都是可串行化对象,具体算法如下: void CTriClass::Serialize(CArchive &ar) { if(ar.IsStoring()) { ar<<normal.dx<<normal.dy<<normal.dz; …… }

-3-

中国科技论文在线
}

http://www.paper.edu.cn

3.2 STL 文件读取
MFC 中提供的 CTypedPtrArray 类可以消除由于指针类型错误搭配而引起的编译问题, 本文采用如下定义 CTypedPtrArray 类的一个对象 myTriList 作为三角面片的存储数据链。 class myOpenGL { public: CTypedPtrArray<CObArray,CTriChip*>myTriList; public: …… BOOL LoadSTLFile(LPCTSTR stlfile); }; 利用 C 语言中提供的 fscanf( FILE *stream, const char *format [, argument ]... )函数实现 STL 文件的导入,并存储在 myTriList 数据链中,具体算法如下: myOpenGL::LoadSTLFile(LPCTSTR stlfile) { FILE* file; int type=0; if((file=fopen(stlfile,"r"))==NULL) return FALSE; char str[100]; CTriClass* tri=NULL; while(fscanf(file,"%s",str)==1) { if(strncmp(str,"normal",6)==0){ tri=new CTriClass(); fscanf(file,"%lf%lf%lf",&(tri->normal.dx),&(tri->normal.dy),&(tri->normal.dz)); fscanf(file,"%*s %*s"); fscanf(file,"%*s%lf%lf%lf",&(tri->vex[0].x),&(tri->vex[0].y),&(tri->vex[0].z)); fscanf(file,"%*s%lf%lf%lf",&(tri->vex[1].x),&(tri->vex[1].y),&(tri->vex[1].z)); fscanf(file,"%*s%lf%lf%lf",&(tri->vex[2].x),&(tri->vex[2].y),&(tri->vex[2].z)); Add(tri); } } return TRUE; }

3.3 STL 文件的可视化显示
在 OpenGL 函数库中, 提供了绘制几何模型的丰富的函数, 提供了直接渲染三角面片的 函数 glBegin(GL_TRIANGLES)和 glEnd(), 因而利用 OpenGL 来实现 STL 三维模型的真实感 图形显示[5],更加具有优势,具体算法如下: void CRPSupportDesignView::drawSTL(double n0,double n1,double n2,double v00,double v01,double v02,double v10,double v11,double v12,double v20,double v21,double v22) {
-4-

中国科技论文在线
glBegin(GL_TRIANGLES); glNormal3d(n0,n1,n2); glVertex3d(v00,v01,v02); glVertex3d(v10,v11,v12); glVertex3d(v20,v21,v22); glEnd(); }

http://www.paper.edu.cn

基于 MFC 的 OpenGL 应用程序开发的文献很多,本文就不再叙述,利用文献[6]的方法 对 OpenGL 应用程序进行初始化,并在视图类里对 STL 数据进行导入,具体算法如下: void CRPSupportDesignView::display() { glClearColor((float)red/255,(float)green/255,(float)blue/255,1); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glShadeModel(GL_SMOOTH); glMatrixMode(GL_MODELVIEW); if(MyFlag==1){ for(int i=0; i<pSTLModel->m_TriList.GetSize();i++) drawSTL(pSTLModel->m_TriList[i]->normal.dx,pSTLModel->m_TriList[i]->normal.dy, pSTLModel->m_TriList[i]->normal.dz,pSTLModel->m_TriList[i]->vex[0].x,pSTLModel->m_T riList[i]->vex[0].y,pSTLModel->m_TriList[i]->vex[0].z,pSTLModel->m_TriList[i]->vex[1].x,p STLModel->m_TriList[i]->vex[1].y,pSTLModel->m_TriList[i]->vex[1].z,pSTLModel->m_TriL ist[i]->vex[2].x,pSTLModel-> m_TriList[i]->vex[2].y,pSTLModel-> m_TriList[i]->vex[2].z);} glFlush(); } 另外,利用 OpenGL 函数库中的 glRotatef,glTranslatef, glScalef 可以实现 STL 三维模型 的旋转、 平移和缩放功能; 运用 glLightfv, glColorMaterial, glMaterialfv, glTexCoord, glTexEnv 等方法可以对三维模型进行光照、纹理等渲染[7-8]。

5.实例
本文在对 STL 文件特点进行分析的基础上,利用 Visual C++6.0 和 OpenGL 编程技术对 STL 文件进行了可视化验证,开发了 RP-SupportDesign 软件,为了验证该软件显示 STL 文 件的实际效果,对从 CATIA V5 中导出的大量 STL 文件进行了测试,如图 3 所示,取得了 良好的可视化效果。

图 3 RP-SupportDesign 软件 STL 文件显示

-5-

中国科技论文在线
6.结束语

http://www.paper.edu.cn

STL 文件的可视化研究是对三维模型后续操作和软件二次开发的前提和基础。 本文通过 对 STL 文件数据格式的研究,以 VC++作为开发平台,利用 C 语言中的文件操作方法和 OpenGL 函数库对 STL 文件可视化进行了研究和实现,并对 RP-SupportDesign 软件进行了 实验测试,取得了良好的效果,为进一步对 STL 文件进行数据处理及其它相关领域的研究 做了必要的前期准备。鉴于 STL 文件的实用性和 OpenGL 函数库的强大功能,本文具有一 定的使用价值和应用前景。 参考文献
[1] 郎兴华,郭阳,林亨,张伟.STL 模型的立体显示及其多屏拼接[J].系统仿真学报,2004,16(4):14-19 [2] 吴斌,毕丽蕴.OpenGL 编程实例与技巧[M].北京:人民邮电出版社,1999 [3] 范玉军,冯秀娟,周建华.CAD 软件设计[M].北京:北京航空航天大学出版社, 1996 [4] 孔鹏.Visual C++ 6.0 完全自学手册[M].北京:机械工业出版社,2007 [5] 郭兆荣.Visual C++ OpenGL 应用程序开发[M].北京:人民邮电出版社,2006 [6] 胡海欧.基于 MFC 的 OpenGL 应用程序开发,中国科技论文在线,200905-835 [7]TheKhronosGroup.OpenGLOverview.http://www.opengl.org/about/overview/#1,2009.5.26 [8] ALVERSON G,EULISSE G,MUZAFFAR,etal. A high-performance 2D and 3D visualization system[J].Nuclear Instruments & Methods in Physics Research(A),2004,534(11):143-146

The research of STL files visualization based on OpenGL
Hu Haiou
Department of Computer Science,Northern Jiaotong University, Beijing, PRC (100044) Abstract OpenGL is a 3D model library; it has the excellent capability of third dimension graphics drawing and the comprehensive use of CAD, big games and emulational software development. STL is a data format of 3D and made up of many triangle facets. As a precondition of model data processing and software secondary development, the research of STL files visualization is very important. This paper firstly analyses STL files and choose a laconic structure and uses OpenGL strong functions to research of STL files on the flat of Visual C++ 6.0. After a STL data model is read, using OpenGL can easily render model, transform visual angle, zoom display sizes and etc. With using fscanf function of C language, the method gets better effect and has the practicality value. Then, this paper develops the software based on STL files; it will be benefit to post-processing and provide powerful sustains to software secondary development. Lastly, this paper designs experimental test with a lot of STL files and gains anticipative aim. Keywords: OpenGL; STL files; Visualization 作者简介: 胡海欧, 1983 年生, 男, 北京航空航天大学硕士研究生, 研究方向: 汽车 CAD/CAM 制造、快速成形软件开发、计算机图形学研究。

-6-


赞助商链接
相关文章:
文章1-STL模型文件的快速读取和显示(20150105)
图 1 OPENGL 显示模型图 4 结论本文对 STL 模型文件的可视化进行研究,基于 VC 平台和 OpenGL 实现了模型可视化, 使用这种方法可以快速处理大数据量 STL 文件信息...
STL文件的读取显示
VC++和 基于 VC++和 OpenGL 的 STL 文件读取 显示 VC++和 基于 VC++和 OpenGL 的 STL 文件读取显示摘要: 摘要:STL是三维模型常用的文件格式。对STL文件...
基于STL文件的三维测量 科研实践、创新设计、课外学科...
且被广泛应用于科学计算可视化、计算机动画、逆向工程、虚拟现实及快速 成型等技术...基于OpenGL的 STL文件可... 6页 免费 海量STL文件的快速读取与... 5页 1下...
基于OpenGL的游戏设计
人们对计算机可视化技术的研究已经历了一个很 长的历程,而且形成了许多可视化工具...OpenGL 强有力的图形函数不要求开发者把三维物体模型的数据写成固定的 数据格式...
STL文件上有限元网格的生成
基于OpenGL的 STL文件可... 6页 免费 OpenGL入门教程(精) 94页 1下载券S...CAD 软件可以产生 STL 文件, 且这些大体上用作实现样机研究和绘制 图形的目的...
基于MFC和OpenGL三维图形的开发
选择 File|New 菜单项,新建一个基于对话框的项目文件 MyDlgOpenGL; 2.2 修改...仿真及水土结构计算工作; 徐明毅,博士后,主要研究方向:结构力学及计算机可视化仿真...
基于OpenGL小游戏开发及实践
基于OpenGL小游戏开发及实践_计算机软件及应用_IT/...人们对计算机可视化技术的研究已经历了一个很长的...数据格式, 这样开发者不但可以直接使用自己的数据,...
基于VC++可视化图像处理设计报告
VC++的可视化图像处理系统报告 基于 VC++的可视化图像处理系统报告 作专年学日...数据,然后可以将其绘制在 DC 上(GDI),或是生成纹理对象(3D:OpenGL/Direct3D)...
基于OpenGL的三维地貌演绎实现
龙源期刊网 http://www.qikan.com.cn 基于 OpenGL 的三维地貌演绎实现 作者:...演绎数学模型,使用可视化的图形信息表示是在进 行地貌演绎时亟待研究与解决的重要...
基于OpenGL的三维地貌演绎实现
龙源期刊网 http://www.qikan.com.cn 基于 OpenGL 的三维地貌演绎实现 作者:...演绎数学模型,使用可视化的图形信息表示是在进 行地貌演绎时亟待研究与解决的重要...
更多相关标签: