




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上毕业论文题 目: 基于OPENGL飘动国旗的设计 学生姓名: 程 亮 学生学号: 系 别: 计算机与信息工程系 专 业: 计算机科学与技术 届 别: 2012届 指导教师: 尹星云 目 录1 绪论(2) 2 开发平台简介(3) 2.1 OpenGL的简介(3)2.1.1特点和功能(4) 2.1.2 OpenGL的现状(4) 2.1.3OpenGL命令的简介(5)2.2 MFC的简介(6)3 图形纹理(7)3.1关于OpenGL的图形纹理基本理论(8)3.2 OpenGL中纹理的实现(8)4 三维动画的基本原理及在OpenGL中的实现(8) 4.1 动画的基本原理(8)
2、 4.2动画在OpenGL中的实现(9)5 飘动国旗的绘制 (11) 5.1论文中相关的OpenGL 命令格式以及功能(11) 5.2飘动国旗的绘制过程(12)6 程序运行结果及分析 (16)6.1 程序运行结果(16)6.2 程序结果分析(17)结语(17)致谢(19)参考文献(19)专心-专注-专业基于OPENGL飘动旗国旗的设计学生:程 亮指导教师:尹星云淮南师范学院计算机与信息工程系摘 要:本课题的主要任务是基于OPENGL采用Visual C+制作旗帜飘动的动画。OpenGL作为一个性能优越的图形应用程序设计界面(API)而适合于广泛的计算环境,从个人计算机到工作站和超级计算机,Op
3、enGL都能实现高性能的三维图形功能。作为目前三维图形开发标准,OpenGL利用其强有力的图形函数以及其支持的MFC(Microsoft Foundation Class)类库编程绘制和实现动画,展示了OpenGL强大的图形图像处理功能。关键词:旗帜飘动;动画;可视化;MFC;图形图像Waving flag design based on OPENGLAuthors name: Liang ChengSupervisor: Xing-Yun YinDepartment of computer and Information Engineering Huainan Normal Universi
4、tyAbstract: The main task of this project is based on the OPENGL using Visual C + + making flags fluttering animated. OpenGL as a performance superior graphics application programming interface ( API ) and suitable for a wide range of computing environment, from the personal computer to a workstatio
5、n and super computer, OpenGL can achieve high performance3D graphics function. As the current3D graphics development standards, the use of its OpenGL powerful graphical function as well as its support for the MFC ( Microsoft Foundation Class ) library programming rendering and animation, display the
6、 OpenGL strong graphic image processing functions.Key words: Flag flapping; animation; visualization; MFC; graphic image1 绪论计算机动画广泛地应用于计算机游戏产业,虚拟现实技术等领域,具有极大的经济价值。OpenGL是一种跨平台的图形应用程序接口,功能强大,已经成为实际使用的业界标准。图形处理是现代计算机区别于以前计算机的一个显著特征,使计算机走出了呆板的单一枯燥计算,在保证完成任务的同时更加接近真实世界,从而大大扩展了计算机应用领域,并带给编程人员和应用者丰富多彩的视听感
7、受。应用程序可视化是计算机程序设计的发展趋势。在工程应用的许多领域中,计算机仿真的蓬勃发展使得人们可以不必在真实试验场便可以获得许多系统模型的性能,即使是真实试验,也少不了利用仿真系统对试验的再现。计算机仿真已经成为工程设计和软件开发人员不可或缺的重要工具。OpenGL提供直观的三维图形开发环境。OpenGL实际上是一种图形与硬件的接口。它包括了120个图形函数,开发者可以用这些函数来建立三维模型和进行三维实时交互。与其他图形程序设计接口不同,OpenGL提供了十分清晰明了的图形函数,因此初学的程序设计员也能利用OpenGL的图形处理能力和1670万种色彩的调色板很快地设计出三维图形以及三维交
8、互软件。OpenGL强有力的图形函数不要求开发者把三维物体模型的数据写成固定的数据格式,这样开发者不但可以直接使用自己的数据,而且可以利用其他不同格式的数据源。这种灵活性极大地节省了开发者的时间,提高了软件开发效益。长期以来,从事三维图形开发的技术人员都不得不在自己的程序中编写矩阵变换、外部设备访问等函数,为调制这些与自己的软件开发目标关系并不十分密切的函数费脑筋,而OpenGL正是提供一种直观的编程环境,它提供的一系列函数大大地简化了三维图形程序。OpenGL成为目前三维图形开发标准。在计算机发展初期,人们就开始从事计算机图形的开发。直到计算机硬软件和计算机图形学高度发达的九十年代,人们发现
9、复杂的数据以视觉的形式表现时是最易理解的,因而三维图形得以迅猛发展,于是各种三维图形工具软件包相继推出,如PHIGS、PEX、RenderMan等。这些三维图形工具软件包有些侧重于使用方便,有些侧重于渲染效果或与应用软件的连接,但没有一种三维工具软件包在交互式三维图形建模能力、外部设备管理以及编程方便程度上能够与OpenGL相比拟。OpenGL经过对GL的进一步发展,实现二维和三维的高级图形技术,在性能上表现得异常优越,它包括建模、变换、光线处理、色彩处理、动画以及更先进的能力,如纹理影射、物体运动模糊等。OpenGL的这些能力为实现逼真的三维渲染效果、建立交互的三维景观提供了优秀的软件工具。
10、OpenGL在硬件、窗口、操作系统方面是相互独立的。许多计算机公司已经把OpenGL集成到各种窗口和操作系统中,其中操作系统包括UNIX、Windows NT、DOS等,窗口系统有X窗口、Windows等。为了实现一个完整功能的图形处理系统,需设计一个与OpenGL相关的系统结构:其最底层是图形硬件,第二层为操作系统,第三层为窗口系统,第四层为OpenGL,第五层为应用软件。OpenGL是网络透明的,在客户服务器(Client-Server)体系结构中,OpenGL允许本地和远程绘图。所以在网络系统中,OpenGL在X窗口、Windows或其它窗口系统下都可以以一个独立的图形窗口出现。Open
11、GL作为一个性能优越的图形应用程序设计界面(API)而适合于广泛的计算环境,从个人计算机到工作站和超级计算机,OpenGL都能实现高性能的三维图形功能。由于许多在计算机界具有领导地位的计算机公司纷纷采用OpenGL作为三维图形应用程序设计界面,OpenGL应用程序具有广泛的移植性。因此,OpenGL已成为目前的三维图形开发标准,是从事三维图形开发工作的技术人员所必须掌握的开发工具。2 开发平台简介2.1 OpenGL的简介 OpenGL是SGI公司开发的一套高性能的图像处理系统,是图形硬件的软件界面,GL即代表图形库(Graphics Library).通过OpenGL程序员可以创建交互式应用
12、程序,实现具有逼真效果的三维图形图像,从而在要求高度模拟真实世界的诸多领域中都可以大显身手。与AutoCAD等广泛应用的通用绘图及建模软件平台不同,OpenGL不仅可以处理单幅的离散图形,在实时的三维仿真领域,由于其对环境及实体的渲染达到了高度逼真的视觉效果,从而显示出强大的生命力.学会使用OpenGL进行三维绘图,提高图形开发的认知,为以后的工作和学习打下基础。2.1.1特点和功能 OpenGL是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植;OpenGL可以与Visual C+紧密接口,便于实现机械手的有关计算和图形算法,可保证
13、算法的正确性和可靠性;OpenGL使用简便,效率高。它具有七大功能:1.建模:OpenGL图形库除了提供基本的点、线、多边形的绘制函数外,还提供了复杂的三维物体(球、锥、多面体、茶壶等)以及复杂曲线和曲面绘制函数。2.变换:OpenGL图形库的变换包括基本变换和投影变换。基本变换有平移、旋转、变比镜像四种变换,投影变换有平行投影(又称正射投影)和透视投 影两种变换。其变换方法有利于减少算法的运行时间,提高三维图形的显示速度。3.颜色模式设置:OpenGL颜色模式有两种,即RGBA模式和颜色索引(Color Index)。4.光照和材质设置:OpenGL光有辐射光(Emitted Light)、
14、环境光(Ambient Light)、漫反射光(Diffuse Light)和镜面光(Specular Light)。材质是用光反射率来表示。场景(Scene)中物体最终反映到人眼的颜色是光的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色。5:纹理映射(Texture Mapping)。利用OpenGL纹理映射功能可以十分逼真地表达物体表面细节。6:位图显示和图象增强图象功能除了基本的拷贝和像素读写外,还提供融合(Blending)、反走样(Antialiasing)和雾(fog)的特殊图象效果处理。以上三条可使被仿真物更具真实感,增强图形显示的效果。7:双缓存动画(Double Buff
15、ering)双缓存即前台缓存和后台缓存,简言之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面。此外,利用OpenGL还能实现深度暗示(Depth Cue)、运动模糊(Motion Blur)等特殊效果。从而实现了消隐算法。OpenGL设备运用,目前瑞芯微2918芯片和英伟达芯片Tegra2 就是采用OpenGL 2.0技术进行图形处理,而基于瑞芯微2918芯片方案代表是台电T760和微蜂X7平板电脑所采用到。2.1.2 OpenGL的现状 Open GL仍然是唯一能够取代微软对3D图形技术的完全控制的API。它仍然具有一定的生命力,但是Silicon Graphics已经不再以
16、任何让微软不悦的方式推广Open GL,因而它存在较高的风险。游戏开发人员是一个有着独立思想的群体,很多重要的开发人员目前仍然在使用Open GL。因此,硬件开发商正在设法加强对它的支持。2.1.3 OpenGL命令的简介OpenGL命令使用了前缀gl且都是小写字母作为每一个命令名称的首字母(例如,glClearColor())。类似的,OpenGL定义常量时是GL_开头,使用的是大写字母,且用下划线将每个单词隔开(如GL_COLOR_BUFFER_BIT)。 一些看起来无关的字母被加到了某些命令名称的后面(例如,glColor3f()和glVertex3f()里面的3f)。没错,只用glCo
17、lor3f()命令名称中的Color部分就足以定义这个命令用于设置当前颜色。但是,这样子你就可以用不同的参数类型定义更多的命令。特别是前缀中的3表示有三个参数;另外一个版本的Color命令有4个参数。前缀中的f表示参数类型是浮点数。不同的格式允许OpenGL用它自己的数据格式接受用户数据。一些OpenGL命令在它们的参数接受多达8个不同的数据类型。在表1中列出了用ISO C语言实现的前缀字母和数据类型的关系,相应的也列出了对应的OpenGL数据类型。 表1 ISO C语言实现的前缀字母和数据类型的关系字符相应的C语言类型OPENGL数据类型定义bsigned charGLbytesshortG
18、LshortiintGlint,GLsizeiffloatGLfloat, GLclampfddoubleGLdouble, GLclampdubunsigned charGLubyte, GLbooleanusunsighed shortGLshortuiunsigned intGLuint, GLenum, GLbitfieldvoidGLvoid2.2 MFC的简介 MFC是微软基础类库的简称,是微软公司实现的一个c+类库,主要封装了大部分的windows API函数,VC+是微软公司开发的c/c+的集成开发环境,所谓集成开发环境,就是说利用它你可以编辑,编译,调试,而不是使用多种工具轮
19、换操作,灵活性较大。有时人们说vc呢也指它的内部编译器,集成开发环境必须有一个编译器内核,要不有什么用,例如DevC+其中一个编译器内核就是GCC。 MFC除了是一个类库以外,还是一个框架,你应该试过,在vc+里新建一个MFC的工程,开发环境会自动帮你产生许多文件,同时它使用了MFCxx.dll。xx是版本,它封装了MFC内核,所以你在你的代码看不到原本的SDK编程中的消息循环等等东西,因为MFC框架帮你封装好了,这样你就可以专心的考虑你程序的逻辑,而不是这些每次编程都要重复的东西,但是由于是通用框架,没有最好的针对性,当然也就丧失了一些灵活性和效率但是MFC的封装很浅,所以效率上损失不大,灵
20、活性还可以,虽然也有很多缺陷,但还是一个比较好的东西。3 图形纹理 3.1 图形纹理的基本理论 计算机图形学中的纹理既包括通常意义上物体表面的纹理即使物体表面呈现凹凸不平的沟纹,同时也包括在物体的光滑表面上的彩色图案,通常我们更多地称之为花纹。对于花纹而言,就是在物体表面绘出彩色花纹或图案,产生了纹理后的物体表面依然光滑如故。对于沟纹而言,实际上也是要在表面绘出彩色花纹或图案,同时要求视觉上给人以凹凸不平感即可。 凹凸不平的图案一般是不规则的。在计算机图形学中,这两种类型的纹理的生成方法完全一致, 这也是计算机图形学中把他们统称为纹理的原因所在。 所以纹理映射就是在物体的表面上绘制彩色的图案。
21、3.2 OpenGL中纹理的实现OpenGL为我们提供了三种纹理GL_TEXTURE_1D、GL_TEXTURE_2D和GL_TEXTURE_3D。它们分别表示1维纹理、2 维纹理和3维纹理。无论是哪一中纹理,使用方法都是相同的:即先创建一个纹理对象和一个存储纹理数据的n维数组,在调用glTexImageN D函数来传入相应的纹理数据。3.2.1 设置贴图模式 OpenGL提供了3种不同的贴图模式:GL_MODULATE,GL_DECAL和GL_BLEND。默认情况下,贴图模式是GL_MODULATE, 在这种模式下,OpenGL会根据当前的光照系统调整物体
22、的色彩和明暗。第二种模式是GL_DECAL,在这种模式下所有的光照效果都是无效 的,OpenGL将仅依据纹理贴图来绘制物体的表面。最后是GL_BLEND,这种模式允许我们使用混合纹理。在这种模式下,我们可以把当前纹理同一个颜 色混合而得到一个新的纹理。我们可以调用glTexEnvi函数来设置当前贴图模式: glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,TextureMode); 其中TextureMode就是想要设置的纹理模式,可以为GL_MODULATE,GL_DECAL和GL
23、_BLEND中的任何一种。 另外,对于GL_BLEND模式,我们可以调用 glTexEnvfv(GL_TEXUTRE_ENV,GL_TEXTURE_ENV_COLOR,ColorRGBA); 其中,ColorRGBA为一个表示RGBA颜色的4维数组。3.2.2 纹理滤镜 在纹理映射的过程中,如果图元的大小不等于纹理的大小,OpenGL便会对纹理进行缩放以适应图元的尺寸。我们可以通过设置纹理滤镜来决定OpenGL对某个纹理采用的放大、缩小的算法。
24、60; 调用glTexParameter来设置纹理滤镜。如: glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILETER, MagFilter);/设置放大滤镜 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, MinFilter); /设置缩小滤镜 上述调用中,第一个参数表明是针对何种纹理进行设置,第二个参数表示要设置放大滤镜还是缩小滤镜。第三个参数表示使用的滤镜。可以为下
25、面的值之一:表2 可使用的纹理滤镜滤镜描述GL_NEAREST取最邻近像素GL_LINEAR线性内部插值GL_NEAREST_MIPMAP_NEAREST最近多贴图等级的最邻近像素GL_NEAREST_MIPMAP_LINEAR在最近多贴图等级的内部线性插值GL_LINEAR_MIPMAP_NEAREST在最近多贴图等级的外部线性插值GL_LINEAR_MIPMAP_LINEAR在最近多贴图等级的外部和内部线性插值 (glBindTexture(GL_TEXTURE_2D, texture0);/ glBindTexture函数把当前纹理状态绑定到纹理对象中,第一个参数指明了绑定的纹理目标,第
26、二个参数是纹理对象.调用这个函数之后,后面的操作都是对这个纹理对象进行的操作.首先是使用glTexImage2D函数读取位图数据来生成纹理,之后的glTexParameteri函数分别指定了发大和缩小过滤器的参数。4 三维动画基本原理及在OpenGL中的实现4.1动画的基本原理动画是一门通过在连续多格的胶片上拍摄一系列单个画面,从而产生动态视觉的技术和艺术,这种视觉是通过将胶片以一定的数率放映体现出来的.实验证明:动画和电影的画面刷新率为24帧/s,即每秒放映24幅画面,则人眼看到的是连续的画面效果。计算机动画是指采用图形与图像的处理技术,借助于编程或动画制作软件生成一系列的景物画面,其中当前
27、帧是前一帧的部分修改。计算机动画是采用连续播放静止图像的方法产生物体运动的效果。计算机动画的关键技术体现在计算机动画制作软件及硬件上。计算机动画是计算机图形学和艺术相结合的产物,它是伴随着计算机硬件和图形算法高速发展起来的一门高新技术,它综合利用计算机科学、艺术、数学、物理学和其它相关学科的知识在计算机上生成绚丽多彩的连续的虚拟真实画面,给人们提供了一个充分展示个人想象力和艺术才能的新天地。其中三维动画特技可以说是电脑动画技术中的一大难题,因为这需要非常强大的软件和运算能力极强的硬件平台。当然,它所带来的视觉效果也是无可比拟的。当侏罗纪公园、第五元素、泰坦尼克号这些影片中逼真的恐龙、亦真亦幻的
28、未来城市和巨大的“泰坦尼克号”让人沉浸在现代电影所营造的“真实”世界里时,你可知道创造了这些令人难以置信的视觉效果的幕后英雄是众多的三维动画制作软件和视频特技制作软件。好莱坞的电脑特技师们正是借助这些非凡的软件,把他们的想像发挥到极限,也带给了我们无比的视觉享受。三维动画特技制作包含了数字模型构建、动画生成、场景合成三大环节,而三维扫描、表演动画、虚拟演播室等新技术,恰恰给这三大环节都带来了全新的技术突破。综合运用这些新技术,可望获得魔幻般的特技效果,彻底改变动画制作的面貌。可以想像,先用三维扫描技术对一个80岁的白发老太太进行扫描,形成一个数字化人物模型,然后将乔丹的动作捕捉下来,用以驱动老
29、人模型的运动,观众将会看到80岁老妪空中扣篮的场面。甚至还可以用演员的表演驱动动物的模型,拍摄真正的动物王国故事。利用表演动画技术还可以实现网上或电视中的虚拟主持人。4.2 动画在OpenGL中的实现 在C语言编程机制下实现OpenGL动画,主要是通过调用OpenGL API函数库来实现,以下便是具体的实现代码框架。void main(void)glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);/指定一个双缓冲窗口,这使得所有绘图代码都在画面外缓冲区进行渲染。glutCreateWindow("NAME");glutDisplayFun
30、c(RenderScene);/调用RenderScene函数绘制当前窗口glutTimerFunc(33, TimerFunction, 1);/登记一个回调函数,经过设定的时间值后由GLUT调用该函数。glutMainLoop();/这个函数开始主GLUT事件处理循环。/主函数中所调用的函数定义void RenderScene(void)glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/清除颜和深度缓冲区。glColor3ub(255,0,0);/设置当前颜色为红色。glPushMatrix();/将当前矩阵压入堆栈glRotatef(
31、dIst, 1.0f, 1.0f, 3.0f);/所画物体绕经过(0,0,0),(1,1,3)的矢量逆时针旋转dIst的角度。glTranslatef(10.0f,0.0f, 0.0f);/将所化物体沿X轴平移10个单位。glutSolidSphere(8.0f, 15, 15);/画一个实心圆。glPopMatrix();/弹出先前所压矩阵dIst += 10.0f;if(dIst > 360.0f)dIst = 0.0f;glutSwapBuffers();/在双缓冲模式下进行一次缓冲区交换。void TimerFunction (int value)glutPostRedispla
32、y();/刷新当前窗口glutTimerFunc(33, TimerFunc, 1);上述相关代码主要完成了在屏幕上绘制一个绕经过(0,0,0),(1,1,3)的矢量逆时针旋转的小球。每隔33毫秒刷新一次。具体运行结果如图1所示: 图1. C语言环境下滚动的小球5 飘动国旗的绘制 5.1 论文中相关的OpenGL 命令格式以及功能:GLfloatxrot;/定义旋转轴。GLfloatyrot以及GLfloatzrot 也是类似GLfloat hold;/暂时持有一个浮点值GLuinttexture1;/存储一个纹理(新)glGenTextures(1, &texture0);/创建纹理
33、GLvoid ReSizeGLScene(GLsizei width, GLsizei height)/调整和初始化冰川glViewport(0,0,width,height);/重置当前视图glMatrixMode(GL_PROJECTION);/投影选择glLoadIdentity();/重置投影矩阵gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);glMatrixMode(GL_MODELVIEW);/ 选择模型视图矩阵glLoadIdentity();/ 重置模型视图矩阵glEnable(GL_TEXTUR
34、E_2D);/ Enable Texture Mapping ( NEW ) 纹理映射glShadeModel(GL_SMOOTH);/ Enable Smooth Shading 使光滑着色glClearColor(0.0f, 0.0f, 0.0f, 0.5f);/ 黑色背景glClearDepth(1.0f);/黑色背景glEnable(GL_DEPTH_TEST); / 用于启用某OpenGL系统功能的子程序为glEnable(GLenum feature),同样的用于终止某系统功能的子程序为glDisable(GLenum feature)。一共有六十多个供着两个子程序使用的枚举型符号
35、常熟参数值。此处就是启用深度测试。glDepthFunc(GL_LEQUAL);/ 深度类型测试glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);/ reallynice角度计算glPolygonMode( GL_BACK, GL_FILL );/ 背面(后面)应该以填充区域的方式绘制glPolygonMode( GL_FRONT, GL_LINE );/正面(前面)应该以边界的方式填充glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/调用glClear来对图像缓冲器进行清除。本条命令就是清
36、除屏幕和深度缓冲区。glLoadIdentity();/ Reset The View 重置视图glTranslatef(0.0f,0.0f,-12.0f);/ 平移变换。该函数有三个分别代表Tx,Ty和Tz的GLfloat类型的参数。首先建立一个相应的平移矩阵M,然后用M去右乘当前的矩阵C。结果是经过修改的当前矩阵代表CM的综合效应。 glRotatef(xrot,1.0f,0.0f,0.0f); /旋转变换。该函数有四个GLfloat 类型的参数:angle,x,y和z。旋转式按反时针方向围绕从原点到(x,y,z)的轴惊醒,旋转角度则有排在最前面的参数angle以度为单位制定。该函数首先建
37、立一个相应的旋转矩阵M,然后用M去右乘当前的矩阵C。glVertex3f( pointsxy+10, pointsxy+11, pointsxy+12 );/glVertex2,3,4s i f d (TYPE x,.) 这里的2,3,4代表参数数目上的三种选择:2,3,或4;s i f d 表示数据类型上的四种选择:s, i, f或d;TYPE 则是相对应的OpenGL类型的名称。如这里需要三个GLfloat参数。glTexCoord2f( float_xb, float_y ); 画图形时启用纹理(贴图)对应的坐标。void glTexCoord2f(GLfloat s,GLfloat t
38、);参数说明 GLfloat是float类型,s 表示纹理(贴图)glEnd();相关的点、线、多边形序列的结束标志。glFush();/结束命令。表示遇到它之前的所有的OpenGL命令已经执行完。GLvoid KillGLWindow(GLvoid)/ 妥善销毁窗口此次的论文设计的主要任务是选用一张平面的纹理文件Tim.bmp (见附录),然后利用相关的OpenGL、MFC 知识以及动画实现的相关理论,使得一幅静态图画“动”起来,达到飘动的效果。5.2 飘动国旗的绘制过程在代码目录下创建一个data目录,将所采用的位图(纹理文件Tim.bmp)载入data目录下,当然它的尺寸必须适合Open
39、GL纹理的要求。先打开Visual C+并在其他的#inlude之后,添加如下的代码。这将引入在程序中将要用到的复杂数学函数sin()和cos()。 #include <math.h> / 引入数学函数库中的Sin我们将使用points数组来存放网格各顶点独立的x,y,z坐标。这里网格由45×45点形成,换句话说也就是由44格×44格的小方格子依次组成了。wiggle_count用来指定纹理波浪的运动速度。每3帧一次看起来很不错,变量hold将存放一个用来对旗形波浪进行光滑的浮点数。这几行添加在程序头部,位于最后一行#include之后、GLuint textu
40、re1之前的位置。float points 45 45 3; / Points网格顶点数组int wiggle_count = 0; / 指定旗形波浪的运动速度GLfloat hold; / 临时变量,存放对旗形波浪进行光滑的浮点数然后下移至LoadGLTextures()子过程。使用的纹理文件名是Tim.bmp。用LoadBMP ("Data/Tim.bmp")载入纹理文件Tim.bmp。if (TextureImage0=LoadBMP("Data/Tim.bmp") / 载入位图接着在InitGL()函数的尾部return TRUE之前,添加如下的
41、代码。 glPolygonMode( GL_BACK, GL_FILL ); / 后(背)表面完全填充glPolygonMode( GL_FRONT, GL_LINE ); / 前(正)表面使用线条绘制上面的代码指定使用完全填充模式来填充多边形区域的背面(或者叫做后表面)。相反,多边形的正面则使用轮廓线填充了。这些方式完全取决于您的个人喜好,并且与多边形的方位或者顶点的方向有关。 接着上面的代码并在return TRUE这一句之前,添加如下的几行。/ 沿X平面循环for(int x=0; x<45; x+)/ 沿Y平面循环for(int y=0; y<45; y+)/ 向表面添加波
42、浪效果pointsxy0=float(x/5.0f)-4.5f);pointsxy1=float(y/5.0f)-4.5f);pointsxy2=float(sin(x/5.0f)*40.0f)/360.0f)*3.*2.0f);上面的两个循环初始化网格上的点。使用整数循环可以消除由于浮点运算取整造成的脉冲锯齿的出现。我们将x和y变量都除以5,再减去4.5。这样使得我们的波浪可以“居中”(这样计算所得结果将落在区间-4.5,4.5之间)。点xy2最后的值就是一个sin函数计算的结果。Sin()函数需要一个弧度参变量。将float_x乘以40.0f,得到角度值。然后除以360.0f再乘以PI,乘
43、以2,就转换为弧度了。接着开始编写DrawGLScene函数。int DrawGLScene(GLvoid) / 绘制我们的GL场景int x, y; / 循环变量float float_x, float_y, float_xb, float_yb; / 用来将旗形的波浪分割成很小的四边形glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); / 清除屏幕和深度缓冲glLoadIdentity(); / 重置当前的模型观察矩阵glTranslatef(0.0f,0.0f,-12.0f); / 移入屏幕12个单位glRotatef(xrot,1.0
44、f,0.0f,0.0f); / 绕 X 轴旋转glRotatef(yrot,0.0f,1.0f,0.0f); / 绕 Y 轴旋转glRotatef(zrot,0.0f,0.0f,1.0f); / 绕 Z 轴旋转glBindTexture(GL_TEXTURE_2D, texture0); / 选择纹理glBegin(GL_QUADS); / 四边形绘制开始for( x = 0; x < 44; x+ ) / 沿 X 平面 0-44 循环(45点)for( y = 0; y < 44; y+ ) / 沿 Y 平面 0-44 循环(45点)接着开始使用循环进行多边形绘制。这里使用整型可
45、以避免int ()强制类型转换。 float_x = float(x)/44.0f; / 生成X浮点值float_y = float(y)/44.0f; / 生成Y浮点值float_xb = float(x+1)/44.0f; / X浮点值+0.0227ffloat_yb = float(y+1)/44.0f; / Y浮点值+0.0227f上面我们使用4个变量来存放纹理坐标。每个多边形(网格之间的四边形)分别映射了纹理的1/44×1/44部分。循环首先确定左下顶点的值,然后我们据此得到其他三点的值。 glTexCoord2f( float_x, float_y); / 第一个纹理坐标
46、 (左下角)glVertex3f( pointsxy0, pointsxy1, pointsxy2 );glTexCoord2f( float_x, float_yb ); / 第二个纹理坐标 (左上角)glVertex3f( pointsxy+10, pointsxy+11, pointsxy+12 );glTexCoord2f( float_xb, float_yb ); / 第三个纹理坐标 (右上角)glVertex3f( pointsx+1y+10, pointsx+1y+11, pointsx+1y+12 );glTexCoord2f( float_xb, float_y ); /
47、第四个纹理坐标 (右下角)glVertex3f( pointsx+1y0, pointsx+1y1, pointsx+1y2 );glEnd(); / 四边形绘制结束上面几行使用glTexCoord2f()和glVertex3f()载入数据。需要注意的是:四边形是逆时针绘制的。这就是说,开始所见到的表面是背面。后表面完全填充了,前表面由线条组成。如果按顺时针顺序绘制的话,初始时见到的可能是前表面。也就是说将看到网格型的纹理效果而不是完全填充的。if( wiggle_count = 2 ) / 用来降低波浪速度(每隔2帧一次)每绘制两次场景,循环一次sin值,以产生运动效果。 for( y =
48、0; y < 45; y+ ) / 沿Y平面循环hold=points0y2; / 存储当前左侧波浪值for( x = 0; x < 44; x+) / 沿X平面循环/ 当前波浪值等于其右侧的波浪值pointsxy2 = pointsx+1y2; points44y2=hold; / 刚才的值成为最左侧的波浪值wiggle_count = 0; / 计数器清零wiggle_count+; / 计数器加一上面所做的事情是先存储每一行的第一个值,然后将波浪左移一下,使图象产生波浪。存储的数值挪到末端以产生一个永无尽头的波浪纹理效果。然后重置计数器 wiggle_count以保持动画的进
49、行。xrot+=0.3f; / X 轴旋转yrot+=0.2f; / Y 轴旋转zrot+=0.4f; / Z 轴旋转return TRUE; / 返回6 程序运行结果及分析6.1 程序运行结果图2 正面(前面)图3 背面(后面)6.2 程序运行结果分析本次设计中使用Point 数组来存放网格各顶点独立的x,y,z坐标wiggle_count用来指定纹理波浪的运动速度变量,设置成每隔2帧一次。hold将存放一个用来对旗形波浪进行光滑的浮点数,在填充时使用完全填充模式来填充多边形区域的背面,而正面则使用轮廓线填充调用glTranslatef()、glRotate()、glBindTexture(
50、)来分别实现平移、旋转以及选择纹理。需要注意的是:四边形是逆时针绘制的。就是说刚开始所见到的表面是背面。后表面完全填充了,前表面是由线条组成。如果是按顺时针的顺序绘制的话可能就是相反的,而不是完全填充的 在绘制时,先存储每一行的第一个值,然后将波浪左移一个,使图像产生波浪。存储的数值挪到末端以产生一个永无尽头的波浪纹理效果。然后重置计数器wiggle_count以保持动画的进行。结论本次毕业设计内容是基于OpenGL飘动国旗的设计,介绍了OpenGL的图形图像处理和实现动画的基本设计原理。这次毕业设计让我更加熟悉了从理论到实践的跨越。从查阅图书,网上资料搜索,到设计的成功,这中间有很多值得回味的地方。在基于OpenGL飘动国旗的设计设计过程中参考了大量资料,技术知识理论,相关的书籍,同时得到了指导老师一定的帮助。设计中用到了计算机图形学、VC+、深入
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 上海建设管理职业技术学院《外汇交易模拟》2023-2024学年第二学期期末试卷
- 福州英华职业学院《园林建筑设计Ⅱ》2023-2024学年第二学期期末试卷
- 宁夏幼儿师范高等专科学校《副教学训练理论与实践(1)》2023-2024学年第二学期期末试卷
- 北京理工大学《建筑消防设备工程》2023-2024学年第二学期期末试卷
- 西安航空职业技术学院《自动控制原理B实验》2023-2024学年第二学期期末试卷
- 潍坊食品科技职业学院《德育原理》2023-2024学年第二学期期末试卷
- 广州涉外经济职业技术学院《意识形态前沿问题研究》2023-2024学年第二学期期末试卷
- 民办合肥财经职业学院《精神病护理学》2023-2024学年第二学期期末试卷
- 赣州师范高等专科学校《面向对象程序设计-JAVA语言》2023-2024学年第二学期期末试卷
- 天津外国语大学《原理与应用实训》2023-2024学年第二学期期末试卷
- 封样管理规定
- 上古卷轴5所有任务代码
- 固体制剂批包装记录模版
- 2000年40个部门投入产出表
- 高空作业安全会议记录内容
- 00510秘书实务-自考整合版
- 护理研究中的偏倚及控制
- 小学生的龋齿预防ppt课件
- [复习]边坡客土吹附施工方案
- 冲压试题库及答案文档
- 管理人员责任追究制度
评论
0/150
提交评论