三角网格文件OFF的格式分析及OFF到STL的转化①
2016-06-15沙晨明申作林申可心哈尔滨理工大学软件学院哈尔滨50040大庆师范学院机电工程学院大庆637
沙晨明,申作林,申可心(哈尔滨理工大学 软件学院,哈尔滨 50040)(大庆师范学院 机电工程学院,大庆 637)
三角网格文件OFF的格式分析及OFF到STL的转化①
沙晨明1,申作林1,申可心2
1(哈尔滨理工大学 软件学院,哈尔滨 150040)
2(大庆师范学院 机电工程学院,大庆 163712)
摘 要:OFF文件格式是一种用三角网格描述三维模型的常用格式之一,对OFF文件格式的详细分析研究是读取、显示及操作OFF文件的前提条件.针对目前OFF文件的简单分析及处理没有形成一定系统的规范和思路这一问题.以Visual C++6.0为开发平台;以MFC为基础进行可视化界面设计;利用C++语言的标准IO库实现对OFF文件进行读取和写入操作;应用OpenGL编程技术实现对OFF文件的显示;建立OFF文件的读取和显示系统,通过实验验证读取和显示效果,并利用格式转化算法完成OFF文件到STL文件的转换.
关键词:OFF; STL; 格式转化; 三角网格模型; OpenGL
1 引言
三角网格模型是指由三角形网格组成的表面模型,由于三角网格模型的处理简便快捷、可视化效果好,表现能力佳,因而被视为描述三维立体模型的常用手段之一.近年来随着计算机图形学的迅猛发展,三角网格模型已广泛应用于三维动画、电子商务、计算机辅助设计、工业制造、数字娱乐等诸多方面[2].尤其是随着3D打印这一具有现代化工业革命性质的技术蓬勃兴起,三角网格模型更成为三维立体模型表示方法的焦点.目前STL文件已成为快速原型技术领域最为常用的文件格式和事实上的接口标准,OFF文件也大量的被用于三维模型表示等三维图像几何处理领域中[6].OFF(Object File Format)文件格式是描述三维网状物对象的文件格式,常用来表示基于三角网格描述的三维模型,一般通过现实采点取样获得数据,通过一定的预处理和一定的简化操作,再通过一定的存储手段形成现有的OFF文件.对OFF文件格式的分析是进行OFF文件读取、显示和操作的前提,更是数字图像处理的关键.目前对于OFF文件的简单分析处理没有形成一定系统的规范和思路.本文将对OFF的文件特点进行深入的分析并在Visual C++ 6.0平台上,利用MFC进行图形界面设计,利用C++标准IO库结合OpenGL编程技术实现对OFF文件的读取和显示.同时通过深入分析,利用格式转换算法完成OFF文件到STL文件的转换研究.
2 OFF文件格式的结构
利用现有的计算机图形学知识,充分了解基于三角网格信息描述的三维立体模型数据文件格式,理解三维立体模型的数据内部组织结构是对三维立体模型处理的基础和关键[5].
OFF文件是一种利用点和边组成许多空间小三角形面片来逼近三维模型表面的一种数据文件,这种逼近方法也是大多数三维网格文件所采用的图元表示法,利用三角形可以近似逼近出几乎所有的三维立体模型.OFF文件的数据是采用ASCII格式存储的,包括定义创建物体表面的平面多边形的顶点集合、以组成三角面片的三个点为元素的三角形集合.每个OFF文件格式都是OFF关键字开头的,第二行则是包括三维物体的顶点数量、三角面片数量和边数量,其中边的数量可以安全的省略.之后的数行是顶点和表面的表示,对于顶点是用X,Y,Z坐标值表示并记录的,而表面则可以用点的索引来表示.
一个具体的OFF文件如下,图一为其显示结果:
通过对OFF文件格式的分析可知,每一个点的坐标表示了其三维空间的位置,点之间的索引关系表示了立体模型的拓扑序列.此外用ASCII码表示的OFF文件可读性强,以点集和面集表示思路简单清晰,这方便了我们的进一步读取并处理数据.
3 OFF文件的读取及显示操作
本文通过对OFF文件格式和内部数据组织结构的分析,以MFC作为处理三维模型的基础,在Visual C++ 6.0平台下使用C++语言,通过IO流操作实现文件读取并存储,应用OpenGL编程技术实现OFF文件的三维图形显示.
由OFF文件的存储格式可知,我们可以从中读取出三维模型的顶点以及用顶点索引表示的一系列小三角面片,对于每个三角面片的边来说,我们可以进行相应的计算,所以边数可以安全的省略.
3.1顶点和三角面片
对于三维立体模型而言,无非是一系列顶点和三角面片,所以对于这两种基本组成元素而言,其定义是描述三维模型的前提条件.
设顶点集合
每个顶点都有一个唯一标识的下标,下标从0到n,而每个点又可定义为:
所以有点集
设面片集合
每个三角面片是有三个点组成,所以有映射
其中
则面片集为
3.2网格模型
由以上分析可知,网格模型是由点集和三角面片集合组成,所以我们只需加入相关表示信息即可表示网格模型,完成网格模型的定义.
设网格集合为
其中V包括组成网格模型的全部顶点,且每个顶点都有唯一的索引,索引满足从0到n,F包括由3个V上的点所组成的元素.
3.3文件读取
由于OFF文件的可读性强,可用一般的文本编辑器打开,所以通过C++标准IO库的输入输出流来实现OFF文件的读取功能.
通过使用C++标准库的FILE类创建文件指针,指向欲打开的OFF文件; 使用fopen()函数进行文件打开并通过返回值是否为NULL判断成功与否; 使用fscanf()函数实现字符的读入功能并用strcmp()进行字符的匹配; OFF文件中存在三维模型顶点、面片的数目,利用此信息通过一定的循环方式逐行读入字符并存储数据.
读取方法流程如图2所示.
图2 读取方法流程图
3.4文件显示
OpenGL编程技术的使用能更好的实现三维模型的立体感和真实感,在绘图方面更加有优势[1].在OpenGL提供的API中,有一系列画图的函数,在这里我们使用指定图元为三角面片的绘图.
glBegin(GL_TRIANGLES)函数指定了以下为图元列表的开始; glEnd()函数指定了图元列表结束; 在glBegin()与glEnd()之间使用三个参数的glVertex3f()函数绘制.
4 OFF到STL的格式转换
STL(stereo lithographic)文件格式由3D Systems公司于1987年推出,同样也是采用三角形面片进而离散地近似表示三维模型,目前STL已成为快速原型技术领域最为常用的文件格式和事实上的接口标准[2].研究各类三维网格图形文件格式之间的转化对于发展和扩充计算机图形学领域来说,具有非常重要意义[4].在之前分析的基础上,我们已经对OFF文件的内部数据结构有了清晰的了解,它主要描述了点集合以及用点索引表示的三角面片集合.对于STL文件来说,它是由一系列无序的三角面片组成,而三角面片是直接用点来表示的,没有用来反映三角面片之间的拓扑关系,并且每个三角面片都与相邻的三角面片之间共用两个顶点[3].根据两者之间的联系与区别,本小节设计并完成OFF文件到STL文件的转化.
4.1STL格式文件的分析
如下为一个简单的STL文件,以此为例进行分析.
第一行以solid关键字开头,可指出文件路径和文件名,第二行则以facet normal关键字指出指向实体外部的三角面片法向量的信息,随后从outer loop开始到endloop结束为描述三角面片的三个顶点,endfacet表示本三角面片表示结束,endsolid Object01声明了STL的结尾.
4.2OFF文件与STL文件的联系与区别
从OFF文件当中我们可以很容易的找到与STL文件的一些联系和区别.
① 点的表示OFF文件和STL文件均可用正常浮点数及科学记数法表示,如+0.75、-0.52628e+00.
② OFF文件中存在表示顶点个数和三角面片及边数的信息,而STL文件没有明确给出,需要后期计算.
③ OFF文件用顶点的索引表示三角面片,而STL文件之间直接用关键字facet罗列表示.
④ OFF文件并没有指出指向实体外部的三角面片法向量的信息,而STL文件恰好给出了这样的信息.
通过以上分析我们可以发现,利用OFF文件提供的表示三角面片的索引信息,通过使用向量法,可求出表示STL文件所用的法向量.
4.3转换算法的实现
若以索引方式表示的三角面片为:
n1 n2 n3的空间坐标分别为:
则设在该三角面片上相交的两条直线的向量为:
由三角面片的法向量定义可知,其法向量垂直于该三角面片上任何两条相交的直线,则设该三角面片的法向量为n且有:
根据以上公式继续推导有:
随后将x,y,z中的任意一个赋予一便于计算的定值,则可求出法向量n.利用单位化向量公式可进一步求出一定精度下的单位化法向量,具体为:
求出法向量后,我们可以利用C++ 标准IO库的进行文件的写入.按照STL文件的格式,依此写入开始定义文件的关键字、指向实体外部的三角面片法向量、表示三角面片的三个顶点信息、结束定义文件的关键字即可完成从OFF文件到STL文件的转化.
5 实验结果
根据以上分析,使用MFC编程技术和OpenGL提供的函数接口,在Visual C++ 6.0平台上进行实验,以计算机模拟合成的OFF文件为数据材料,进行读取显示并实现了预期效果.图3为显示效果图.
图3 模型显示效果图
6 结语
本文以理清OFF文件内部存储结构、读取及显示OFF文件为目的,通过系统的分析、处理、实验等操作实现了相应目的,并研究转换算法,完成了从OFF文件到STL文件的转换.这方便了对OFF文件相关研究的扩展,为进一步对OFF文件进行冗余数据处理、三维网格图形的形变操作、数据结构算法的应用、相应的图形处理的探索打下了基础.虽然对OFF文件的分析已经有了系统的研究,但是在今后对于OFF文件的快速读取、显示、处理方面仍有待于我们进一步的研究和发现.
参考文献
1严梽铭,钟艳如.基于VC++和OpenGL的STL文件读取显示.计算机系统应用,2009,18(3):172–175.
2卫炜,周来水,张丽艳.海量STL文件的快速读取与显示.机械科学与技术,2006,25(8):935-938,975.
3朱虎,杨忠凤,张伟.STL文件的应用与研究进展.机床与液压,2009,37(6).
4罗东.三维模型表现形式转换技术及存储格式定义的研究与实现[硕士学位论文].西安:西北大学,2010.
5黎华,肖伟.几种三维模型文件在OpenGL中的输入与处理.物探化探计算技术,2007,29(1):83–86.
6丁丽.基于OpenGL的三维模型的可视化研究[硕士学位论文].济南:山东大学,2009.
Format of Triangular Mesh File OFF and Transformation of STL to OFF
SHA Chen-Ming1,SHEN Zuo-Lin1,SHEN Ke-Xin2
1(School of Software,Harbin University of Science and Technology,Harbin 150040,China)2(School of Mechtronics Engineering,Daqing Normal University,Daqing 163712,China)
Abstract:OFF (Object File Format)is a kind of common format for three-dimensional model described with triangular mesh.The research of OFF is the foundation condition for reading,displaying and other operations.Nowadays,it doesn’t have a set of standards and specifications about the simple analysis of OFF.First of all,the software is based on Visual C++ 6.0 developing platform and uses MFC to achieve a visual interface.In addition,we can read and write the OFF file taking advantage of C++ standard I/O library and the view of OFF file is implemented by using OpenGL technology.In the end,we have a system that realizes the functions of reading and displaying for OFF file while it completes the transformation of file from OFF to STL with format conversion algorithms.
Key words:OFF; STL; format transformation; trianglular mesh model; OpenGL
基金项目:①黑龙江省大学生创新创业训练计划项目(201510214027)
收稿时间:2015-07-17;收到修改稿时间:2015-09-16