基于OpenGL的台球游戏设计_第1页
基于OpenGL的台球游戏设计_第2页
基于OpenGL的台球游戏设计_第3页
基于OpenGL的台球游戏设计_第4页
基于OpenGL的台球游戏设计_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

1、摘要2abstract.2引言4第一章 开发平台的选择和opengl61.1 开发平台介绍61.2 在开发平台下选择的开发工具61.2.1 visual c+ 6.0的简介61.3 opengl基础的介绍71.4 vc+与opengl关系8第二章 opengl 3d游戏开发技术92.1 opengl 工作流程92.2 opengl 图形操作步骤102.3 opengl 游戏开发需要的技术112.3.1图形变换112.3.2 光照112.3.3 材质122.3.4 光照与材质的关系132.3.5 纹理映射13第三章 台球游戏具体实现153.1 在mfc中设计游戏显示的框架153.2 在mfc中使

2、用opengl设计台球游戏153.2.1 使用opengl具体实现台球桌面163.2.2 使用opengl具体实现台球球体213.2.3 使用opengl具体实现绘制方向箭头253.2.4 利用opengl实现变换273.2.5 数学模型实现293.2.6 运动模型实现31第四章 总结与展望394.1 研究内容总结394.2 存在的不足和未来的工作39参考文献39致 谢40基于opengl的台球游戏设计摘要:opengl被认为是高性能图形和交互式视景处理的标准,可以制作出更顺畅的3d效果。由大量功能强大的图形函数组成,集成了所有曲面造型、图形变换、光照、材质、纹理、像素操作、融合、反选择、雾化

3、等复杂的计算机图形学算法。vc+是一种语法比较灵活和编译后的可执行程序的运行速度快,面向对象的高级语言,特别适合利用opengl的图形引擎开发图形处理软件。该游戏主要完成了游戏的界面的设计,以及游戏中球体运动,碰撞的实现。该游戏的一个重要特点是利用了opengl和vc+制作,通过模型建立、光源设置、材质设置、纹理处理、碰撞检测、运动模拟等将真实世界中的台球游戏在计算机中再现。本游戏在vc+6.0平台下开发,主要利用opengl三维图形处理的功能,以及编程思路和实现过程。关键词:opengl;三维图形;3d游戏;碰撞检测;opengl-based billiards game designabs

4、tract: opengl is the high performance graphics and interactive view disposal standard, composed of lots of graphics functions with strong function, integrating many computer graphics algorithms such as graphics transformation, lighting, texture mapping, pixel operation, blending, anti-aliasing, fog,

5、 etc. vc+ is an object-oriented language with flexible grammar and fast execution speed after compiling, so it adapts to opengl engine graphics processing software.therefore, this game design major to complete user interface digsn,as well as the ball movement and implementation of collision in the g

6、ame,the game design is an important characteristic of the use of opengl and vc + +.through model establishment , scene disposal, collision detection,lighting and metarial setup,texture mapping motion simulation, etc, the billiard in the real world reappears in the computer. the software development

7、platform is vc + +6.0.this paper discusses the functions and features of opengl as well as the procedure and implementation of 3d billiards. key words: opengl;three-dimension graphics;3d games;collision detection引言最近几年,随着计算机信息技术的高速发展,以及计算机图形学的发展使得三维表现技术得以形成,这些三维表现技术能够再现三维世界中的物体,能够用三维物体来表示复杂的信息,从而便于和

8、计算机直接交流。这种技术已经把人和计算机的力量以一种直觉而自然的方式加以统一,这种革命性的变化无疑将极大地提高人们的工作效率。计算机三维动画技术被广泛的应用于许多方面。利用计算机和三维动画软件的强大功能,通过三维建模、材质及动画的设定可以将真实世界中的各种对象在计算机中真实再现。不仅仅是机械工程师可以从二维平面图中得以解放直接进入了三维世界,从而很快得到自己设计的三维机械零件模型。医生可以从病人的三维扫描图像分析病人的病状。军事指挥员可以面对用三维图形技术生成的战场地形,指挥具有真实感的三维飞机、军舰、坦克向目标开进并分析战斗方案的效果。而三维游戏也是其中应用之一。电脑游戏,一个对广大的计算机

9、应用者毫不陌生的名词,相信每一个电脑爱好者对其都有不同程度的喜爱,尤其是面对一些图形处理非常精美的三维游戏来说,多少会有一些爱不释手吧!记得以前我对网络游戏非常的陌生,直到有一次,在仔细观察同学正起劲的玩着当时最流行的三维网络游戏时,我看傻了眼!那精美的画面,细致的表情,流畅的动作,以及眩目的人物造型等等都让我目瞪口呆,再看到同学那副痴迷的神态,我不能不感叹这电脑游戏的魅力!所以后来在选毕业设计的课题时,我选择了这个三维台球游戏的软件开发的课题!本论文的主要研究的内容是如何利用opengl开发出一个微型游戏。因此,所要解决的主要问题有四个:一是如何用数学方法建立所需三维场景的几何描述,并将它们

