基于OpenGL的实体真实感图形显示工具的开发 下载本文

内容发布更新时间 : 2024/5/1 12:31:40星期一 下面是文章的全部内容请认真阅读。

龙源期刊网 http://www.qikan.com.cn

基于OpenGL的实体真实感图形显示工具的开发

作者:李 亮 谌永祥 李永桥

来源:《电脑知识与技术·学术交流》2008年第25期

摘要:基于对图形开发库OpenGL和STL文件格式的研究,提出了使用STL数据实现实体真实感图形显示的思路,并且给出了利用OpenGL显示STL文件实体的编程步骤,依此开发了三维图形显示工具,该显示工具操作简便,显示效果良好。 关键词:STL;OpenGL;真实感图形

中图分类号:TH166文献标识码:A文章编号:1009-3044(2008)25-1587-02 Exploitation of a Realistic Image Displaying Tool for Solid Based on OpenGL LI Liang1, CHEN Yong-xiang2, LI Yong-qiao2

(1. Institute of Manufacture Science and Engineering, Southwest University Science and Technology, Mianyang 621010, China; 2.Department of Graduate Student,Southwest University Science and Technology, Mianyang 621010, China)

Abstract: Base on the research on OpenGL and STL, this paper introduces a thought that realizes the image with sense of reality using the STL's data, and present approach to display solid with STL-file realistically by using the OpenGL. And a tool based on this approach is designed and exploited. It's advantages are easy and flexible operation and good display effects. Key words: STL; OpenGL; image with sense of reality 1 引言

STL(Stereolithography Interface)由3D Systems公司开发而来,它使用三角面片来表示三维实体模型,被广泛应用于科学计算可视化,虚拟现实,快速原型制造,数控加工,有限元分析等技术之中。现已成为CAD/CAM系统接口文件格式标准之一。在应用中,常常要对STL文件实体模型进行观察和分析,这样就需要一种能方便显示模型的工具。本文基于图形开发库OpenGL,使用VC++6.0开发了一个STL格式的实体模型显示工具。 2 基于OpenGL的程序设计

OpenGL(Open Graphic Library)是由SGI公司的IRIS GL图形库开发而来的三维真实感图形生成工具,鉴于它的跨平台、高质量、高效率、功能完善等特点,已成为各种平台下的三

龙源期刊网 http://www.qikan.com.cn

维图形制作及交互式场景处理的工业标准,被广泛地运用于科学计算可视化、计算机动画和虚拟显示等计算机图形学热点问题的解决中。

在Windows XP下利用MFC(Microsoft Foundation Class)来实现可以充分利用Windows操作系统的许多特性,实用价值大,本文在VC++6.0继承开发环境下,使用MFC进行开发。利用VC++编写OpenGL程序的一般步骤如下:

1) 建立应用程序与OpenGL的联系:在项目文件环境设置的Link域中,加入库文件opengl32.lib,glu32.lib,glaux.lib;在由MFC Application Wizard生成的视图类的头文件中,加入gl.h,glu.h,glaux.h,这样应用程序就能使用OpenGL提供的数据类型和函数; 2) 通过填写结构PIXELFORMATDESCRIPTOR来设置显示设备描述表DC(Device Context)的位图格式属性,并调用函数ChoosePixelFormat来选择与以上所定义的位图格式最接近且DC支持的位图格式,然后用SetPixelFormat将其设置成DC的位图格式。从而定义了OpenGL作图的各项属性。此部分内容可在视图类的WM_CREATE消息处理函数中完成。 3) OpenGL使用渲染描述表RC(Rendering Context)完成三维图形的绘制,因此需要建立与DC相对应的一个RC,并使其为当前线程所拥有,即使RC与DC关联起来,它通过函数wglCreateContext和wglMakeCurrent来实现。

4) 调用OpenGL函数绘制图形,它包括定义观察区域、设置投影模式、建立光照模型、作图、图形平移、旋转等等。可根据应用需要调用相应OpenGL函数,在视图类的WM_PAINT消息处理函数中实现。

5) 图形绘制完毕以后,应断开当前线程与RC的联系,并删除RC,可在视图类的WM_DESTORY消息处理函数中完成。 3 系统的功能与实现 3.1 串行化读取STL数据

STL文件中记录了描述实体模型的三角面片数据,包括三角面片的顶点数据和法矢数据。因此,定义一个三角面片类CTriChip 用于描述三角面片: Class CtriChip:public CObject

{DECLARE_SERIAL(CTriChip) //串行化声明 Public:

CPoint3Dvex[3]; //三角形顶点数据

龙源期刊网 http://www.qikan.com.cn

CVector3D normal; //三角面片法矢数据 …… ……

virtual void Draw(COpenGLDC* pDC); //STL显示绘制函数 virtual void Serialize(CArchive& ar); //串行化存取 …… }

MFC提供的串行化技术专门用于解决面向对象的程序设计中各种对象数据的存储和创建。使用串行化技术,用户可以很方便地把对象的不同数据信息存储到指定的二进制文件中去,也可以方便地用同样的顺序从该二进制文件中读出并创建对象。因为MFC中的很多类都支持串行化功能,所以MFC程序设计中使用串行化技术存取文档更加方便。函数

CTriChip::Serialize()对三角面片对象中的数据,即三角面片法向矢量和顶点坐标进行存储或读取。具体算法如下:

void CTriChip::Serialize(CArchive& ar) {if(ar.IsStoring()){ ar for(int i=0;i ar } else {

ar>>normal.dx>>normal.dy>>normal.dz; for(int i=0;i

ar>>vex[i].x>>vex[i].y>>vex[i].z; }