您好,欢迎来到爱go旅游网。
搜索
您的当前位置:首页VC++与OpenGL混合编程实现三维图形处理

VC++与OpenGL混合编程实现三维图形处理

来源:爱go旅游网
2010年第1期 (总第125期) 大众科技 DAZHONG KE J No.1。2010 (Cumulatively No.125) VC++与OpenGL混合编程实现三维图形处理 任群 (亳州I师范高等专科学校,安徽亳州236800) 【摘要】三维图形操作是工程应用中计算机图形处理的难点。文章利用Visualc++良好的用户界面开发功能结合OpenGL 强大的图形显示和处理能力,实现了对三维图形的快速处理,为工程应用中数据的可视化和图形信息表达、虚拟现实的发展都 提供了一定的帮助。 【关键词】 Vc++:OpenGL;三维图形处理 【中图分类号】TP391 【文献标识码】A 【文章编号】1008—1151(2010)01—0038—03 (一)引言 MAINFRAME类、VIEW类和DOC类。MFC应用程序将这四种类有 一般而言,工程设计及资源勘探等都离不开计算机仿真 机的结合在一起。主框架类提供应用程序用户界面的基本框 技术的应用,特别是在处理复杂地质条件及工艺结构时需要 架,该框架具备有完整的标题栏和标准窗口控件。视图类负 利用数学模型建立三维立体图形结构。三维图形处理包括切 责与数据显示、绘制图形以及其他用户与应用程序间的交互 割、移动、旋转、光照等操作,软件的强大图形能力及良好 工作。在单文档应用程序中,视图的工作区覆盖在框架类的 用户界面接口是开发中的难点。 工作区之上。文档类负责处理和存储数据。在MFC应用程序 Vc++面向对象的、功能丰富的可视化开发工具,具有自 中,数据的存取和处理是放在文档类中完成的,数据的显示 动编辑、编译、链接生成可执行文件功能。能够开发出良好 以及交互工作是利用视窗方式完成的。应用程序类负责接收 的用户界面接口,受到软件开发人员的青睐。 消息和分发消息的,其对象theApp是整个应用程序的入口点。 OpenGL是一种三维工具软件包,在交互式三维图形建模 应用程序对象负责创建文档模板对象,文档模板对象又接着 能力和编程方面和其它图形开发工相比具有很强的优越性。 创建文档对象和框架窗口,而框架窗口要创建视图对象。 与传统的GDI绘图相比,使用OpenGL开发不仅减少了代码量, 本文所用的版本是VC++6.0。 而且得到更好的视觉效果。在OpenGL反馈的基础上建立的强 2.openGL 大选择和修改功能,极大地方便了有限元网格图形的修改和 OpenGL是一个性能卓越的三维图形标准,它于硬件 处理,加快了有限元分析计算的周期。 系统、操作系统和窗口系统,具有广泛的可移植性。它采用 本文利用VC++丰富的开发功能,结合OpenGL强大的图形 一系列顶点或像素描述物体,然后将其全部转换为像素,并 处理能力,实现对三维仿真图形图像的处理,为工程应用中 在帧缓存中形成最终所希望的对象,从而完成高质量的静态 图形数据的可视化及仿真提供了借鉴作用。 和动态三维彩色图像的创建。OpenGL有约250左右命令和300 (二)Vc++与OpenGL功能简介 多个函数,用户通过调用这些命令指定创建交互式二维或三 l_VC++ 维程序所需的几何对象和操作。 visual c++(Vc++)是Microsoft公司推出的一个面向对 OpenGL具有对任何复杂形体的建模功能及图形变化功 象的可视化开发工具,是近十年来程序员设计领域最强大的 能,另外OpenGL还支持颜色模式设置及特殊效果处理,如光 开发工具之一。VC++可以借助于Microsoft提供的出色的 照和材质设置、纹理映射、双缓冲动画、深度暗示、运动模 MFC(Microsoft Foundation Class,微软基础类库)类库和应 糊等。 用程序框架,便于开发出Windows标准界面的应用程序。 OpenGL依赖绘制描述表操作显示硬件。调用OpenGL函数 MFC完整的封装了Windows API函数,形成了建立Windows 的每一个线程都需要有一个当前的绘制描述表,该描述表包 应用程序的框架,其特点可以概括为: 含了有关OpenGL的绘制信息。绘制描述表传递所有OpenGL (1)提供了对具有共性应用程序的操作支持,如打印、 命令,它把OpenGL与Windows窗口系统连接起来,所以创建 数据库和OLE等等。 绘制描述表是每个窗口进行OpenGL绘制前必不可少的步骤。 (2)具有良好的通用性和可移植性,借助 绘制描述表与设备描述表有相同的像素格式,但绘制描 Applicationwizzard和ClassWizard使得开发者可以不再需 述表Rc必须在设备描述表DC之上创建。在获得一个DC之后, 要过多的关注重复率较高的基本代码和消息处理机制,开发 首先设置它的像素格式,然后在其上创建一个Rc,该过程由 者有更多的精力投入到算法的研究上。 wglcreatecontext函数完成。然后调用wg1MakeCurrent函数 (3)利用 +的封装性,MFC使得程序员直接面对C++ 使得该Rc成为当前RC,再使用OpenGL的函数绘制场景。当 中的对象而不再是各种复杂的句柄。 绘制工作结束以后,把RC从线程上脱离,接着调用 (4)程序执行效率高。 wglDe1etecontext函数删除它。 MFC应用程序框架中包含有4个主要的类:APP类、 应用程序的每一个线程在调用任何openGL函数之前,都 【收稿日期】2009—1卜10 【作者简介】任群(1982--),女(回族),安徽亳州人,亳州师范高等专科学校理化系助教,研究方向为计算机图像处理。 一38. 必须有一个当前绘制描述表,否则,OpenGL的调用命令将被 忽略。以下给出创建OpenGL绘制描述表的一个一般步骤: HDC hdc://gd建设备描述表DC句柄 HGLRC hglrc;//创建像素格式句柄 hglrc=wglCreateCurrent(hdc)://创建一个绘制描述表 wglMakeCurrent(hdc,hglrc)://使Rc成为当前RC //调用OpengL绘图及图像处理函数(省略) wg1MakeCurrent(NULL,NULL)://绘制结束时,使RC 从线程上脱离 wglDeleteContext(hglrc)://删除绘制描述表RC 在创建Rc之前,必须设置OpenGL像素格式。OpenGL和 GDI的像素格式不同,在Windows应用中窗口的缺省设置是 GDI像素格式。OpenGL的像素格式定义了显示设备的若干特 性,比如是否使用双缓冲、颜色位数和类型以及深度位数等 等。所以需要我们为执行OpenGL绘制任务的窗口专门指定像 素格式以代替GDI像素格式。对每一个窗口,像素格式只能 设置一次。要设置像素格式,首先要用适当的属性填充 PIxELF0RMATDEscRIPT0R结构体,然后才能调用处理像素格式 的Win32 API函数。下面是PIxELF0RMATDEscRIPT0R结构体 原型: typedef struct tagPIXELFOR ̄TDESCRIPTOR{//pfd WORD nSize: WORD nVersion: DWORD dwFlags: BYTE iPixe1Type: BYTE cColorBi ts: BYTE cRedBitS: BYTE cRedShi ft: BYTE cGreenBits; BYTE cGreenShift: BYTE cBlueBitS: BYTE cBlueShi ft: BYTE cAlphaBits: BYTE cAlphaShift: BYTE cAccumBitS: BYTE cAecumRedBi ts: BYTE cAccumGreenBitS: BYTE cAccumBlueBi t S: BYTE cAccumAlphaBits: BYTE cDepthBits: BYTE cStenci1Bits: BYTE cAuxBuffers: BYTE iLayerType: BYTE bReserved: DWORD dwLayerMask: DWORD dwViSibleMask: DWORD dwDamageMask: }PIXELFORMATDESCRIPTOR: 下面给出在本文程序中填充的PIxELF0RMATDEscRIPTOR 结构: stat i C PIXELFORMATDESCRIPTOR pfd={ sizeof(PIXELFORMATDESCRIPTOR),//结构的字节大小 1, //版本号 PFD DRAW TO WINDOW l//支持窗口 PFD SUPPORT OPENGL I//支持OpenGL PFDDOUBLEBUFFER f PFD—SUPPORT—GDI,//支持双缓存 PFDTYPERGBA,//RGBA颜色模式 24,//24位真彩色 0,0,0,0,0,0,//忽略的颜色位 0,//no alpha buffer 0,//shift bit ignored 0,//no accumulat ion buffer 0,0,0,0,//忽略的aecum位 32 //32一bit—Z—buffer 0,//no stencil buffer 0,//no auxiliary buffer PFB ̄IN PLANE,//main layer 0, //reserved 0,0,0//layer masks igored }: (三)基于MFG实现VC++与OpenGL联合编程 1.构造绘制环境 在Windows操作系统下,VC++N用OpenGL进行图形绘制 时,首先要建立基于OpenGL的图形编程环境,包括:在vC++ 的连接设置中添加Open6I32.1ib和glu32.1ib两个文件 以便其调用OpenGL的图形编程接口;用适当的数值初始化 PIXELFO1NATDE结构体,定义像素格式;创建着色描述表,以 便Windows操作系统能够响应到OpenGL的绘制命令。 经过上述3个步骤,OpenGL的编程环境就建立起来了, 绘图函数的实现部分可以放在OnDraw函数中。 2.利用MFC创建应用程序 (1)使用AppWizard创建应用程序框架。在文档和视图 结构的应用程序中,OpenGL绘制工作可以放在视类中完成, 外部数据存取则在文档类中完成。 (2)在视图类中完成以下操作: 重载PreCreateWindow函数;添加OnCreate函数;添加 OnSize函数;添加OnEraseBKgn函数;添加OnDestroy函数; 重载OnInitialUpdate函数。 (3)在PreCreateWindow函数中重新设置窗口属性: CS.style i=WS—CLIPSIBLINGS l WS—CLIPCHILDREN。 (4)在OnCreate函数中设置像素格式,创建绘制描述 表Rc。这样当窗口被创建的时候系统发出WMCREATE消息, OnCreat函数得以调用,保证了RC的及时创建。 (5)在OnSize函数中调用glViewport和glFrustum函 数。因为当窗口的大小发生改变的时候会调用OnSize函数, 此时适时地对OpenGL进行窗口变换和投影变化,这样窗口中 的场景才不会因为窗口大小的变化而发生扭曲现象。 (6)添加OnEraseBKgnd函数,注释掉该函数原有的所 有语句并添加一个return语句。因为,当窗口背景需要重新 设置的时候,OpenGL不需要MFC添加的缺省操作而是用自己 的glClear函数产生类似的操作。 (7)重载OnlnitUpdate函数,完成OpenGL的初始化工 作,包括创建显示列表、设置光照特性、初始化纹理参数以 及其它绘制场景前需要完成的设置。 一39 (8)在OnDraw函数中绘制OpenGL场景。所有的绘制工 作都应放在OnDraw函数中。 (9)添加OnDestroy函数用来响应wM DESTROY消息。 当窗口被销毁的时候删除绘制描述表。 (10)在完成以上步骤之后还需要设置库文件,因为在 MFC基础类库环境下编写的OpenGL程序需要用到glut.h、 glaux.h、opengl32.1ib、glu321ib、glaux.1ib以及 opengl32.dll等文件,具体操作步骤为:点击Project菜单 中的Setting,在弹出的对话框中选择Link属性页,添加 opengl32,lib glu32,lib glaux.¨b到modules中。 Object/1ibrary 图1表面起伏物体模型 (a)正视图 (b)旋转后的侧视图 (c)切割后的模型 另外,需要注意在OpenGL绘图的时候,必须保证绘制描 述表Rc对应的设备描述表Dc不被删除或者被释放,否则会 影响后面的OpenGL命令;如果OpenGL作图需要长时间占用 DC,这里可以把作图窗口类设成CSOWNDC属性。 (四)结论 本文利用面向对象的可视化开发工具VC++结合具有高效 图形处理能力的0penGL混合编程解决工程中对复杂三维体的 3.图形基本操作功能实现及分析 为了能够使得三维模型更为准确地表达出物体的细节信 处理难点,收到了良好的应用效果。vc++的三维数据处理能 力有限,借助于OpenGL强大的图形处理能力和二者良好的融 合性,使得程序能够全部用C语言完成,避免了借助MATLAB 绘图的各种弊端。同时方便程序移植到其它操作系统中,如 Linux。 息,本文采用网格化的方式处理三维模型,这样物体不同细 节的物理信息可以用模型的颜色表达出来,如图1所示。 如果采用100×100×100的三维模型则会产生106个小 的网格体,在显示该三维模型的时候消耗时间最大的是用颜 色填充长方体网格单元,这样将会严重影响处理效率。考虑 到人机交互时,人们能够识别的物体信息只是表层部分,切 同时,为了更多的表达物体细节信息本文采用网格化模 型的方法,并利用表层染色技术解决网格化后带来的图形处 理效率低的问题。通过具有一定复杂度的模型实现,验证了 方法的可行性和实用性。 在三维图形显示技术方面,今后可以在本论文的基础上 割物体后,内部信息又会成为表层信息展示。这样,实际只 需要用颜色填充网格表层即可,采用这种方法会节省大量的 时间,是网格化处理三维模型成为可能。本文称该方法为表 层染色。 图1(a)是本文建立的三维物体模型正视图,该图为表 层起伏、中间带长方体孑L洞。从物体表层向下均匀变化的颜 色代表了物体不同的物理属性。图1(b)是对物体进行旋转 操作后的侧视效果图。图1(c)是对物体切割的效果图。另 外,本文还实现了物体的放大、光照等操作。 加入OpenGL的交互技术,以及三维图形数据文件格式的读取 等,使得三维图形处理更加方便实用。 【参考文献】 【1】周翠英,董立国,刘祚秋,等.OpenGL三维地层切割面的实现 技术【I1.土木工程学报,2006,39(2):61-66. [2】徐亮,陈建勋彳日用OpenGL实现矿山三雏地形显示田.计 算机与数字工程,2006,34(4):95-97. 【3]张丽虹.OpenGL环境下利用MATLAB函数实现三维地形 建模卟计算机工程与应用,2003,34:127—128. [4】陈俊涛,肖明,郑永兰 用OpenGL开发地下结构工程三维有 限元图形系统【J】.岩石力学与工程学报,2006, 25(5):1015—1020. [5】姚普选,仇国巍.程序设计教程(Visual c++)[M】.北京:清华 (b) 大学出版社,2005:269—270. (上接第104页) (五)结束语 断路器失灵保护的正确运行和合理应用对电力系统稳定 性起着重要作用,无论设计或现场维护都应尽量提高保护可 靠性。当失灵保护灵敏度能满足要求时,其配置应简单可靠, 配置太复杂是不可取的。另外失灵保护回路应尽可能规范统 一【参考文献】 f1贺家立,1J宋从矩.电力系统继电保护原理(第--_N)fM】.中国 电力出版社. [2 RCS-2]-916型母线失灵保护装置技术说明书【S1.南京南瑞继 保电气有限公司. 【3J RCS--921断路器失灵保护及自动重舍装置技术说明书【S1. 南京南瑞继保电气有限公司. ,现场试验时安全措施一定要到位。 【4】毛锦庆,赵志刚,等.电力系统继电保护规定汇编(第二 版)『M1坤国电力出版社. ..40.. 

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

Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1

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

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