26基于OpenGL的3d游戏的设计与实现Word格式文档下载.docx
《26基于OpenGL的3d游戏的设计与实现Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《26基于OpenGL的3d游戏的设计与实现Word格式文档下载.docx(39页珍藏版)》请在冰点文库上搜索。
OpenGL;
VisualStudio2005
Abstract
Withcomputersineveryhousehold,peoplearedemandingmoreandmorecomputergames,whereasthe3Dgameistomeettheneedsofpeopleinthisarea.Peopleonthegamescreen,animationisrealistic,easytooperateandgameideas,moreandmoreemphasisonstoryline.Manylarge-scale3Dgameproducedinmostforeigncountries,whiledomesticproductionofthecurrent3Dgameisnotmatureenoughyet,especiallythefidelityofthegamescreen,therearetheproductionthoughtthegame,andgameplayarestillenough.Inrecentyears,domesticproductionof3Dgamesareslowyonthetrack,inthiscontexttoincreasetheproductionofthegameonthetrainpersonnel,andstrivetobelike”WOW”,thesamelevelof3dgaming.CurrentopenGLgamescreenareatoachieveitseffectisoneofthemainstream.ThisissueisbasedonVisualStudio2005platform,3Dgame,althoughsomesimpleprocedures,butthisisthebasisforcreatingcomplex3Dgames.
Thisgameismainlycomposedoffourparts:
anglecontrol,sky,groundandmodelloading.Firstofall,necessarytoestablishthebasisofsomesystemfiles,suchasthevariousheaderfilesincludedinacollectionoffilesStdafx,tofacilitateotherdocumentscallthefunctionlibraryfile(suchastheOpenGLlibrary,mathlibraryfiles,etc.).Onthisbasis,theestablishmentofanumber,suchasfonttype(grouptobeusedtodisplaynumbers),vectortype,bitmaploadingbasicframeworkofclassesandsystemclassesandothersystemsnecessarytorunsomebasicclasses.Theestablishmentofagoodrunthesegamesmusthavesomebasicclasses,wecancreatetheskytype,terraintypeofthe.ThenthesetwofileswithaSkyAndTerrainencapsulate.
Keywords:
computer;
the3dgames;
OpenGL;
VisualStudio2005
1OpenGL概述
OpenGL作为一个性能优越的图形应用程序设计界面(API)适合于广泛的计算机环境,从个人计算机、工作站到超级计算机,OpenGL都能实现高性能的三维图形功能。
由于许多在计算机界具有领导地位的计算机公司纷纷采用OpenGL作为三维图形应用程序设计界面,OpenGL应用程序具有广泛的移植性。
OpenGL已成为目前的三维图形开发标准。
OpenGL(OpenGLGraphicsLibrary,开发性图形库)是目前用于开发可移植的、可交换的2D和3D图形应用程序的首选环境,是行业领域中最为广泛接纳的2D/3D图形API,也是目前应用最为广泛的计算机图形标准,其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。
通过对OpenGL的特点、功能、工作流程和绘图流程的学习,我们将会对OpenGL有一个初步的了解,建立起基本的概念。
1.1OpenGL的特点及功能
OpenGL作为一个性能优越的图形应用程序设计界面,具有以下几个特点,如图1.1所示
图1.1OpenGL特点
1.1.1OpenGL的特点[1]
图形质量高、性能好:
在CAD/CAM/CAE、医学图像处理、虚拟实现、娱乐、广告等不同领域中,开发人员可以利用OpenGL的这些能力自由发挥自己的创造力。
标准化:
OpenGL是唯一真正开放的、独立于供应商的跨平台的图形标准。
稳定性:
OpenGL已经在各种平台上应用多年,它具有明确而控制良好的规范,并具有向后兼容性,使现有的应用程序不会失效。
可靠性和可移植性:
利用OpenGL技术开发的应用图形软件与硬件无关,只要硬件支持OpenGLAPI标准就可以了,也就是说,OpenGL应用可以运行在支持OpenGLAPI标准的任何硬件上。
可扩展性:
通过OpenGL扩展机制,可以利用API进行功能扩充。
如今,许多OpenGL开发商在OpenGL核心技术规范的基础上,增强了图形绘制功能,从而使O
+能紧跟最新硬件发展和计算机图形绘制算法的发展。
对于硬件特性的升级可以体现在OpenGL扩展机制及OpenGLAPI中,一个成功的OpenGL扩展会被融入在未来的OpenGL版本中。
可缩放性:
基于OpenGL的应用程序可以在各种平台上运行。
易用性:
OpenGL具有良好的结构、直观的设计和逻辑命令。
与其他的图形程序包相比,OpenGL应用程序的代码行数少。
此外,OpenGL封装了有关基本硬件信息,使开发人员无须针对具体的硬件进行专门的设计。
灵活性:
尽管OpenGL有一套独特的图形处理标准,但各平台开发商可以自由地开发适合各自系统的OpenGL执行实例。
在这些实例中,OpenGL功能可由特定的硬件实现,也可用纯软件例程实现,或者以软硬件结合的方式实现。
1.1.2OpenGL的七大功能
如图1.2所示:
图1.2OpenGL功能
各功能说明如下:
建模:
OpenGL图形库除了提供基本的点、线、多边形的绘制函数外,还提供了复杂的三维物体(球,锥,多面体,茶壶等),以及复杂曲线和曲面(例如Bezier、Nurbs等曲线或曲面)绘制函数。
变换:
OpenGL图形库的变换包括基本变换和投影变换。
基本变换有平移、旋转、变比、镜像4种变换,投影变换有平行投影(又称正射投影)和透视投影两种变换。
颜色模式设置:
OpenGL颜色模式有两种,即RGBA模式和颜色索引模式(ColorIndex)模式。
纹理映射(TextureMapping):
利用OpenGL纹理映射功能可以十分逼真的表现物体表面细节。
光照和材质设置:
OpenGL光有辐射光(EmittedLight)、环境光(AmbientLight)、慢反射光(BiffuseLight)和镜面光(SpecularLight)。
材质是用光反射率来表示。
场景(Scene)中物体最终反映到人眼的颜色是红、绿、蓝、分量与材质红、绿、蓝分量的反射率相乘后形成的颜色。
双缓存动画(DoubleBuffering):
双缓存即前台缓存和后天缓存。
后台缓存计算场景、生产动画,前天缓存显示后台缓存已经画好的画面。
特殊效果:
利用OpenGL还能实现深度暗示(DepthCue)、运动模糊(MotionBlur)、融合(Blending)、反走样(Antialiasing)和雾(Fog)等特殊效果。
运动模糊和绘图方式(motion-blured),模拟物体运动时人眼观察说感觉的动感现象。
深度域效果(depth-of-effects)类似于照相机的镜头效果,模型在聚焦点处清晰,反之则模糊。
1.2OpenGL工作流程
OpenGL被设计成独立于硬件、以流水线的方式工作,工作流程图如图3所示
图1.3OpenGL工作流程图
OpenGL工作流程的输入端可以是图像或几何图元,但最终结果都是光栅化后的图像。
这些图像进入帧缓冲区后,由硬件显示在输出设备上。
OpenGL的所有绘图对象(包括几何图元和图像)既可以存储在显示列表中(延迟模式),也可以立即处理(立即模式)。
对于图像,OpenGL首先通过像素解包把其像素格式转换成OpenGL内部格式,然后通过像素操作后直接光栅化输出或者作为其他物体的表现纹理。
对于几何图元,OpenGL中的所有图元都是用顶点来描述的。
OpenGL首先通过顶点解包将不同格式的顶点转化为内部的标准格式,然后对顶点及相关数据(坐标、颜色、法向量、纹理坐标、边标识等)进行操作,在进行光栅化,最终得到可见的图像。
1.3OpenGL绘图流程
OpenGL的绘图流程如图1.4所示
图1.4OpenGL绘图流程图
设置像素格式:
主要包括建立OpenGL绘制风格、颜色模式、颜色位数、深度位数等。
建立景物模型:
根据基本图形单元建立景物模型,并且对所建立的模型进行数学描述。
在OpenGL中把点、线、多边形、图像和位图都作为基本图形单元。
舞台布景:
把景物模型放在三维空间中合适的位置,并且设置视点(Viewpoint)以观察所感兴趣的景观。
效果处理:
设置物体对象的材质(颜色、光学性能及纹理映射等),加入光照和光照条件。
光栅化:
把景物模型的数学描述及其色彩信息转换至可在计算机上显示的像素信息,这个过程就是光栅化(rasterization)。
2系统分析与设计
2.1系统结构总框架设计
本游戏系统主要分成四大模块,这些模块又是由若干个子模块构成的,形成一个功能明确的游戏系统。
系统结构总框架设计如图2.1所示:
头文件类
向量类
基础类的实现
窗口类
位图载入类
视角控制
3D游戏
模型数据读取
模型载入
模型调用
图2.1系统结构图
2.2系统目的
玩家以第一人称视角观察周围环境,并可以进行旋转视角,前后移动等操作。
3OpenGL的配置
3.1程序运行环境的配置
在建立程序框架前首先要下好OpenGL库文件,把解压好的库文件分别按如下路径放到文件夹里,对于VS2005可以如下设置[2]
1、把glut.h复制到VC安装路径下的PlatFormSDK\include\gl文件夹
2、把glut32.lib复制到VC安装路径下的PlatFormSDK\lib文件夹
3、把glut32.dll复制到Windows\System32文件夹
4、在VC中创建控制台应用程序,在选项中清除“使用预编译头”(以免影响可移植性)
5、在VC中打开项目->
属性对话框进行如下设置:
将“配置”下拉框选则为“所有配置”,打开“链接器--输入”项。
在“附加依赖项”中增加:
OpenGL32.libglu32.libglut32.lib
4基础类的实现
4.1头文件包含类Stdafx
在Stdafx.h中包含了常用的头文件,以方便其他文件的调用,这样就不用每个用到如下头文件的文件都去写这些头文件了。
常用头文件:
#include<
windows.h>
stdio.h>
math.h>
time.h>
gl头文件:
gl\gl.h>
gl\glu.h>
gl\glaux.h>
gl\glext.h>
OpenGL链接库文件:
#pragmacomment(lib,"
opengl32.lib"
)
glu32.lib"
)
glaux.lib"
)
另外还进行了用算符重载的操作
定义地面网格:
constunsignedintMAP_WIDTH=1024;
//位图的宽度
constunsignedintCELL_WIDTH=16;
//单元格的宽度
4.2向量类Vector
主要计算向量的点积和叉积(详细参考附录)
算法的代码实现为:
点积:
floatVector3:
:
dotProduct(constVector3&
v)
{
return(x*v.x+y*v.y+z*v.z);
}
叉积:
Vector3Vector3:
crossProduct(constVector3&
Vector3vec;
vec.x=y*v.z-z*v.y;
vec.y=z*v.x-x*v.z;
vec.z=x*v.y-y*v.x;
returnvec;
4.3窗口类GLWindow
4.3.1窗口类概述
任何一个Windows程序都必须处理设备描述表(DeviceContext),它告诉Windows怎样在一窗口中显示图形信息。
一个设备描述表(DC)说明了笔和画刷的颜色绘制模式,调色盘信息,映射模式,以及其他Windows必须知道的怎样显示图形的属性。
与其他的Windows应用程序一样,OpenGL应用程序也必须应用DC。
不过我们将其称为着色描述表(RenderingContext,RC),由它通知Windows在窗口中绘制图形。
每一个OpenGL都被连接到一个RC上。
RC将所有的OpenGL调用命令连接到DC上,应用程序必须在绘图之前调用专用函数wglCreateContext()创建自己的RC,调用wglMakeCurrent使其当前化,退出OpenGL时使RC非当前化。
4.3.2GLWindow.h及GLWindow.cpp主要要完成窗口的设置:
intm_WindowPosX;
/**<
窗口的左上角的X位置*/
intm_WindowPosY;
/**<
窗口的左上角的Y位置*/
intm_WindowWidth;
窗口的宽度*/
intm_WindowHeight;
窗口的高度*/
intm_ScreenWidth;
全屏的宽度*/
intm_ScreenHeight;
/**<
全屏的高度*/
intm_BitsPerPixel;
/**<
颜色位深*/
boolm_IsFullScreen;
是否全屏*/
以及设置像素格式,设置像素格式首先要填充PIXELFORMATDESCRIPTOR结构,其默认设置如下
PIXELFORMATDESCRIPTORpfd=/**<
设置像素描述结构*/
{
sizeof(PIXELFORMATDESCRIPTOR),/**<
像素描述结构的大小*/
1,/**<
版本号*/
PFD_DRAW_TO_WINDOW|/**<
缓存区的输出显示在一个窗口中*/
PFD_SUPPORT_OPENGL|/**<
缓存区支持OpenGL绘图*/
PFD_STEREO|/**<
颜色缓存区是立体缓存*/
PFD_DOUBLEBUFFER,/**<
颜色缓存区是双缓存*/
PFD_TYPE_RGBA,/**<
使用RGBA颜色格式*/
m_BitsPerPixel,/**<
颜色缓存区中颜色值所占的位深*/
0,0,0,0,0,0,/**<
使用默认的颜色设置*/
0,/**<
无Alpha缓存*/
颜色缓存区中alpha成分的移位计数*/
无累计缓存区*/
0,0,0,0,/**<
累计缓存区无移位*/
32,/**<
32位深度缓存*/
无蒙版缓存*/
无辅助缓存区*/
PFD_MAIN_PLANE,/**<
必须为PFD_MAIN_PLANE,设置为主绘图层*/
0,/**<
表示OpenGL实现所支持的上层或下层平面的数量*/
0,0,0/**<
过时,已不再使用*/
};
4.4位图载入类CBMPLoader
4.4.1BMP图像文件格式[3]
BMP是一种与硬件设备无关的图像文件格式,使用非常广。
它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。
BMP文件的图像深度可选lbit、4bit、8bit及24bit。
BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。
由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。
典型的BMP图像文件由三部分组成:
位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;
位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息。
BMP是(Windows位图)Windows位图可以用任何颜色深度(从黑白到24位颜色)存储单个光栅图像。
Windows位图文件格式与其他MicrosoftWindows程序兼容。
它不支持文件压缩,也不适用于Web页。
从总体上看,Windows位图文件格式的缺点超过了它的优点。
为了保证照片图像的质量,请使用PNG、JPEG、TIFF文件。
BMP文件适用于Windows中的墙纸。
优点:
BMP支持1位到24位颜色深度。
BMP格式与现有Windows程序(尤其是较旧的程序)广泛兼容。
缺点:
BMP不支持压缩,这会造成文件非常大。
BMP文件不受Web浏览器支持。
4.4.1位图载入类CBMPLoader流程图
如图4.1所示:
图4.1位图载入类流程图
4.5基本框架的组成
键盘类和程序框架类(GLFrame):
键盘类:
classKeys
public:
Keys(){Clear();
}/**构造函数*/
voidClear(){ZeroMemory(&
m_KeyDown,sizeof(m_KeyDown));
}/**清空所有的按键信息*/
boolIsPressed(unsignedintkey){return(key<
MAX_KEYS)?
(m_KeyDown[key]==true):
false;
}/**判断某个键是否按下*/
voidSetPressed(unsignedintkey){if(key<
MAX_KEYS)m_KeyDown[key]=true;
}/**设置某个键被按下*/
voidSetReleased(unsignedintkey){if(key<
MAX_KEYS)m_KeyDown[key]=false;
}/**设置某个键被释放*/
private:
staticconstunsignedintMAX_KEYS=256;
boolm_KeyDown[MAX_KEYS];
/**<
保存各按键的状态*/
在继承类中完成以下函数的实现
GLApplication*GLApplication:
Create(constchar*class_name)//创建子类的一个实例
boolInit();
//执行所有的初始化工作,如果成功函数返回true
voidUninit();
//执行所有的卸载工作
voidUpdate(DWORDmilliseconds);
//执行所有的更新操作,传入的参数为两次操