10、输入到计算机中,这部分工作由三维实体造型系统完成。场景的几何描述直接影响了图形的复杂性和图形绘制的计算耗费,选择合理的有效的数据表示和输入手段是极其重要。二是将三维几何描述转换为二维透视,通过场景透视换来完成。三是确定场景中的所有可视面,这需要使用隐藏面消除算法将视域之外或其他物体的遮挡不可见面消去。四是计算机场景中所有可见面的颜色,这就需要根据基于光学物理的光照明模型计算机可见面投射到观察者眼中的光亮度的大小和色彩组成,并将它换成适合图形设备的颜色值,从而确定投影画面上每一象素的颜色,最终生成图形。鉴于时间、技术、设备、资源等各方面的原因,我现在还无法开发出一个完整的网络游戏,只能研究其最基

11、础的部分,在这里我们将开发出一个小型的三维台球游戏。借此掌握三维游戏制作的基础部分。在这基础部分实现的过程中主要完成的是对三维图形技术的应用,比如对台球的光照球体的渲染和纹理映射的实现。以及如何利用跟踪算法来跟踪台球,利用跟踪算法求得球运动速度和方向,最终确定球是落袋还是静止在桌面上某一个位置。所以该课题的应用前景十分广阔,不但锻炼了三维图形技术的实现能力,还提高了编程的总体思路,大大提高编程水平。更何况中国市场的匮乏,这无疑是一块很大的蛋糕!最后,从这个台球游戏中,我可以学到如何设计三维图形,利用opengl的三维图形技术和vc+的面向对象的程序设计的优势,来实现台球游戏的桌面和球体的绘制。

12、第一章 开发平台的选择和opengl1.1 开发平台介绍 考虑到本系统性能要求和现有的条件,我们选择了windows xp 中文版本作为开发、测试和运行的平台。我们为什么要选择windows xp中文版作为开发平台,主要是由于xp操作系统是以图形用户界面的主要优势的操作系统。那图形用户界面是由窗口(windows)、图标(icons)、菜单(menus)、指示器(pointingdevice)四位一体,形成桌面(desktop)。这种方式能同时显示不同种类的信息,使用户可在几个工作环境中切换而不丢失几个工作之间的联系,用户可通过下拉式菜单方便执行控制型和对话型任务,引入图标、按钮和滚动杆技术,

13、大大减少键盘输入,对不精于打字的用户无疑提高了交互效率。图形用户界面与命令语言界面相比的优点:与以符号为主的字符命令语言界面相比,以视觉感知为主的图形界面具有一定的文化和语言独立性,并可提高视觉目标搜索的效率。在符号阶段,用户面对的只有单一文本符号,虽然离不开视觉的参与,但视觉信息是非本质的,本质的东西只有符号和概念。在视觉阶段,借助计算机图形学技术使人机交互能够大量利用颜色、形状等视觉信息,发挥人的形象感知和形象思维的潜能,提高了信息传递的效率。1.2 在开发平台下选择的开发工具 在windows开发开发平台下,图形用户界面使得用户与程序的交流变的更加密切。不再是一种从键盘到程序,再到显示器

14、的单向信息流动,使得用户可以和显示器对象直接交互。图形用户界面使得用户不再需要花费长的时间学习如何使用极速那就或掌握新程序。windows让这这一切成真,因为一个应用程序占据一个窗口,所有窗口都有相同的基本外观和感觉。开发游戏系统的工具有一些。目前世界上流行的主流开发工具有:visual c+ 、java。经过认真分析其优缺点,结合我们选择的opengl硬件接口,我们选择了microsoft 公司推出的visual c+ 作为3d游戏的开发工具。1.2.1 visual c+ 6.0的简介visual c+ 提供了一个可视化编程的集成开发环境:visual studio(又名developer

15、 studio)。developer studio是一个通用的应用程序集成开发环境,它不仅支持visual c+,还支持visual basic,visual j+,visual interdev等microsoft系列开发工具。developer studio包含了一个文本编辑器、资源编辑器、工程编译工具、一个增量连接器、源代码浏览器、集成调试工具,以及一套联机文档。使用developer studio,可以完成创建、调试、修改应用程序等的各种操作。mircrosoft visual c+现在的版本比较多,比如有mircrosoft visual c+ 6.0,mircrosoft visu

