您好,欢迎来到知库网。
搜索
您的当前位置:首页基于OpenGL的STL文件剖分及填充显示技术研究

基于OpenGL的STL文件剖分及填充显示技术研究

来源:知库网
维普资讯 http://www.cqvip.com

2008年第1期 铸造设备研究 2008年 2月 RESEARCH STUDIES ON FOUNDRY EQUIPMENT Feb.2008№1 ・研究生论文・ 基于OpenGL的STL文件剖分及填充显示技术研究 牛晓峰 ,侯华 ,徐宏 ,毛红奎 (1.中北大学电子与计算机科学技术学院,山西太原030051;2.中北大学材料科学与工程学院,山西太原 诤030051) 摘要:STL文件格式是快速成形领域中描述三维实体模型的标准文件格式。本文基于OpenGL技术,对 STL文件分割过程中STL文件分割算法、截面轮廓线的提取算法、利用OpenGL的镶嵌技术实现截面填充显示 和三角化算法的关键问题进行了详细的论述。 关键词:快速成型;sTL模型;OpenGL;三角415;分割 中图分类号:TP391 文献标识码:A 文章编号:1004—6178(2008)01—0022—04 Research on STL Dividing Model Display Technique Based on OpenGL NIU Xiao-f ̄g,,HOUUllafi2 XU Hol ,MAO Hong-kuiz (1.College ofElectron andComputerScience Technology,North Univers ofChint ̄Taiyuan Shanxi 030051,Chintg 2.C0 Material Science and Engineering,North Univers ofChina,Taiyuan Shanxi 030051,China) Abstract:STL file is the standard file format of Rapid Prototype.A solid dividing algorithm based on STL file format is brought forward in this paper.The key problems of dividing STL file,including dividing STL file,creating cross-section profile,processing the triangle facet divided and triangulation algorithm for cross—section profile and SO on aye discussed. Keywords:rapid prototyping,STL model,openGL,triangulation,dividing 快速成型技术是一种新型的先进制造技术,是 并能在网络环境下以客户/月艮务器模式工作。是专业图 通过逐层的填加材料来制造零件。STL文件格式已 形处理、科学计算等高端应用领域的标准图形库。 经成为快速成形领域中的描述三维实体模型的标 准文件格式。STL文件是通过对CAD实体模型或曲 I SrI'L文件分割基本思路 面模型进行表面三角化离散得到的,相当于一种全 从本质上讲,对STL文件进行分割,就是用一 由小三角形面片所构成的多面体模型。从几何上 个平面交割STL模型。计算该平面与STL模型中三 看,它是用众多三角形小平面来形成三维形体的表 角形面片的相交情况。交割后STL文件变为二个独 面,每个三角形面片用三个顶点表示。STL文件能够 立的STL文件,此时的STL文件均缺少一个表面, 正确描述三维模型,必须遵守一定的规范。共顶点 是不完整的STL文件。故还要计算一系列封闭的截 规则:每相邻的2个三角形只能共享2个顶点即一 面的轮廓线,并把缺少的表面补上,形成完整的 个三角形的顶点不能落在相邻的任何一个三角形 STL。补全不完整STL文件有两种方法。一种方法是 的边上。取向规则:对于每个小三角形平面的法向 采用OpenGL中的镶嵌技术,该法只适用一次分割; 量必须由内部指向外部,小三角形三个排列顶点的 另外一种是对截面轮廓进行三角化处理。并把三角 顺序同法向量符合右手法则。 化的结果加到分割后生成的两个新的STL文件中 本文基于OpenGL技术.实现STL文件剖分及填 去,此法可进行多次分割。 充显示。OpenGL是Open Graphics Library(开放性图 形库)的缩写,是一套三维图形处理库,也是该领域的 2 STL文件分割 工业标准。OpenGL被设计成于硬件。于窗口 2.1.三角形面片和平面的关系 系统的,在运行各种操作系统的各种计算机上都可用, 平面交割STL模型后,把一个STL文件一分为 二,三角形面片和平面的关系有以下六种。第一种如 收稿日期:2007—1 1-21 图1,是三角形面片和平面不相交的情况;第二种如图 作者简介:牛晓峰(1982一),男,硕士生,主要研究方向:计算机应用 计算机图形学。 2是三角形面片的—个顶点在平面上。另两个顶点在 基金项目:中北大学院基金(200816) 平面的同一侧的情况;第三种如图3。是三角形面片的 维普资讯 http://www.cqvip.com

