基于opengl的台球游戏设计内容摘要:

元都要进行一系列的逐个片元操作,这样最后的象素值 BZ 送入帧缓冲器实现图形的显示。 OpenGL 图形操作步骤 在上面说明了 OpenGL 的基本工作流程,根据这个流程可以归纳出在 OpenGL 中进行主要的图形操作直至在计算机屏幕上渲染绘制出三维图形景观的基本步骤: ( 1) 建立景物模型 根据基本图形单元建立景物模型,并且对所建立的模型进行数学描述( OpenGL 中把:点、线、多边形、图像和位图都作为基本图形单元)。 ( 2) 景物位置设置 把景物模型放在三维空间中的合适的位置,并且设置视点( viewpoint)以观察所感兴趣的景观。 ( 3) 物体颜色,纹理处理 计算模型中所有物体的色彩,其中的色彩根据应用要求来确定,同时确定关照条件、纹理粘贴方式等。 ( 4) 景物模型光栅化 把景物模型的数学描述以及色彩信息转换至计算机屏幕上的像素,这个过程也就是光栅化( rasterization)。 在这些步骤的执行过程中, OpenGL 可能执行其他的一些操作,例如自动消隐处理 10 等。 另外景物光栅化之后被送入帧缓冲器之前可以根据需要对象素数据进行操作。 OpenGL 游戏开发需要的 技术 图形变换 通过图形变换,可由简单图形生成复杂图形,可用二维图形表示三维形体,甚至可以对静态图形经过快速变换而获得图形的动态显示效果。 图形变换一般是指对图形的几何信息经过几何变换 后产生的新图形.主要包括几何变换、裁减变换、投影变换和视区变换。 创建好几何模型后,只有放在三维空间中的适当位置。 并选择适当的视点及观察方向才能更有利于用户的观看。 为了观察场景中的模型,需要进行视景转换,包括视点转换、模型转换、投影转换和视口转换。 OpenGL 将物体的各个顶点通过各种变换矩阵的作用影射到屏幕上。 通过模型变换可以改变物体的位置和尺寸, 相应的函数有glTranlate*(), glRotate*(), glScale*(),这三条命令相当于生成平移、旋转和缩放的矩阵,并以此矩阵作为参数,然后调用 glMuhiMatrix*()。 视点变换是改变视点的位置和方向,应用程序库函数 gluLookAt()来定义视线的方向,这个函数封装了一系列的平移和旋转变换的命令。 调用 gluLookAt()函数执行视点转换,确定观察物体的视点位置和方向;利用模型转换对模型进行平移、旋转和缩放操作,以确定物 体在场景中的位置和方向,其投影方式类似于人眼的视觉机制。 用于增加图形的真实感。 函数 gluPerspective()和glOrtho()用来定义投影方式:透视投影和正视投影;视区是用来显示图像的窗口中的一个矩形区域。 glViewport()用来设置视区的大小和位置。 在 OpenGL 中,为了便于用户更加严格地限制视图体,允许定义左、有、上、下、远和近 6 个裁减面,这样程序员就可以删除场景中多余的形体。 定义一个附加裁减平面的函数是 glClipPlane()。 光照 要绘制逼真的三维物体必须进行光照处理。 没有光照的三维物体模型与二维物体没有任何差别,没有一点立体感。 只有具有光照的物体才是真正的三维物体。 OpenGL 可以控制光照与物体的关系,产生多种不同的视觉效果。 光照射到物体表面时,可能被物体吸收、反射或透射。 光的反射和透视部 分进入视觉系统使我们能看见物体。 光的颜色由其波长决定。 一束白光含有所有可见波长的光。 白光照射物体时,只有所有可见光被等量吸收物体才会呈现灰色。 如果被不等量吸收,物体会呈现其它的颜色。 光的亮度由光强决定。 从物体表面反射出来的光的强度取决于光源的位置、光强、物体材质、物体表面位置、物体表面法线和视点的位置。 ( 1) 光源组成 : 11 ① 辐射光辐射光是最简单的一种成分,它源自发光体,并且不受其它光源的影响、例如 : 太阳光和灯光。 ② 环境光有时又称为泛光,它经过环境的多次散射,已经不能确定其方向,而是好像来自各个方向。 环境光 作用于物体表面时,将沿各个方向均匀反射。 ③ 漫反射光来自一个方向,但作用于物体表面上后将沿各个方向均匀散射。 ④ 镜面反射光来自特定方向,并沿一个特定方向离开。 ( 2) 光源的创建、定位和启用 前面介绍的光源类 C3DLight 中己经提供了启用光源的接口函数。 实际上,该函数通过 OpenGL 的函数 void glLight (GLenum light, Type param, GLenumpnam)来指定光源的各种属性 1161。 其中 light 指定所定义光源的名称, OpenGL 至多支持 8 个光源,分别为 GL_LIGHTO, GL_ LIGHT1… GL_ LIGHT7。 参数 param 指定所需设定的参数名称,参数 pnam 为指向 param 所指定属性值的指针。 它可以指向一个数组,也可以指向一个值。 对于每个给定的光源,通过设定参数 param 为 GL_ AMBIENT、 GL_ DIFFUSE 和GL_ SPECULAR 来定义环境光、漫反射光、镜面反射光的属性, pname 为指向一个对应的颜色值。 OpenGL 中光源分为定向光源和定位光源两种。 光源定位时设置 pname 参数为 GL_ POSITION, param 指向光源位置的坐标数组,光源位置的 三维齐次坐标 (x,y, 2, w)的第四个分量,的值决定此光源为定向光源还是定位光源。 当 w 为零时,所定义的为定向光源,其方向由 (x, y, z)决定。 当 w 为非零时,所定义的为定位光源,此时 (x, y, z)代表光源的坐标值。 定位光源的确定位置决定了场景中物体表面的入射方向。 材质 物体的材质是指物体表面对光的反应特性,通常分为三种 :反射性能、透射性能、吸收性能。 为了模拟这个物理过程,计算机图形设计需要建立物体的材质模型。 一种材质由环境色、扩散色、镜面高亮色等组成,分别说明了它对环境光、漫反射光和镜面光反射的多少,即反射率。 物体材质影响物体的颜色、反光度、透明度等。 假设一个只反射蓝光的物体,在一束白光的照射下就呈蓝色。 一般来说,物体对环境光和漫反射的反射方式是相同的,因而对环境光和漫反射光的反射率基本上是相等的。 但是,物体对于镜面反射光的反射率是由镜面反射光决定的,且物体的高亮色基本上与镜面反射光的颜色是相同的。 如果一个物体在青色光的照射下呈现蓝色,只需设定物体的环境色和扩散色均为蓝色即可。 为了让它看起来自身能够发光,可以用辐射光来模拟自体发光的物体。 12 OpenGL 通过函数 void glMaterial{f, i, f} [v] (Glenum face, Glenumpname,TYPE* param)来定义光照计算中所采用的材质 Del。 参数 face 的值 GL FRONT, GL_ BACK, GLFRONTANDBACK,分别指定应用所定义材质参数的是物体的正面、背面、还是同时应用于正反两面,函数中所定义的材质参数由 pname 来指定,其值由 par 二给定。 光照与材质的关系 创建光源和材质后,如果不启用光照处理,顶点的颜色由当前颜色值确定,启用光照处理后,顶点颜色计算将在视觉坐标系按光照计算 公式进行。 如果一束光的 RGB 值为 (LR, LG, LB),被照材质的 RGB 值为 (MR, MG, MB) , 则在不考虑其他反射效果的情况下, 眼睛所看到的颜色由 (LR*MR, LG*MG, LB*MB)决定。 与此类似,如果到达眼睛的两束光的 RGB 值分别为 (R1, G1, B1)和 (R2, B2, G2),则OpenGL 将对应的值相加,得到 (R1+R2,G1+G2,B1+B2)。 不管哪一个相加结果大于 1 都视为 1。 纹理映射 在三维图形绘制中,纹理映射是广泛使用的,同时纹理映射也是一个相当复杂的过程 ,采用一般的技术,纹理映射将是一个很浩大的工程, OpenGL 提供了一种简单的纹理映射的方法,它可以将扫描的物体,真实纹理映射到绘制的三维物体的表面,从而大大减少了纹理映射的工作。 比如绘制一面砖墙,就可以用一幅真实的砖墙图像或照片作为纹理贴到一个矩形上,这样,一面逼真的砖墙就画好了。 如果不用纹理映射的方法,则墙上的每一块砖都必须作为一个独立的多边形来画。 另外,纹理映射能够保证在变换多 边形时,多边形上的纹理图案也随之变化。 例如,以透视投影方式观察 桌面 时,离视点远的砖块的尺寸就会缩小,而离视点较近的就会大些。 此外 ,纹理映射也常常运用在其他一些领域,如飞行仿真中常把一大片植被的图像映射到一些大多边形上用以表示地面,或用大理石、木材、布匹等自然物质的图像作为纹理映射到多边形上表示相应的物体。 使用纹理映射需要几个步骤:指定纹理、指定纹理应用方式、激活纹理映射、指定纹理坐标和几何坐标。 在本次设计中,使用的纹理数据格式是 BMP 文件的图像格式,BMP 的结构比较简单,属于一种图形、图像数据的通用格式。 主要使用 BMP 文件的数据格式完成对桌面绘制。 13 第 三 章 台球游戏具体实现 在 MFC 中设计游戏显示的框架 台球游戏是用 OpenGL 和 MFC 框架共同实现的 3D 游戏,设计台球游戏的时候第一步首先是设计运行游戏的时候所需要的框架,利用了 MFC 里面视图类中的基于对话框的设计来完成对游戏整体框架的设计主要有四个大部分组成,分别是由菜单栏和工具栏,控制力量框架,游戏类型框架和游戏大厅界面。 如图 所示: 14 图 框架流程图 Figure frame of flow chart ( 1) 菜单栏和工具栏,菜单栏设置为了方便用户的选择和利用快捷键来操作游戏。 而工具栏是为了设置各种选择角度,对于游戏界面的放大和缩小,加入和新建游戏的图标工具,此外还可以根据这个工具栏中的选择工具来控制操作台球游戏的球杆的方向和力度。 ( 2) 控制力量框架,在这里可以显示选择的力量的大小,根据显示线条的长短来调整对台球球杆的力量的控制,利用鼠标来改变箭头的方向改变对球杆的方向的改变。 利用这这个显示窗口可以方便的控制球杆。 ( 3) 游戏类型框架,这个框架类是来自对话框的公有继承,这个框架的主要功能是为了加 入游戏,还是新建游戏。 ( 4) 游戏大厅界面,台球的显示和操作的界面都是在这个框架下面实现。 是台球游戏核心框架。 主要功能是为了显示台球球体以及在碰撞运行过程。 此外还要显示台球桌面。 以及台球在桌面停放的位置。 在 MFC 中使用 OpenGL 设计台球游戏 根据 上述三维虚拟台球 游戏的功能要求,将该 游戏程序 划分为 以下 模块 ,其结构如图 所示: 游戏框架 菜单栏和工具栏 游戏大厅界面 游戏类型框架 控制力量框架 15 图 界面流程 图 Figure interface flowchart ● 窗口模块 创建 windows 窗口处理消息 ● 场景模块 管理整个演示程序中的对象 ● 台球界面模块 用于 游戏界面的显示 ● 数学模型模块 用于大量的矩阵运算 ● 模型控制模块 键盘 鼠标 控制模型位置和方向 及运动 ● 几何模型模块 几何模型的绘制 ● 桌面 用于承载台球的桌面的绘制(主桌面、桌角和桌边) ● 球体 用于运动球体的绘制(有一个母球、 7 个蓝球和 8 个红球) ● 箭头 用于控制力量的箭头的绘制 ● 运动模拟模块 解 决球杆与球、球与球及球与球桌边界的碰撞和运动 ● 变换模块 用于实现观察者的变换 整个场景的绘制是程序的核心,主要包括静态场景和动态场景两部分内容的绘制;模型控制模块用于实现球体的运动,球体的碰撞的具体实现,视角变换;几何模型模块是用于完成一些矢量计算和矩阵的计算。 使用 OpenGL 具体实现台球 桌面 球桌是有三部分组成的,每个部分都是有一个填充的四边形组成,四边形的颜色需要用纹理处理。 然后纹理的初始化需要三种纹理,三种纹理分别是台球四周木质暗红色纹理、台球主桌面纹理、木质纹理和主 桌面之间的过滤纹理(阴影纹理)。 台球桌根据纹理的分类,设计主桌面,桌角和桌边。 台球桌面的设计流程,如图 所示 : 场景模块 台球界面 模块 模型控制模块 运动模拟模块 窗口模块 几何模型模块 数学模型模块 变换 模块 桌面 箭头 球体 16 图 桌面流程图 Figure playground flowchart 根据 OpenGL 纹理映射绘制主桌面,桌角和桌边。 纹理映射的基本步骤如下:定义纹理; 绑定 纹理;控制滤波;说明纹理映射方式;绘制场景,给出顶点的纹理坐标和几何坐标。 ( 1) 二维纹理定义 : void glTexImage2D(GLenum target,GLint level,GLint ponents, GLsizei width,Glsizei height,GLint border, GLenum format,GLenum type,const GLvoid。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。