16、al c+ 2005,mircrosoft visual c+2008等等。visual c+ 6.0是mircosoft 公司推出的micosoft visual studio 6.0系列中的拳头产品,同时也是一种c/c+编译程序,内含一个集成开发环境,简称ide(intergrated development environment)。ide包括的内容相当多,如程序编译器、资源编译器、编程向导、类向导和连接器。齐全的功能使visual c+ 6.0成为十分优秀的软件开发工具。1.3 opengl基础的介绍(1)采用opengl 的原因如下:单纯用vc+很难设计出高性能的三维图形工具,目前图

17、形开发包directx适于游戏开发以及加强多媒体性能等方面,而opengl则可以制作出更顺畅的3d效果,且opengl性能优于directx;由于microsoft公司在win95以后推出的windows操作系统中提供opengl图形标准,尤其是opengl三维图形加速卡和微机图形工作站的推出,人们可以在微机上实现三维图形应用,如cad设计。仿真模拟、三维游戏等,从而更有机会、更方便地使用opengl来建立自己的三维图形世界;opengl可以与vc+紧密接口,便于实现有关计算和图形算法,可保证算法的正确性和可靠性。(2)采用opengl 的介绍:opengl实际上是一种图形与硬件的接口。它包括

18、一百多个图形函数,开发者可以用这些函数来简历三维模型和进行三维实时交互。与其他图形程序程序接口不同,opengl提供了十分清晰明了的图形函数,因此初级的程序设计员也能利用opengl的图形处理能力很快的设计出三维图形以及三维交互软件。opengl强有力的图形函数不要求开发者把三维物体模型的数据写成固定的数据格式。这样开发者不但可以直接使用自己的数据,而且可以利用其他不同格式的数据源,这种灵活性极大的节约了开发者的时间,提高软件开发效益。长期以来从事三维图形开发的技术人员都不得不在自己的程序中编写矩阵变换、外部设备访问等函数,为调用制这些与自己的软件开发目标关系不十分密切的函数费脑筋,而open

19、gl正是提供了一种直观的编程环境,它提供了一系列函数大大地简化了三维图形程序。例如:opengl提供一系列的三维图形单元供开发者调用;opengl提供了一系列的图形变换函数;opengl提供了一系列的外部设备访问函数,是开发者可以方便的访问鼠标、键盘、空间球、数据手套等。这种直观的三维图形开发环境体现了opengl的开发优,这也是许多三维图形开发者热衷于opengl的缘由所在。opengl经过了对gl的进一步发展,实现二维和三维的高级图形技术,在性能上表现得异常优越,它包括建模、变换、光线处理、动画以及更先进的能力,如条纹映射、物体运动模糊等。opengl的这些能力为实现逼真的三维渲染效果、简

20、历交互的三维景观提供了优秀的软件开发工具。1.4 vc+与opengl关系现在流行的主流操作系统是windows 操作系统,windows操作系统主流的编译环境visual studio,broland c+ builder,dev-c+等,它们都是支持opengl的。但这里我们选择vc+ 6.0作为opengl的开发环境。做opengl游戏开发需要glut工具包,glut不是opengl所必须的,但是大多数游戏开发都是需要这个工具包。windows程序利用opengl开发游戏时候需要glut库。在windows环境下安装glut,首先要去下载一个glut库的安装包,然后解压以后有五个文件,把

21、解压得到的glut.h放到这个gl文件夹里(这个gl一般是在自己安装的mircosoft visual c+下面vc98 下面一个inlcude文件夹里面)。把解压得到的glut.lib和glut32.lib放到静态函数库所在文件夹,即lib文件夹(这个lib文件夹一般是在自己安装的mircosoft visual c+下面vc98 下面一个lib文件夹里面)。把解压得到的glut.dll和glut32.dll放到操作系统目录下面的system32文件夹内。(典型的位置为:c:windowssystem32)这是非常重要的动态链接库设置!opengl在三维图形技术方面有很大的优势,相比其他的技

22、术,opengl则可以制作做更加流畅的3d效果,从而更有机会、更方便地使用opengl来建立自己的三维图形世界。利用了opengl的三维图形技术和vc+ 的程序设计的优点,开发出来的图形程序更加流畅和容易实现。第二章 opengl 3d游戏开发技术2.1 opengl 工作流程opengl实际上是一种图形与硬件的接口。它包括100多个图形函数,开发者可以用这些函数来简历三维模型和进行三维实时交互。正如我们上一章所述,opengl是一个高性能的图形开发软件包。opengl作为一个与硬件独立的图形接口,它不提供与硬件密切相关的设备操作函数,同时,它也不提供描述类似飞机、汽车、分子形状等复杂形体的图