2008年第1期 一牛晓峰,等:基于OpenGL的sTL文件剖分及填充显示技术研究 铸造设备研究 个顶点在平面上,另两个顶点在平面的两侧的情 况;第四种如图4,是三角形面片的两个顶点在平面上 的情况;第五种如图5,是三角形面片的三个顶点在平 面上的情况;第六种如图6,是三角形面片的三个顶点 均不在平面上,面片有两条边和平面相交的情况。 float STLVertex3f3[3];,/三角形面片顶点3 struct oneface*forward;//指向前—个三角形面片 structoneface*next; bool face_//指向下—个三角形面片 ask; //三角形面片的访问标志 //三角形面片顺序号 int nun; int nextnum[3]; _//相邻三角形面片邻边的 图1 三角形面片和平 图2三角形面片的一个顶 面不相交 点在平面上,另两个 顶点在平面的同一侧 图3三角形面片的一个 顶点在平面上.另两 图4三角形面片的两 个顶点在平面 两侧 个顶点在平面上 / \、 > √ 图5三角形面片的三个顶 图6三角形面片的三个 点在平面上 顶点均不在平面上,面片 有两条边和平面相交 2.2分割算法 分割就是用一个特定平面将一个空间物体分 块。实际上是平面与空间物体的求交过程。首先使 用结构体双向链表来存储三角形面片的数据信息。 有利于插人和删除运算,数据结构体如下: typedef struct oneface { float STLNormal3f[3];,/三角形面片的法向量 float STLVertex3fl[3];//三角形面片顶点1 float STLVertex3f2[3];//三角形面片顶点2 权值及邻接面片的共享 ||迦青号 lFace; 具体的分割算法如下: 1)读人一个铸件的三维实体STL文件,保存到 相应结构体双向链表source_face中。并用计算机显 示出待分割的实体。 2)建立两个新的结构体双向链表left_face和 irght face,分别用于保存位于切割平面之左、之右的 三角形面片。 3)根据切割要求,选一个坐标值为m的平面(x 平面,Y平面或Z平面)作为切割面。 4)读出保存在结构体双向链表source_face中的 第一个三角形面片的信息。 5)分割平面 6)找保存在结构体双向链表source_face中的下 一个三角形面片的信息,若找得到则返回第五步, 找不到则结束。 2.3分割平面 在交割中需要判断三角形面片和切割平面的 关系,如果三角形面片和切割平面的关系为第一 种,第二种或第四种,则根据三角形面片和切割平 面的相对位置(在切割平面的右边还是左边),把三 角形面片复制后放人新的结构体双向链表left_face 或right_face中:如果这个三角形面片和切割平面 的关系为第五种。则把三角形面片复制两份后分别 放人新的结构体双向链表left_face和right_face中。 如果这个三角形面片和切割平面的关系为第三 种,则把三角形面片A沿切割平面分成 。C两个三 角形面片,并根据 ,C和切割平面的相对位置,把三 角形面片 和三角形面片c复制后分别放人新的结 构体双向链表left_face或right_face中(图7)。 如果这个三角形面片和切割平面的关系为第 六种,则把三角形面片A分成 ,C。D三个三角形 面片,并根据 ,C,D和切割平面的相对位置,把三 角形面片 ,三角形面片C和三角形面片D复制后 分别放人新的结构体双向链表left_face或right_face 中(图8)。 3不完整STL的处理方法 维普资讯 http://www.cqvip.com Feb.20o8№l 铸造设备研究 2008年第1期 / A ’‘}cutline; 根据STL文件的共顶点规则,每一个三角形面 \/ / 片只能由三个邻接的三角形。由此建立的三角形面 片邻接关系[ ]如图9所示。 三角形面片1 相邻三角形面片0H相邻三角形酣1 H相邻三角形酣2 三角形面片2 相邻三角形面片0卜_叫相邻三角形面片1 l rl相邻三角形面片2 / 图7当三角形面片的一个顶点在平面上。另两个顶点 在平面的两侧时的分割情况 / A -. -\ √ / ● 、 ’、 . \. 图8当三角形面片的三个顶点均不在平面上。 面片有两条边和平面相交时的分割情况 3.1镶嵌技术 使用结构体双向链表来存储截面轮廓线中每 一条线段的数据信息,数据结构体如下: typedef struct cutline { … … lfoat STLVertex3fA[3]; //线段顶点1 lfoat STLVertex3fB[3]; //线段顶点2 切割平面相交的交线是截面轮廓线,通过三角 形面片的邻接关系表,形成了一个三角形之间的有 向加权图。其中权值为邻接面片的共享边的序号。 其具体算法如下所示: 1)从所有的三角形面片中找到一个在切割范 围之内的三角形面片。 2)从这个三角形面片出发,搜索其相邻的三个 邻接三角形。并通过权值得到与邻接三角形面片之 间的共享边。 3) ̄lJ断这条边是否在切割范围之内,如果是则 计算出交点坐标,同时设置三角形访问标志 face—ask=true。这样依次追踪,直到回到第一个被访 问的三角形面片,得到一条有向封闭的轮廓线。 4)重复上述过程,直到所有轮廓线计算完毕。 为了使OpenGL的速度尽可能快,所有的几何 图元都必须是凸的,但OpenGL工具函数库包含了 一些函数,可以自动把凹多边形分解为更小的.处 理效率更高的OpenGL图元。这种对多边形进行分 解的过程叫做镶嵌。 ‘ 镶嵌是通过镶嵌器来发挥作用的,以下是镶嵌 器的使用步骤[ ]: 1)创建镶嵌器对象。 2)设置镶嵌器的状态和回调函数。 3)开始一多边形。 4)开始一条轮廓线。 5)向镶嵌器对象输入指定这条轮廓线的顶点。 6)结束这条轮廓线。 7)如果还有更多的轮廓线,回到步骤4。 8)结束这个多边形。 //仓0建镶嵌器对象 pTess=gluNewTess(); //设置镶嵌器的状态和回调函数 gluTessCallback(pTess,GLU_TESS_BEGIN, (void(stdcall )())glBegin); gluTessCallback(pTess,GLU_TESS_END, (void(stdcall )())glEnd); 维普资讯 http://www.cqvip.com 2008年第1期 牛晓峰,等:基于OpenGL的STL文件剖分及填充显示技术研究 gluTessCallback(pTess,GLU_TESS—VERTEX, (void(stdcall )())glVer tex3dv); 3)判断当前多边形其余 L11Lk2或L12Lk2相交,若是,转 //如何计算填充和开放区域 gluTessProperty(pTess,GLU_TESS_WIND ING_RULE,GI U_TESS_WIND ING_ODD); //开始多边形 gluTessBeginPolygon(pTess,NULL); //第一条轮廓线 gluTessBeginContour(pTess); for(i=0;i<第一条轮廓线上点的个数;i++) gluTessVertex(pTess.轮廓线上第i个点的信 息,轮廓线上第i个点的信息); gluTessEndContour(pTess); //第二条轮廓线 gluTessBeginContour(pTess); for(i=O;i<第二条轮廓线上点的个数;i++) gluTessVertex(pTess.轮廓线上第i个点的信 息,轮廓线上第.i个点的信息); gluTessEndContour(pTess); //绘制其它所有的轮廓线 //完成这个多边形的所有操作 gluTessEndPolygon(pTess); //不再需要镶嵌器对象 gluDeleteTess(pTess); gluTessProperty(pTess,GLU_TESS_WIND INGRULE,GLUTESSWINDING_—__ODD)中的 GLU_TESS_WINDING_ODD表示多边形内部奇数 条轮廓线所包围的区域内的所有的点都是填充的。 3.2三角化处理 为准备对分割后的STL文件再进行多次分割, 故对截面轮廓进行三角化处理.并把三角化的结果 加到分割后生成的两个新的STL文件中去: 使用Delaunay三角剖分法,其具有简洁,通 用等特点。规定沿面上任一条边前进时,其左侧 定义为图形区域,右侧定义为非图形区域, ̄091, 环按逆时针走向,而内环按顺时针走向。具体算 法如下[’J: 令该多边形的边数为Ⅳ.第K条边的起点序号 为Lk1.终点序号为Lk2 1)若Ⅳ=3,则该多边形本身是一个三角形,剖 分结束;否则令K=I,转入(1)。 2)令K=K+I,若Lk2不在有向线段L11一> 12 之左,转入(2),否则转入(3)。 (4)。 4)保存节点Lk2至候选节点 转入(5),否则转入(2)。 5)从候选节点列表中求出与 成的外接圆最小的节点L02.则: L02必然构成一个有效的Delauna 当前多边形作如下修正: ①若线段L11L02及L11L02 形的边界线段.则令N=N+I.Ln L12=L02,转入(1)。 ②若线段L11 L02(或L12LO 的第m条边,而线段L12L02(或上 多边形的边,则令L11=L02(或 Lnl,Lm2=Ln2,N=N-1,转入(1)。 ③若线段L1 1L02和L12L02 形的第m边和第 边.则将线段 第 边从当前多边形中删除,N=A lO为STL文件。 a)完整的STL文件 b) 图10应用实例 4结论 本文通过判断三角形面片和 关系实现了STL文件的分割.在卒} 件时采用了两种方法.一种是采,F 嵌技术.该法只适用一次分割;另 轮廓进行三角化处理,并把三角 后生成的两个新的STL文件中去 分割 参考文献: [1]赵吉宾,刘伟军,王越超.基于STL文 [J].机械科学与技术,2005,24(2):131 『2]Richard S Wright.OpenGL超级宝典( 民邮电出版社.2005. [3]丁永祥,夏巨谌,王英,等.任意多边珏 『J].计算机学报,2004,l7(4):270~271 

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- zicool.com 版权所有 湘ICP备2023022495号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务