利用OpenGL实现三维绘图.doc_第1页
利用OpenGL实现三维绘图.doc_第2页
利用OpenGL实现三维绘图.doc_第3页
利用OpenGL实现三维绘图.doc_第4页
利用OpenGL实现三维绘图.doc_第5页
免费预览已结束,剩余6页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

河南师范大学本科毕业论文(设计)利用OpenGL实现三维绘图摘 要:本文主要介绍VC+编程中利用OpenGL实现三维绘图的问题,文中首先介绍OpenGL编程中的步骤,分为初始化OpenGL绘图环境和定义与Windows接口的系统函数两步,其中又详细说明了具体方法及需要注意的问题,主要目的是利用OpenGL绘出一个三维立体动画图像,然后用一个VC+实例包括操作步骤和源程序代码来说明OpenGL的功能,最后做了简单的小结。关键词:VC+;OpenGL;三维绘图Abstract:This article mainly introduces the question about how to use OpenGL to protract three-dimension-images in VC+ programming. First, it introduces the steps in OpenGL programming, including initialization protracting environment and the definition of the system functions about interface to Windows. It mainly discusses the detailed instructions about flexible methods and problems that we should pay attention to with the aim of protracting a three-dimension-image. Then, with an example of VC+ programming including procedure and source code, it illustrates the function of OpenGL. Last, it makes a brief conclusion.Keywords:VC+;OpenGL;Protraction of three-dimension-images1 前言 在三维绘图蓬勃发展的过程中,计算机公司推出了大量的三维绘图软件包。其中SGI公司推出的OpenGL,作为一个性能优越的图形应用程序设计界面(API)异军突起,取得了很大的成就。它以高性能的交互式三维图形建模能力和易于编程开发,得到了Microsoft、 IBM、 DEC、 Sun、 HP等大公司的认同,OpenGL原先是Silicon Graphics Incorporated(SGI公司)在他们的图形工作站上开发高质量图像的接口。但最近几年它成为一个非常优秀的开放式三维图形接口。实际上它是图形软件和硬件的接口,它包括有120多个图形函数,GL是GRAPHIC LIBRARY的缩写,意思是“图形库”。OpenGL的出现使大多数的程序员能够在PC机上用C语言开发复杂的三维图形。微软在Visual C+ 中已提供了三个OpenGL的函数库(glu32.lib, glau.lib,OpenGL32.lib),可以使我们方便地编程,简单、快速地生成美观、漂亮的图形。例如Windows NT中的屏幕保护程序中的花篮和迷宫等都给人们留下了深刻的印象,因此,OpenGL已经成为一种三维图形开发标准,是从事三维图形开发工作的必要工具.2 在VC中利用OpenGL实现三维绘图2.1 MFC AppWizard应用程序中进行OpenGL编程在VC中进行三维绘图有两种方法,第一是在简单的控制台应用程序中进行OpenGL编程,另一种是在MFC AppWizard应用程序中进行OpenGL编程,后者的方法相对复杂,在此不做详述,只做简单归纳1-3:(1)编写创建函数;(2)编写销毁函数,清除位图、定时器等资源及设备场景;(3)修改Cview类的样式;(4)编写OnDraw事件处理程序;(5)在OnSize方法中定义当前视区、投影模型和物理模型以及光源等;(6)编写OnTimer事件处理程序;(7)编写OpenGL绘图程序。2.2 在简单的控制台应用程序中进行OpenGL编程的方法步骤以及注意事项(1)初始化OpenGL绘图环境 定义颜色模式和缓冲模式 OpenGL提供两种颜色模式:RGB(RGBA)模式和颜色索引模式。在RGBA模式下所有颜色的定义用RGB三个值来表示,有时也加上Alpha值(表示透明度)。RGB三个分量值的范围都在0和1 之间,它们在最终颜色中所占的比例与它们的值成正比。如:(1,1,0)表示黄色,(0,0,1)表示蓝色。颜色索引模式下每个象素的颜色是用颜色索引表中的某个颜色索引值表示(类似于从调色板中选取颜色)。由于三维图形处理中要求颜色灵活,而且在阴影,光照,雾化,融合等效果处理中RGBA 的效果要比颜色索引模式好,所以,在编程时大多采用RGBA模式。 OpenGL提供了双缓存来绘制图像。即在显示前台缓存中的图像同时,后台缓存绘制第二幅图像。当后台绘制完成后,后台缓存中的图像就显示出来,此时原来的前台缓存开始绘制第三幅图像,如此循环往复,以增加图像的输出速度。 设置窗口显示模式函数: void auxInitDisplayMode( AUX_DOUBLE,/双缓存方式 |AUX_RGBA);/RGBA颜色模式 设置光源 OpenGL的光源大体分为三种:环境光(Ambient light),即来自于周围环境没有固定方向的光。漫射光(Diffuse light)来自同一个方向,照射到物体表面时在物体的各个方向上均匀发散。镜面光(Specular light)则是来自于同一方向,也沿同一个方向反射。全局环境光是一种特殊的环境光,它不来自于某种特定光源,通常做为场景的自然光源。 指定光源函数: Void glLightfv(Glenum light, /光源号 Glenum pname, /指明光源种类 /GL_DIFFUSE 光源为漫射光光源 /GL_AMBIENT 光源为环境光光源 /GL_SPECULAR 光源为镜面光光源 const Glfloat* params);/指向颜色向量的指针 设置全局环境光函数: void glLightModelfv( GL_LIGHT_MODEL_ AMBIENT, const Glfloat* param ); /param 指向颜色向量的指针 起用光源函数: void glEnable(GL_LIGHTING); void glEnable(GL_enum cap);/ cap :指明光源号 设置材质 在OpenGL中,用材料对光的三原色(红绿蓝)的反射率大小来定义材料的颜色。与光源相对应,材料的颜色,也分为环境色,漫反射色和镜面反射色,由此决定该材料对应不同的光呈现出不同的反射率。由于人所看到物体的颜色是光源发出的光经物体反射后进入眼睛的颜色。所以,物体的颜色是光源的环境光、漫反射光和镜面反射光与材料的环境色、漫反射色和镜面反射色的综合。例如:OpenGL 的光源色是(LR,LG,LB),材质色为(MR,MG,MB),那么,在忽略其他反射效果的情况下,最终进入眼睛的颜色是(LR*MR,LG*MG,LB*MB)。 材质定义函数: void glMaterialfv( GLenum face, /指明在设置材质的哪个表面的颜色。可以是GL_FRONT, GL_BACK,或GL_FRONT_AND_BACK GLenum pname,/与光源的pname参数相似 const float* params);/指向材质的颜色向量 定义投影方式(选择观察物体的角度和范围)由于我们是三维绘图,所以采用不同的视点和观察范围,就会产生不同的观察效果。由于计算机只能显示二维图形,所以在表示真实世界中的三维图形时,需将三维视景转换成二维视景。这是产生三维立体效果的关键。OpenGL提供了两种将3D图形转换成2D图形的方式。正投影(Orthographic Projection)和透视投影(Perspective Projection)。其中,正投影指投影后物体的大小与视点的远近无关,通常用于CAD设计;而透视投影则符合人的心理习惯,离视点近的物体大,离视点远的物体小。此外,在OpenGL中还要定义投影范围,只有在该范围中的物体才会被投射到计算机屏幕上,投影范围外的物体将被裁减掉。 定义投影范围(不同的投影方式对应不同函数): void glOrtho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near,GLdouble far); /(left,bottom,near)和(right,top,far)分别给出正射投影投影范围的左下角和右上角的坐标。 (2) 定义与Windows接口的系统函数 定义绘图窗口的位置: void auxInitPosition(GLint x,GLint y,GLsizei width, GLsizei heigh);/ (x,y)给出窗口左上角坐标width和 heigh给出窗口的宽高 定义绘图窗口的标题: void auxInitWindow(GLbyte* 窗口标题字串); 定义绘图窗口改变时的窗口刷新函数: void auxReshapeFunc(回调函数名称); /当窗口改变形状时调指定的回调函数 定义空闲状态的空闲状态函数以实现动画: void auxIdleFunc(回调函数名称); /当系统空闲时调用指定的回调函数 定义场景绘制函数(当窗口更新或场景改变时调用): void auxMainLoop(回调函数名称); /当窗口需要更新或场景变化时调用 3 实例分析下面我们来进行一个实际的编程过程,我们要绘制一个球体按照圆轨迹运动的图像,以此来演示一下OpenGL编程的功能和方法4-7:(1) 创建一个新工程。从“File”菜单中选择“New”选项,在弹出的对话框中选择“Project”选项卡,单击“Win32Console Application”选项,输入应用程序目录和名称。(2) 设置包含文件和库文件路径。从“Tools”菜单中选择“Options”选项,在弹出的对话框中选择“Win32Console Application”选项卡,设置包含文件及库文件所在目录,在缺省情况下两者的目录已正确设置,即VC目录的include子目录和lib子目录。(3) 加入OpenGL库。从“Project” 菜单中选择“LinK”选项卡,在“Object|LibraryModule”编辑框中加入“opengl32.lib glu32.lib glaux.lib”即可。完成了上述三个步骤之后,便进行具体的VC代码设计。附源程序代码:#include windows.h#include gl/gl.h#include gl/glaux.h #include gl/glu.h #include math.hvoid myinit() glClearColor(1,1,0,0); GLfloat ambient=.5,.5,.5,0; glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient); GLfloat mat_ambient=.8,.8,.8,1.0; GLfloat mat_diffuse=.8,.0,.8,1.0; GLfloat mat_specular=1.0,.0,1.0,1.0; GLfloat mat_shininess=50.0; GLfloat light_diffuse=0,0,.5,1; GLfloat light_position=0,0,1.0,0; glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mat_ambient); glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat_diffuse); glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular); glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,mat_shininess); glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); glLightfv(GL_LIGHT0,GL_POSITION, light_position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glDepthFunc(GL_LESS); glEnable(GL_DEPTH_TEST); void CALLBACK display() glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); auxSolidSphere(1.0);/绘制半径为1.0的实体球 glFlush(); /强制输出图像 auxSwapBuffers(); /交换绘图缓存 _sleep(100); void CALLBACK Idledisplay() /x,y满足x2+y2=0.01。这样可以使物体沿该圆轨迹运动。 static float x=-.1,y=0.0; static BOOL mark=TRUE; static float step=.01; x+=step; if(x=-.1) then if(step0)then y=sqrt(.01-x*x); else y=-sqrt(.01-x*x); glTranslatef(x,y,0); else step=0-step; display(); void CALLBACK myReshape(GLsizei w,GLsizei h) glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(w=h) thenglOrtho(-3.5,3.5,-3.5*(GLfloat)w/(GLfloat)h, 3.5*(GLfloat)w/(GLfloat)h,-10,10); else glOrtho(-3.5*(GLfloat)w/(GLfloat)h,3.5* (GLfloat)w/(GLfloat)h,-3.5,3.5,-10,10); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); void main() auxInitDisplayMode(AUX_DOUBLE|AUX_RGBA); auxInitPosition(0,0,400,400); auxInitWindow( circle ); myinit(); auxReshapeFunc(myReshape); auxIdleFunc(Idledisplay); auxMainLoop(display); 在VC编辑器中把代码保存为后缀是.cpp的C+文件。开始编译,在The build command requires an active project workspace。 Would you like to create a default project workspace? 的提示后,选择“是(Y)”。便开始编译运行。程序运行结果是一个实心球体按照圆轨迹运动,有黄色的背景颜色,球体是紫色的,球心带粉色,十分漂亮,球体运动的轨迹也在不断向右方移动,直到离开窗口,不再显示。4 小结OpenGL三维图形库为在微机上实现三维真实感图形的绘制与显示提供了有效的手段。本文所涉及的程序在Windows XP下用Visual C+ 6.0调试通过,显示了OpenGL的强大功能,但是目前关于这方面的学习资料不够充分,还有很多是英文的,使得OpenGL在国内不能得到很好的运用,但是OpenGL这一强大的图形绘制工具一定会具有很好的发展前景,尤其在三维动画、游戏编程方面。这有待于国内游戏开发人员进一步开发和应用。参考文献:1 费广正,乔林Visual C+6.0高级编程技术OpenGL篇.中国铁道出版社,2000.9,第一版.2 吕军Visual C +与面向对象程序设计教程.高等教育出版社,2004.3,第二版.3 Li Wei,Huang Xiaohui,ZhengNanning. Parallel

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论