23、形操作函数。用户必须从点、线、面等最基本的图形单元开始构造自己的三维模型。因此opengl的图形操作函数十分灵活。opengl提供了以下三维物体的绘制方式。(1)网络线绘图方式(wireframe):这种仅绘制三维物体的网络轮廓线。(2)深度优先网络绘制方式(depth_cued):用网格线方式绘图,模拟人眼看物体的方式,远处的物体比近处的物体要暗一些。(3)反走样网络线绘制方式(antialiased):用网格线方式绘图,绘图时采用反走样技术减少图形线的参次不齐。(4)平面消隐绘图方式(flat_shade):对模型的隐藏面进行消隐,对模型的平面单元按照程度进行着色但不进行光滑处理。(5)光

24、滑消隐绘图方式(smooth_shade):对模型进行消隐,关照渲染着色的过程中再进行光滑处理,这种方式更接近于现实。(6)加阴影和纹理的绘图方式(shadows和textures):在模型表面贴上纹理甚至于加上光照阴影,使得三维景观像照片一样。(7)运动模糊的绘制方式(motion-blured):模拟物体运动时人烟观察所感觉的动感现象。(8)大气环境效果(atmospere-effects):在三维景观中加入大气环境效果,使人身临其境。(9)深度域效果(depth-of-effects):类似于照相机镜头效果,模型在聚焦点处清晰,反之则模糊。整个opengl的基本工作流程如下图:图2.1

25、opengl基本工作流程图figure 2.1 opengl basic of flaw chart其中几何顶点数据包括模型的顶点集、线集、多边形集,这些数据经过流程图的上部,包括运算器、逐个顶点操作等;图像数据包括象素集、影像集、位图集等,图像象素数据的处理方式与几何顶点数据的处理方式是不同的,但它们都经过光栅化、逐个片元(fragment)处理直至把最后的光栅数据写入帧缓冲器。在opengl中的所有数据包括几何顶点数据和象素数据都可以被存储在显示列表中或者立即可以得到处理。opengl中,显示列表技术是一项重要的技术。opengl要求把所有的几何图形单元都用顶点来描述,这样运算器和逐个顶点

26、计算操作都可以针对每个顶点进行计算和操作,然后进行光栅化形成图形碎片;对于象素数据,象素操作结果被存储在纹理组装用的内存中,再象几何顶点操作一样光栅化形成图形片元。整个流程操作的最后,图形片元都要进行一系列的逐个片元操作,这样最后的象素值bz送入帧缓冲器实现图形的显示。2.2 opengl 图形操作步骤在上面说明了opengl 的基本工作流程,根据这个流程可以归纳出在opengl中进行主要的图形操作直至在计算机屏幕上渲染绘制出三维图形景观的基本步骤:(1)建立景物模型根据基本图形单元建立景物模型,并且对所建立的模型进行数学描述(opengl 中把:点、线、多边形、图像和位图都作为基本图形单元)

27、。(2)景物位置设置把景物模型放在三维空间中的合适的位置,并且设置视点(viewpoint)以观察所感兴趣的景观。(3)物体颜色,纹理处理计算模型中所有物体的色彩,其中的色彩根据应用要求来确定,同时确定关照条件、纹理粘贴方式等。(4)景物模型光栅化把景物模型的数学描述以及色彩信息转换至计算机屏幕上的像素,这个过程也就是光栅化(rasterization)。在这些步骤的执行过程中,opengl可能执行其他的一些操作,例如自动消隐处理等。另外景物光栅化之后被送入帧缓冲器之前可以根据需要对象素数据进行操作。2.3 opengl 游戏开发需要的技术2.3.1图形变换通过图形变换,可由简单图形生成复杂图

28、形,可用二维图形表示三维形体,甚至可以对静态图形经过快速变换而获得图形的动态显示效果。图形变换一般是指对图形的几何信息经过几何变换后产生的新图形主要包括几何变换、裁减变换、投影变换和视区变换 。创建好几何模型后,只有放在三维空间中的适当位置。并选择适当的视点及观察方向才能更有利于用户的观看。为了观察场景中的模型,需要进行视景转换,包括视点转换、模型转换、投影转换和视口转换。opengl将物体的各个顶点通过各种变换矩阵的作用影射到屏幕上。通过模型变换可以改变物体的位置和尺寸, 相应的函数有gltranlate*(),glrotate*(),glscale*(),这三条命令相当于生成平移、旋转和缩

29、放的矩阵,并以此矩阵作为参数,然后调用glmuhimatrix*()。视点变换是改变视点的位置和方向,应用程序库函数glulookat()来定义视线的方向,这个函数封装了一系列的平移和旋转变换的命令。调用glulookat()函数执行视点转换,确定观察物体的视点位置和方向;利用模型转换对模型进行平移、旋转和缩放操作,以确定物体在场景中的位置和方向,其投影方式类似于人眼的视觉机制。用于增加图形的真实感。函数gluperspective()和glortho()用来定义投影方式:透视投影和正视投影;视区是用来显示图像的窗口中的一个矩形区域。glviewport()用来设置视区的大小和位置。在open

