DIALOG基于MFC和OpenGL三维图形的开发.doc

上传人:sk****8 文档编号:3519868 上传时间:2019-06-01 格式:DOC 页数:8 大小:35.50KB
下载 相关 举报
DIALOG基于MFC和OpenGL三维图形的开发.doc_第1页
第1页 / 共8页
DIALOG基于MFC和OpenGL三维图形的开发.doc_第2页
第2页 / 共8页
DIALOG基于MFC和OpenGL三维图形的开发.doc_第3页
第3页 / 共8页
DIALOG基于MFC和OpenGL三维图形的开发.doc_第4页
第4页 / 共8页
DIALOG基于MFC和OpenGL三维图形的开发.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、基于 MFC 和 OpenGL 三维图形的开发匡天君 滕远道 王乘 徐明毅(华中科技大学 数字化工程中心,湖北 武汉 430074)摘要:本文介绍了 OpenGL 的基本概念,通过对三维动态球体模型的具体分析,详细讨论了如何利用 OpenGL 函数库在 MFC 中实现三维绘图。关键词:OpenGL; MFC;三维;设备描述表(DC);绘制描述表(RC)中国分类号:TP391.41 文献标识码:A3D Graphics Based on MFC and OpenGLKUANG Tian-jun,TENG Yuan-dao,WANG Cheng ,XU Ming-yi(Digital Engine

2、ering Research Center ,HUST,HuBei WuHan 430074,China)Abstract:This paper describles the basic concepts of OpenGL。 And how to implement three-dimentsions images in MFC used OpenGL is also particular argued through an three-dimentsions dynamical sphere specific analyzed。Keywords:OpenGL ;MFC;3D;DC;RC引言

3、随着三维图形的应用愈来愈广泛,计算机图形学的发展也越来越迅速。那么如何快速实现三维图形的计算可视化,仿真可视化呢?OpenGL 即可作为主要途径之一。OpenGL 作为一种硬件图形的软件接口,其优点是作为一个独立的工作平台,独立于硬件设备、窗口系统和操作系统,用它编写的软件可以在 Unix、Windows98/NT 等系统间移植。但是现在很多有关 OpenGL 的书中的程序都是使用标准调用 OpenGL 函数实现的,这样做使得它缺乏面向对象能力,不符合当前流行的软件设计思想。因此我们需要借助一个“窗口”系统来完成 OpenGL 三维图形的制作。众所周知,Visual C+中 MFC 包含了强大

4、的基于 Windows 的应用框架,提供了丰富的窗口和事件管理函数,已经成为当前一种比较流行的工作平台。于是我们可以选用 MFC 调用 OpenGL函数来进行三维图形的开发。现在以三维动态球体模型来讲述 MFC 中的 OpenGL 编程1基本思想在 Windows98/NT 平台下,GDI 是原始窗口的图形接口。而 GDI 实现这些是通过一个设备描述表 DC 来实现的。现在通过 OpenGL 绘图需要创建绘图描述表 RC。但是RC 并不能直接完成绘图,只能与特定的 DC 联系起来,从而完成具体的绘图工作。最后要注意释放 RC 和 DC。2 编程步骤第一步,设置开发环境现在以 Windows20

5、00 为例,首先将glu.dll, glu32.dll,glut.dll,glut32.dll,opengl32.dll 文件拷贝到操作系统 WINNT/System32目录下,将 gl.h,glaux.h ,glu.h,glut.h 拷贝到 Microsoft Visual Studio/VC98/Include/GL 目录中中,将 glaux.lib,glu32.lib,glut32.lib ,opengl32.lib 拷贝到 Microsoft Visual Studio/VC98/Lib 目录中;然后在编译程序的时候选择 Project|Setting 菜单,在 Link 标签中的 O

