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

基于OpenGL STL 文件可视化研究

1.引言

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

2STL 文件格式

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


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


STL 文件的二进制格式文件较小、易于传输,所以应用较为广发。二进制格式文件的前84 字节为头记录,其中80 字节用来描述零件名、作者姓名和一些有关文件的评述;4 个字节说明三角面片数。接下来对每个三角形面片用50 个字节来存放三角形的法向矢量和三个顶点坐标值,每个坐标值占用4 个字节,共48 字节,最后两个字节用以备特殊用途。

 

STL 文件在机械工业领域中有广泛的应用,主要因为有以下的有点:

1、STL 文件生成的简单性。几乎所以CAD 软件均具有输出STL 文件的功能,同时还

可以控制输出的STL 模型的精度。

2、输入文件广泛。大多数三维几何模型都可以通过表面的三角化生成STL 文件。

3、具有简单的分层算法。由于STL 文件数据简单,所以分层算法相对要简单的多。

4、模型易于分割。当成型的零件很大而很难在成型机上一次成型时,这时应该将模型

分割为多个小的部分,分别制造,模型分割对于STL 文件来说相对简单的多。

3OpenGL 概述

OpenGL(Open GraphicLibrary,开放式图形库)是一个三维的计算机和模型库,在三维真实感图形制作中具有优秀的性能,广泛运用于三维CAD、大型游戏和仿真模拟软件的开发。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 有极好的可移植性,可在各种环境下运行,从PC 到工作站,从Macintosh 系统机到巨型机均可工作[3]。

4STL 文件读取与显示

4.1 数据结构定义

根据 STL 文件的ASCⅡ格式特点,STL 三维模型文件由一系列三角面片构成,每个三角面片由三维空间中对应的三个顶点及其构成的平面的法向矢量组成。采用如下全局变量的形式分别定义顶点和法向量。

typedef structtagPoint3D

{

double x;//存储顶点x 坐标;

double y; //存储顶点y 坐标;

double z; //存储顶点z 坐标;

}CPoint3D;// //存储STL 中的面片顶点坐标;

typedef structtagVector3D

{

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 voidSerialize(CArchive&ar);//串行化存取;

};

MFC 中的串行化是一种对对象进行文件I/O 操作的机制。一个对象能够将状态信息存储到文件或其他存储介质中,也可以读取预先存储的对象的状态信息,并动态建立对象。CObjict 类已经提供了对串行化的支持,因此由其派生出来的CTriClass 类都很好地支持了该机制,而这些类的对象都是可串行化对象,具体算法如下:

voidCTriClass::Serialize(CArchive &ar)

{

if(ar.IsStoring())

{

ar<<normal.dx<<normal.dy<<normal.dz;

……

}

}

3.2 STL 文件读取

MFC 中提供的CTypedPtrArray 类可以消除由于指针类型错误搭配而引起的编译问题,本文采用如下定义CTypedPtrArray 类的一个对象myTriList 作为三角面片的存储数据链。

class myOpenGL

{

public:

CTypedPtrArray<CObArray,CTriChip*>myTriList;

public:

……

BOOLLoadSTLFile(LPCTSTR stlfile);

};

利用C 语言中提供的fscanf( FILE *stream, const char *format [, argument ]... )函数实现

STL文件的导入,并存储在myTriList 数据链中,具体算法如下:

myOpenGL::LoadSTLFile(LPCTSTRstlfile)

{

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 三维模型的真实感

图形显示,更加具有优势,具体算法如下:

voidCRPSupportDesignView::drawSTL(double n0,double n1,double n2,double v00,double

v01,double v02,doublev10,double v11,double v12,double v20,double v21,double v22)

{

glBegin(GL_TRIANGLES);

glNormal3d(n0,n1,n2);

glVertex3d(v00,v01,v02);

glVertex3d(v10,v11,v12);

glVertex3d(v20,v21,v22);

glEnd();

}

基于MFC的OpenGL 应用程序开发的文献很多,本文就不再叙述。对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 所示,取得了良好的可视化效果。

6.结束语

STL 文件的可视化研究是对三维模型后续操作和软件二次开发的前提和基础。本文通过对STL 文件数据格式的研究,以VC++作为开发平台,利用C 语言中的文件操作方法和OpenGL 函数库对STL 文件可视化进行了研究和实现,并对RP-SupportDesign 软件进行了实验测试,取得了良好的效果,为进一步对STL 文件进行数据处理及其它相关领域的研究做了必要的前期准备。鉴于STL 文件的实用性和OpenGL 函数库的强大功能,本文具有一定的使用价值和应用前景。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值