30、gl中,为了便于用户更加严格地限制视图体,允许定义左、有、上、下、远和近6个裁减面,这样程序员就可以删除场景中多余的形体。定义一个附加裁减平面的函数是glclipplane()。2.3.2 光照要绘制逼真的三维物体必须进行光照处理。没有光照的三维物体模型与二维物体没有任何差别,没有一点立体感。只有具有光照的物体才是真正的三维物体。opengl可以控制光照与物体的关系,产生多种不同的视觉效果。光照射到物体表面时,可能被物体吸收、反射或透射。光的反射和透视部分进入视觉系统使我们能看见物体。光的颜色由其波长决定。一束白光含有所有可见波长的光。白光照射物体时,只有所有可见光被等量吸收物体才会呈现灰色。

31、如果被不等量吸收,物体会呈现其它的颜色。光的亮度由光强决定。从物体表面反射出来的光的强度取决于光源的位置、光强、物体材质、物体表面位置、物体表面法线和视点的位置。(1)光源组成:辐射光辐射光是最简单的一种成分,它源自发光体,并且不受其它光源的影响、例如:太阳光和灯光。环境光有时又称为泛光,它经过环境的多次散射,已经不能确定其方向,而是好像来自各个方向。环境光作用于物体表面时,将沿各个方向均匀反射。漫反射光来自一个方向,但作用于物体表面上后将沿各个方向均匀散射。镜面反射光来自特定方向,并沿一个特定方向离开。(2)光源的创建、定位和启用前面介绍的光源类c3dlight中己经提供了启用光源的接口函数

32、。实际上,该函数通过opengl的函数void gllight (glenum light, type param, glenumpnam)来指定光源的各种属性1161。其中light指定所定义光源的名称,opengl至多支持8个光源,分别为gl_lighto,gl_ light1gl_ light7。参数param指定所需设定的参数名称,参数pnam为指向param所指定属性值的指针。它可以指向一个数组,也可以指向一个值。对于每个给定的光源,通过设定参数param为gl_ ambient、gl_ diffuse和gl_ specular来定义环境光、漫反射光、镜面反射光的属性,pname为指

33、向一个对应的颜色值。opengl中光源分为定向光源和定位光源两种。光源定位时设置pname参数为gl_ position, param指向光源位置的坐标数组,光源位置的三维齐次坐标(x,y,2,w)的第四个分量,的值决定此光源为定向光源还是定位光源。当w为零时,所定义的为定向光源,其方向由(x,y,z)决定。当w为非零时,所定义的为定位光源,此时(x, y, z)代表光源的坐标值。定位光源的确定位置决定了场景中物体表面的入射方向。2.3.3 材质物体的材质是指物体表面对光的反应特性,通常分为三种:反射性能、透射性能、吸收性能。为了模拟这个物理过程,计算机图形设计需要建立物体的材质模型。一种材质

34、由环境色、扩散色、镜面高亮色等组成,分别说明了它对环境光、漫反射光和镜面光反射的多少,即反射率。物体材质影响物体的颜色、反光度、透明度等。假设一个只反射蓝光的物体,在一束白光的照射下就呈蓝色。一般来说,物体对环境光和漫反射的反射方式是相同的,因而对环境光和漫反射光的反射率基本上是相等的。但是,物体对于镜面反射光的反射率是由镜面反射光决定的,且物体的高亮色基本上与镜面反射光的颜色是相同的。如果一个物体在青色光的照射下呈现蓝色,只需设定物体的环境色和扩散色均为蓝色即可。为了让它看起来自身能够发光,可以用辐射光来模拟自体发光的物体。opengl通过函数void glmaterialf, i, f v

35、 (glenum face, glenumpname,type* param)来定义光照计算中所采用的材质del。参数face的值gl front, gl_ back, gl-front-and-back,分别指定应用所定义材质参数的是物体的正面、背面、还是同时应用于正反两面,函数中所定义的材质参数由pname来指定,其值由par二给定。2.3.4 光照与材质的关系创建光源和材质后,如果不启用光照处理,顶点的颜色由当前颜色值确定,启用光照处理后,顶点颜色计算将在视觉坐标系按光照计算公式进行。如果一束光的rgb值为(lr, lg, lb),被照材质的rgb值为(mr, mg, mb) ,则在不考

36、虑其他反射效果的情况下, 眼睛所看到的颜色由(lr*mr, lg*mg, lb*mb)决定。与此类似,如果到达眼睛的两束光的rgb值分别为(r1, g1, b1)和(r2, b2, g2),则opengl将对应的值相加,得到(r1+r2,g1+g2,b1+b2)。不管哪一个相加结果大于1都视为1。2.3.5 纹理映射在三维图形绘制中,纹理映射是广泛使用的,同时纹理映射也是一个相当复杂的过程,采用一般的技术,纹理映射将是一个很浩大的工程,opengl提供了一种简单的纹理映射的方法,它可以将扫描的物体,真实纹理映射到绘制的三维物体的表面,从而大大减少了纹理映射的工作。比如绘制一面砖墙,就可以用一幅