6、bject/library modules 编辑框中输入 “opengl32.lib, glut32.lib ,glu32.lib,glaux.lib ”。到这时候环境就建立好了,可以进行下面的具体编程工作。第二步,具体编程本实例采用基于对话框的工程。至于用单文档方式和多文档方式其编程原理是一样的,这里不再作单独介绍。2.1 创建项目文件。选择 File|New 菜单项,新建一个基于对话框的项目文件MyDlgOpenGL;2.2 修改对话框模板。删除对话框中的静态文本,调整控件的位置。2.3 创建新类,添加消息映射。选择 View|ClassWizard 菜单项,打开对话框,在 Add Cla

7、ss 之中选择 New,以便添加一个新类 COpenGL,且该类的基类选择generic CWnd;最后利用 MFC ClassWizard 为 COpenGL 类添加消息WM_CREATE,WM_PAINT 的映射。2.4 添加代码。2.4.1 定义像素格式 ,创建 OpenGL 显示。在 OpenGL 能够在一个绘图对象中绘图之前,该绘图对象必须初始化。为此引入像素格式的概念。像素格式能告诉 OpenGL 是否使用双缓存,颜色模式,颜色位数,深度位数等等重要信息。 它由一个被称作 PIXELFORMATDESCRIPTOR 的所描述。于是定义在 OpenGL.h 中定义函数 int MyS

8、etPixelFormat(HDC hdc)。然后在OpenGL.cpp 文件中加入如下代码:int COpenGL:MySetPixelFormat(HDC hdc)PIXELFORMATDESCRIPTOR pfd = sizeof(PIXELFORMATDESCRIPTOR), / pfd 结构的大小 1, / 版本号 PFD_DRAW_TO_WINDOW | / 支持在窗口中绘图 PFD_SUPPORT_OPENGL | / 支持 OpenGL PFD_DOUBLEBUFFER, / 双缓存模式 PFD_TYPE_RGBA, / RGBA 颜色模式 24, / 24 位颜色深度 0,