37、真实的砖墙图像或照片作为纹理贴到一个矩形上,这样,一面逼真的砖墙就画好了。如果不用纹理映射的方法,则墙上的每一块砖都必须作为一个独立的多边形来画。另外,纹理映射能够保证在变换多边形时,多边形上的纹理图案也随之变化。例如,以透视投影方式观察桌面时,离视点远的砖块的尺寸就会缩小,而离视点较近的就会大些。此外,纹理映射也常常运用在其他一些领域,如飞行仿真中常把一大片植被的图像映射到一些大多边形上用以表示地面,或用大理石、木材、布匹等自然物质的图像作为纹理映射到多边形上表示相应的物体。使用纹理映射需要几个步骤:指定纹理、指定纹理应用方式、激活纹理映射、指定纹理坐标和几何坐标。在本次设计中,使用的纹理数

38、据格式是bmp文件的图像格式,bmp的结构比较简单,属于一种图形、图像数据的通用格式。主要使用bmp文件的数据格式完成对桌面绘制。第三章 台球游戏具体实现3.1 在mfc中设计游戏显示的框架台球游戏是用opengl和mfc框架共同实现的3d游戏,设计台球游戏的时候第一步首先是设计运行游戏的时候所需要的框架,利用了mfc里面视图类中的基于对话框的设计来完成对游戏整体框架的设计主要有四个大部分组成,分别是由菜单栏和工具栏,控制力量框架,游戏类型框架和游戏大厅界面。如图3.1所示:游戏框架菜单栏和工具栏游戏大厅界面游戏类型框架控制力量框架图3.1 框架流程图figure 3.1 frame of f

39、low chart(1)菜单栏和工具栏,菜单栏设置为了方便用户的选择和利用快捷键来操作游戏。而工具栏是为了设置各种选择角度,对于游戏界面的放大和缩小,加入和新建游戏的图标工具,此外还可以根据这个工具栏中的选择工具来控制操作台球游戏的球杆的方向和力度。(2)控制力量框架,在这里可以显示选择的力量的大小,根据显示线条的长短来调整对台球球杆的力量的控制,利用鼠标来改变箭头的方向改变对球杆的方向的改变。利用这这个显示窗口可以方便的控制球杆。(3)游戏类型框架,这个框架类是来自对话框的公有继承,这个框架的主要功能是为了加入游戏,还是新建游戏。(4)游戏大厅界面,台球的显示和操作的界面都是在这个框架下面实

40、现。是台球游戏核心框架。主要功能是为了显示台球球体以及在碰撞运行过程。此外还要显示台球桌面。以及台球在桌面停放的位置。3.2 在mfc中使用opengl设计台球游戏根据上述三维虚拟台球游戏的功能要求,将该游戏程序划分为以下模块,其结构如图3.2所示:场景模块台球界面模块模型控制模块运动模拟模块窗口模块几何模型模块数学模型模块变换模块桌面箭头球体图3.2 界面流程图figure 3.2 interface flowchart 窗口模块 创建windows窗口处理消息 场景模块 管理整个演示程序中的对象 台球界面模块 用于游戏界面的显示 数学模型模块 用于大量的矩阵运算 模型控制模块 键盘鼠标控制

41、模型位置和方向及运动 几何模型模块 几何模型的绘制 桌面 用于承载台球的桌面的绘制(主桌面、桌角和桌边) 球体 用于运动球体的绘制(有一个母球、7个蓝球和8个红球) 箭头 用于控制力量的箭头的绘制 运动模拟模块 解决球杆与球、球与球及球与球桌边界的碰撞和运动 变换模块 用于实现观察者的变换整个场景的绘制是程序的核心,主要包括静态场景和动态场景两部分内容的绘制;模型控制模块用于实现球体的运动,球体的碰撞的具体实现,视角变换;几何模型模块是用于完成一些矢量计算和矩阵的计算。3.2.1 使用opengl具体实现台球桌面球桌是有三部分组成的,每个部分都是有一个填充的四边形组成,四边形的颜色需要用纹理处

42、理。然后纹理的初始化需要三种纹理,三种纹理分别是台球四周木质暗红色纹理、台球主桌面纹理、木质纹理和主桌面之间的过滤纹理(阴影纹理)。台球桌根据纹理的分类,设计主桌面,桌角和桌边。台球桌面的设计流程,如图3.3所示:桌面使用图形的绘制材质和光照的设置纹理初始化和指定纹理桌面绘制图3.3 桌面流程图figure 3.3 playground flowchart 根据opengl纹理映射绘制主桌面,桌角和桌边。纹理映射的基本步骤如下:定义纹理;绑定纹理;控制滤波;说明纹理映射方式;绘制场景,给出顶点的纹理坐标和几何坐标。(1)二维纹理定义:void glteximage2d(glenum targe

43、t,glint level,glint components,glsizei width,glsizei height,glint border,glenum format,glenum type,const glvoid *pixels);其中参数target是常数gl_texture_2d。参数level表示多级分辨率的纹理图像的级数,若只有一种分辨率,则level设为0,参数components是一个从14的整数,指出选择了r、g、b、a中的哪些分量用于调整和混合,1表示了选择了r分量,2表示选择了r和a两个分量,3表示了选择r、g、b三个分量,4表示选择了r、g、b、a 4个分量。参数

44、width和height给出了纹理图像的长度和宽度,参数border为纹理边界宽度,它通常为0,width和height必须是2m+2b,这里m是整数,长和宽可以有不同的值,b是border的值。纹理映射的最大尺寸依赖于opengl,但它至少必须是使用256x256,若width和height设置为0,则纹理映射关闭。参数format和type描述了纹理映射的格式和数据类型,format可以是gl_color_index、gl_rgb,gl_red、gl_green、gl_blue、gl_alpha、gl_luminance或者是gl_luminance_alpha。类似地,参数type是gl

45、_bype、gl_unsigned_byte、gl_short、gl_unsigned_short、gl_int、gl_unsigned_int、gl_float或gl_bitmap。参数pixels包含了纹理图像数据,这个数据描述了纹理图像本身和它的边界。(2)绑定纹理的使用:函数glbindtexture()绑定了一个纹理对象名时,将创建一个新的纹理对象,并将其纹理图像数据和纹理属性设置为默认值。接下来的函数调用gltexsubimage2d()将数据存储到纹理对象中。纹理对象中可能包含了纹理图像和相关的mipmap图像,其中包括相关的数据,如宽度、高度、边框宽度、内部格式、分量的精度和纹

46、理属性。被保存的纹理属性包括缩小滤波方法和放大滤波方法、环绕模式、边框颜色和纹理优先级。再次绑定一个纹理对象时,其数据将成为当前的纹理状态(以前绑定的纹理状态被替换掉)。void glbindtexture(glenum target,gluint texturename);此函数完成三项工作。如果参数texturename为非零的无符号整数,且首次被使用,将创建一个新的纹理对象,该纹理对象将进入活动状态;如果参数texturename为0,opengl将停止使用纹理对象,返回到未命名的默认纹理。首次绑定一个纹理对象名(创建一个纹理对象)时,参数target指定了维数,其取值为gl_textu

47、re_1d、gl_texture_2d、gl_texture_3d或gl_texture_cube_map。纹理对象刚被创建时,诸如缩小滤波方法和放大滤波方法、环绕模式、边框颜色和纹理优先级等纹理属性被设置为默认值。(3)opengl中的纹理控制:void gltexparameteri(glenum target,glenum panme,type param);控制纹素映射到片元(fragement)时怎么对待纹理。第一个参数target是gl_texture_2d,它指出了二维纹理说明参数;后两个参数的值如表3.1所示。表3.1 放大和缩小滤波方式table 3.1 magnificat

48、ion and deflation filter mode参数值gl_texture_wrap_sgl_clamp,gl_repeatgl_texture_wrap_tgl_clamp,gl_repaetgl_texture_mag_filtergl_nearest,gl_lineargl_texture_min_filtergl_nearest, gl_nearest_mipmap_nearestgl_linear,gl_nearest_mipmap_lineargl_linear_mipmap_nearestgl_linear_mipmap_linear一般来说,纹理图像为正方形或长方形。

49、但当它映射到一个多边形或曲面上并变换到屏幕坐标时,纹理的单个纹素很少对应于屏幕图像上的像素。根据所用变换和所用纹理映射,屏幕上单个像素可以对应于一个纹素的一小部分(即放大)或一大批纹素(即缩小)。下面的函数是说明放大和缩小的方法:gltexparameteri(gl_texture_2,gl_texture_mag_filter,gl_nearest);gltexparameteri(gl_texure_2d,gl_texture_min_filter,gl_nearest);实际上,第一个参数可以是gl_texture_1d或gl_texture_2d,即表明所使用的纹理是一维的还是二维;第

50、二参数指定滤波方法,其中gl_texture_mag_filter指定为放大滤波方法,gl_texture_min_filter指定为缩小滤波方法;第三个参数说明滤波方式。若选择gl_nearest则采用坐标最靠近像素中心的纹素,这有可能使图像走样;若选择gl_linear则采用最靠近像素中心的4个像素的加权平均值。gl_nearest所需计算比gl_linear要少,因而执行的更快,但gl_linear提供了比较平滑的效果。(4)映射方式:上面的例程中,纹理图下是直接作为画到多边形上的颜色。实际上,可以用纹理中的值来调整多边形(曲面)原来的颜色,或用纹理图像中的颜色与多边形(曲面)原来的颜色