9、0, 0, 0, 0, 0, / 忽略颜色位 0, / 没有非透明度缓存 0, / 忽略移位位 0, / 无累计缓存 0, 0, 0, 0, / 忽略累计位 32, / 32 位深度缓存 0, / 无模板缓存 0, / 无辅助缓存 PFD_MAIN_PLANE, / 主层 0, / 保留 0, 0, 0 / 忽略层 ,可见性和损毁掩模 ; int iPixelFormat; / 为设备描述表得到最匹配的像素格式 if(iPixelFormat = ChoosePixelFormat(hdc, return 0;/ 设置最匹配的像素格式为当前的像素格式 if(SetPixelFormat(hdc

10、, iPixelFormat, return 0;return 1;现在就可以在 OnCreate 函数中创建绘图描述表。其代码如下:int COpenGL:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CWnd:OnCreate(lpCreateStruct) = -1)return -1;MySetPixelFormat(:GetDC(m_hWnd); / 设置当前的绘图像素格式hdc = :GetDC(m_hWnd); / 获得绘图描述表hglrc = wglCreateContext(hdc); / 创建绘图描述表wglMakeCurrent(

11、hdc, hglrc); / 使绘图描述表为当前调用现程的当前绘图描述表return 0;2.4.2 进行光照处理,添加 OpenGL 显示。在 OpenGL.h 中定义函数 LightShine 函数,作为添加光源和材质属性的函数。在该函数中将创建两个光源,并使其位于不同位置,以产生不同的效果。定义:环境光,散射光,镜面光和镜面反射指数。因为没有一种光源完全由以上三种中的一种光源组成,所以任何一种光源都是由以上三种光源的光照成分组成的,即为混合光源。其成分值由 RGBA 定义。用材料对光的三原色的反射率来定义材料的颜色,与光源相对应,。代码如下:void COpenGL:LightShine

12、(void)GLfloat mat_diffuse4=1,0.5,0.5,1.0;GLfloat mat_specular4=1.0,1.0,1.0,1.0;GLfloat mat_shininess1=100.0;/光源 1GLfloat light_position04=0,500,500,0;glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);glLigh

13、tfv(GL_LIGHT0,GL_POSITION,light_position0);glEnable(GL_LIGHT0);/光源 2 GLfloat light_position14=1000,-1000,1000,0;GLfloat mat_diffuse14=0.5,0.5,1.0,1.0;glLightfv(GL_LIGHT1,GL_DIFFUSE,mat_diffuse1);glLightfv(GL_LIGHT1,GL_SPECULAR,mat_specular);glLightfv(GL_LIGHT1,GL_SHININESS,mat_shininess);glLightfv(G

14、L_LIGHT1,GL_POSITION,light_position1);glEnable(GL_LIGHT1);/使模型能接受光照glEnable(GL_LIGHTING); glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);glDepthFunc(GL_LESS);glEnable(GL_DEPTH_TEST);/计算定点法线glEnable(GL_AUTO_NORMAL);glEnable(GL_NORMALIZE);2.4.3 定义绘图窗口所绘球体在哪个区域内进行绘制以及这个区域的风格是怎样的必须需要进行定义。为下一步的绘图工作打下基础。那

15、么可以在 MyDlgOpenGLDlg.cpp 的函数OnInitDialog()中加入如下代码:CRect rect(7, 7, 300, 300); /定义绘图区域的大小m_pDisplay-Create( NULL, NULL, /定义窗口风格 WS_CHILD|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_VISIBLE,rect, this, 0); 2.4.4 绘制图象在前面的准备之后,现在可以在 OnPaint 函数中绘制图象。在具体进行绘制物体时,需要注意的是:glPushMatrix()与 glPopMatrix()的使用必须成对出现。此外,必须正确使

16、用 glScale() 函数和 glRatate() 函数以及双缓存技术,以实现所绘球体的在指定窗口由远及近,由小变大的旋转。代码如下:void COpenGL:OnPaint() glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);space+=0.005;if(space1.0)space=0.1;step = step + 1.0;if (step 360.0)step = step - 360.0;glPushMatrix();glScalef(space,space,space);glRotatef(step,0.0,1.0,0.0)

17、;glRotatef(step,0.0,0.0,1.0);glRotatef(step,1.0,0.0,0.0);LightShine(); /添加光照属性glutSolidSphere(1.0,20,16); /绘制球体glPopMatrix();glFlush();SwapBuffers(hdc); /使用双缓存技术实现交换缓冲区2.4.5 结束运行在结束运行时,我们必须将一些环境变量释放。于是应该在添加的类 COpenGL 的析构函数中进行操作,以释放 DC 和删除 RC。代码如下:COpenGL:COpenGL()wglMakeCurrent(NULL, NULL) ; wglDele

18、teContext(hglrc); /删除绘图描述表:ReleaseDC (m_hWnd, hdc) ; /释放设备描述表结语利用 Visual C强大的窗口功能完成了 OpenGL 绘制球体的程序的编制工作,上述程序运行正常,其结果是一个动态的球体。理解了上述编程过程,就可以使我们自如地运用 MFC 进行其他的 OpenGL 编程。参考文献 WOOM,NEIDERJ,DAVIST 等. OpenGL 编程权威指南. 吴斌等译. 北京:中国电力出版社,2001. David J. Kruglinki ,Scot Wingo, George Shepherd 著 Programming Visu

19、alC+6.0技术内幕M 希望图书创作室译. 北京:北京希望电子出版社,2001. 田红鹏,马苗 OpenGL 及其基于 VC6.0 的开发,西安科技学院学报:2001, Vol.21,No.4:366-368作者简介:匡天君(1978-) ,男(汉族) ,湖北武汉人,研究生,主要研究方向:计算机可视化仿真;滕远道,研究生,主要研究方向:计算机可视化仿真;王乘,博士生导师,主要研究方向:大规模结构分析仿真及水土结构计算工作;徐明毅,博士后,主要研究方向:结构力学及计算机可视化仿真。所投栏目:软件时空 第一作者介绍:姓名:匡天君 性别:男 出生年月:1978 年 8 月 籍贯:湖北武汉人 学位:硕士 简历:2001 年 9 月至今就读于华中科技大学数字化工程学院研究方向:计算机可视化仿真通信地址:华中科技大学(主校区)东 11 舍 317 邮政编码:430074联系电话:027-87549465

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 实用文档资料库 > 策划方案

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。