51、进行混合。因此,opengl提供了3种纹理映射的方式,函数如下所示:void gltexenvifv(glenum target,glenum pname,type param);参数target必须是gl_texture_env;若参数pname是gl_textur e_env _mode,则参数param可以是gl_decal、gl_modulate或gl_blend,以说明纹理值与原来表面颜色的处理方式;若参数pname是gl_texture_en v_color,则参数是包含了4个浮点数(分别是r、g、b、a分量)的数值,这些值只在采用gl_blend纹理函数时才有用。(5)纹理坐标:

52、在绘制纹理映射场景时,不仅要给每个顶点定义几何坐标,而且也要定义纹理坐标。经过多种变换后,几何坐标决定顶点在屏幕上绘制的位置,而纹理坐标决定纹理图像中的哪一个纹素赋予该顶点。并且顶点之间的纹理坐标插值与基础篇中所讲的平滑着色插值方法相同。纹理图像是方形数组,纹理坐标通常可以定义成一、二、三或四维形式,称为s、t、r和q坐标,以区别于物体坐标(x,y,z,w)和其他的坐标。其中一维常用s坐标表示,二维坐标常用(s,t)坐标表示,在桌面纹理中忽略了r坐标,q坐标像w一样,一半值为1,主要用于建立齐次坐标。opengl坐标定义的函数是:void gltexcoord1234sifdv(type co

53、ords);设置当前纹理坐标,此后要调用glvertex*()所产生的顶点都赋予当前的纹理坐标。对于gltextcoord2f()可以设置s和t坐标值,r设置为0,q设置为1;而type的对应值(glshort、glint、glfloat或gldouble)来说明坐标的类型。要完成桌面的纹理,还需要基本图元绘制,在opengl中,所有的几何物体最终都由有一定顺序的顶点集来来描述。函数glvertex234sifdv(type coords)可以用二维、三维或齐次坐标定义顶点。在台球游戏中,使用三维glvertex3f()函数完成定义顶点。函数glbegin(glenum mode)标志描述一个

54、几何图元顶点列表的开始,相应标志完成的函数glend()。在glbegin(glenum mode)和glend()之间最重要的信息由函数glvertex3f()定义的顶点,由函数gltexcoord2f()定义纹理坐标。其参数mode表示几何图元的描述类型。相关类型以及说明如表3.2所示。表3.2 几何图元的类型table 3.2 style of geometrical primitive 类型说明gl_quads多组独立填充四边形gl_quad_strip连续填充四边形gl_line_strip不闭合折线gl_points单个顶点集利用glenable()来打开纹理、材质和关照等,完成以

55、后用gldisable()关闭纹理、材质和光照等。3.2.2 使用opengl具体实现台球球体完成桌面的绘制,需要对桌面上的台球的绘制,把球体分成了三个部分一个是母球的绘制,练习需要的红球和蓝球的绘制。相对于桌面的绘制来说,台球球体的绘制简单一些。球体绘制的基本流程如图3.4。球体绘制明暗处理光源材质母球红球蓝球 图3.4 球体流程图figure 3.4 ball flowchart球体绘制的基本步骤如下:明暗处理;光源;材质;球体绘制,给出球体的所在位置。(1)明暗处理在计算就图形学中,光滑的曲面表面常用多边形予以逼近和表示,而每个小多边形轮廓(或内部)就用单一的颜色或许多不同的颜色来勾画(

56、或填充),这种处理方法就称为明暗处理。在opengl中,用单一颜色处理的称为平面明暗处理(flat shading),用许多不同颜色处理称为光滑明暗处理(smooth shading),也称为gouraud明暗处理(gouraud shading)。设置明暗处理的函数为:void glshademodel(glenum mode);函数的参数为gl_flat或gl_smooth,分别表示了平面明暗处理和光滑明暗处理。应用平面明暗处理模式时,多边形内每个点的法向一致,且颜色也一致;应用光滑明暗处理模式时,多边形所有点的法向是由内插生成的,具有一定的连续性,因此每个点的颜色也相应内插,故呈现不同色。这种模式下,插值方法采用的是双线性插值法。本例中采用的就是光滑明暗处理。(2)光源光源有许多特性,如颜色、位置和方向等。选择不同的特性值,则对应的光源作用在物体上的效果也不一样。下面是定义光源特性的函数gllight*()函数:void gllightifv(glenum light,glenum pname,type param);创建具有某种特性的光源。其中第一个参数light指定所创建光源号,如gl_light0、gl_light1、.gl_l

温馨提示

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

评论

0/150

提交评论