




免费预览已结束,剩余33页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于OpenGL的简单3d游戏的设计与实现姓 名 系 别、 专 业 导 师 、 职 称 完 成 时 间 目 录摘 要Abstract1 OpenGL概述11.1 OpenGL的特点及功能11.2 OpenGL工作流程41.3 OpenGL绘图流程42 系统分析与设计52.1系统结构总框架设计62.2系统目的73 OpenGL的配置73.1程序运行环境的配置74 基础类的实现74.1头文件包含类Stdafx74.2向量类Vector84.3窗口类GLWindow94.4位图载入类CBMPLoader104.4.1 BMP图像文件格式114.4.1位图载入类CBMPLoader流程图114.5基本框架的组成125视角控制125.1摄像机类结构图125.2设置摄像机的位置125.3摄像机旋转功能的实现136 游戏场景设计166.1地面的构造176.2天空的构造197 模型设计247.1 模型概述247.2 MD2格式说明247.3编译原理257.4 读取MD2文件方法的实现26游戏运行截图27注 释30参考文献31致 谢32摘 要 随着电脑进入千家万户,人们对电脑游戏的要求也越来越高,而3D游戏正满足人们对这方面的需求。人们对游戏的画面,动画的逼真度,易操作性以及游戏的思想,故事情节越来越重视。许多大型的3D游戏大部分都产自国外,而国内目前对3D游戏的制作还不够成熟,特别是一些游戏画面的逼真度,还有游戏的制作思想,以及游戏的可玩性都尚有不足。近几年国内制作的3D游戏也慢慢上了轨道,在这方面要加大对培养制作游戏人才的力度,力争做到像魔兽世界一样水平的3D游戏。目前使用openGL实现其游戏画面方面的效果还是主流之一。本课题就是基于Visual Studio 2005 平台的3D游戏,虽然目前的程序有些简单,但这是为制作复杂3D游戏打下基础。 本游戏主要由四个部分组成:视角控制,天空,地面和模型载入。首先要建立一些系统必备的基础文件,如各种头文件载入的一个文件集合Stdafx,以方便其他文件调用函数库里的文件(如OpenGL库文件,数学函数库文件等)。在此基础上建立一些如字体类(组要用来显示数字的),向量类,位图载入类和系统基础框架类等系统运行必备的一些基础类。建立好了这些游戏运行必备的一些基础类后,我们就可以建立天空类,地形类了。然后用一个SkyAndTerrain把这两个文件封装起来。 关键词:电脑;3D游戏;OpenGL;Visual Studio 2005AbstractWith computers in every household, people are demanding more and more computer games, whereas the 3D game is to meet the needs of people in this area. People on the game screen, animation is realistic, easy to operate and game ideas, more and more emphasis on storyline. Many large-scale 3D game produced in most foreign countries, while domestic production of the current 3D game is not mature enough yet, especially the fidelity of the game screen, there are the production thought the game, and gameplay are still enough . In recent years,domestic production of 3D games are slowy on the track,in this context to increase the production of the game on the train personnel,and strive to be like”WOW”,the same level of 3d gaming. Current openGL game screen area to achieve its effect is one of the mainstream. This issue is based on Visual Studio 2005 platform, 3D game, although some simple procedures, but this is the basis for creating complex 3D games. This game is mainly composed of four parts: angle control, sky, ground and model loading. First of all, necessary to establish the basis of some system files, such as the various header files included in a collection of files Stdafx, to facilitate other documents call the function library file (such as the OpenGL library, math library files, etc.). On this basis, the establishment of a number, such as font type (group to be used to display numbers), vector type, bitmap loading basic framework of classes and system classes and other systems necessary to run some basic classes. The establishment of a good run these games must have some basic classes, we can create the sky type, terrain type of the. Then these two files with a SkyAndTerrain encapsulate. Key words: computer; the 3d games; OpenGL; Visual Studio 20051 OpenGL概述OpenGL作为一个性能优越的图形应用程序设计界面(API)适合于广泛的计算机环境,从个人计算机、工作站到超级计算机,OpenGL都能实现高性能的三维图形功能。由于许多在计算机界具有领导地位的计算机公司纷纷采用OpenGL作为三维图形应用程序设计界面,OpenGL应用程序具有广泛的移植性。OpenGL已成为目前的三维图形开发标准。OpenGL(OpenGL Graphics Library,开发性图形库)是目前用于开发可移植的、可交换的2D和3D图形应用程序的首选环境,是行业领域中最为广泛接纳的2D/3D图形API,也是目前应用最为广泛的计算机图形标准,其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。通过对OpenGL的特点、功能、工作流程和绘图流程的学习,我们将会对OpenGL有一个初步的了解,建立起基本的概念。1.1 OpenGL的特点及功能OpenGL作为一个性能优越的图形应用程序设计界面,具有以下几个特点,如图1.1所示图1.1 OpenGL特点1.1.1 OpenGL的特点 1图形质量高、性能好:在CAD/CAM/CAE、医学图像处理、虚拟实现、娱乐、广告等不同领域中,开发人员可以利用OpenGL的这些能力自由发挥自己的创造力。标准化:OpenGL是唯一真正开放的、独立于供应商的跨平台的图形标准。稳定性:OpenGL已经在各种平台上应用多年,它具有明确而控制良好的规范,并具有向后兼容性,使现有的应用程序不会失效。可靠性和可移植性:利用OpenGL技术开发的应用图形软件与硬件无关,只要硬件支持OpenGL API 标准就可以了,也就是说,OpenGL应用可以运行在支持OpenGL API标准的任何硬件上。可扩展性:通过OpenGL扩展机制,可以利用API进行功能扩充。如今,许多OpenGL开发商在OpenGL核心技术规范的基础上,增强了图形绘制功能,从而使O+能紧跟最新硬件发展和计算机图形绘制算法的发展。对于硬件特性的升级可以体现在OpenGL扩展机制及OpenGL API 中,一个成功的OpenGL扩展会被融入在未来的OpenGL版本中。可缩放性:基于OpenGL的应用程序可以在各种平台上运行。易用性:OpenGL具有良好的结构、直观的设计和逻辑命令。与其他的图形程序包相比,OpenGL应用程序的代码行数少。此外,OpenGL封装了有关基本硬件信息,使开发人员无须针对具体的硬件进行专门的设计。灵活性:尽管OpenGL有一套独特的图形处理标准,但各平台开发商可以自由地开发适合各自系统的OpenGL执行实例。在这些实例中,OpenGL功能可由特定的硬件实现,也可用纯软件例程实现,或者以软硬件结合的方式实现。1.1.2 OpenGL的七大功能如图1.2所示:图1.2 OpenGL功能各功能说明如下:建模:OpenGL图形库除了提供基本的点、线、多边形的绘制函数外,还提供了复杂的三维物体(球,锥,多面体,茶壶等),以及复杂曲线和曲面(例如Bezier、Nurbs等曲线或曲面)绘制函数。变换:OpenGL图形库的变换包括基本变换和投影变换。基本变换有平移、旋转、变比、镜像4种变换,投影变换有平行投影(又称正射投影)和透视投影两种变换。颜色模式设置:OpenGL颜色模式有两种,即RGBA模式和颜色索引模式(Color Index)模式。纹理映射(Texture Mapping):利用OpenGL纹理映射功能可以十分逼真的表现物体表面细节。光照和材质设置:OpenGL光有辐射光(Emitted Light)、环境光(Ambient Light)、慢反射光(Biffuse Light)和镜面光(Specular Light)。材质是用光反射率来表示。场景(Scene)中物体最终反映到人眼的颜色是红、绿、蓝、分量与材质红、绿、蓝分量的反射率相乘后形成的颜色。双缓存动画(Double Buffering):双缓存即前台缓存和后天缓存。后台缓存计算场景、生产动画,前天缓存显示后台缓存已经画好的画面。特殊效果:利用OpenGL还能实现深度暗示(Depth Cue)、运动模糊(Motion Blur)、融合(Blending)、反走样(Antialiasing)和雾(Fog)等特殊效果。运动模糊和绘图方式(motion-blured),模拟物体运动时人眼观察说感觉的动感现象。深度域效果(depth-of-effects)类似于照相机的镜头效果,模型在聚焦点处清晰,反之则模糊。1.2 OpenGL工作流程OpenGL被设计成独立于硬件、以流水线的方式工作,工作流程图如图3所示几何顶点数据图像像素数据显示列表求值器逐个顶点操作与图元装配光栅化片段操作图像操作纹理装配帧缓冲区图1.3 OpenGL工作流程图OpenGL工作流程的输入端可以是图像或几何图元,但最终结果都是光栅化后的图像。这些图像进入帧缓冲区后,由硬件显示在输出设备上。OpenGL的所有绘图对象(包括几何图元和图像)既可以存储在显示列表中(延迟模式),也可以立即处理(立即模式)。对于图像,OpenGL首先通过像素解包把其像素格式转换成OpenGL内部格式,然后通过像素操作后直接光栅化输出或者作为其他物体的表现纹理。对于几何图元,OpenGL中的所有图元都是用顶点来描述的。OpenGL首先通过顶点解包将不同格式的顶点转化为内部的标准格式,然后对顶点及相关数据(坐标、颜色、法向量、纹理坐标、边标识等)进行操作,在进行光栅化,最终得到可见的图像。1.3 OpenGL绘图流程OpenGL的绘图流程如图1.4所示建立景物模型设置像素格式舞台布景效果处理光栅化图1.4 OpenGL绘图流程图设置像素格式:主要包括建立OpenGL绘制风格、颜色模式、颜色位数、深度位数等。建立景物模型:根据基本图形单元建立景物模型,并且对所建立的模型进行数学描述。在OpenGL中把点、线、多边形、图像和位图都作为基本图形单元。舞台布景:把景物模型放在三维空间中合适的位置,并且设置视点(Viewpoint)以观察所感兴趣的景观。效果处理:设置物体对象的材质(颜色、光学性能及纹理映射等 ),加入光照和光照条件。光栅化:把景物模型的数学描述及其色彩信息转换至可在计算机上显示的像素信息,这个过程就是光栅化(rasterization)。2 系统分析与设计2.1系统结构总框架设计本游戏系统主要分成四大模块,这些模块又是由若干个子模块构成的,形成一个功能明确的游戏系统。系统结构总框架设计如图2.1所示: 头文件类向量类基础类的实现窗口类位图载入类基础框架类摄像机类结构图视角控制设置摄像机的位置摄像机旋转功能的实现3D游戏地面的构造游戏场景设计天空的构造模型数据读取模型载入模型调用 图2.1系统结构图2.2系统目的玩家以第一人称视角观察周围环境,并可以进行旋转视角,前后移动等操作。3 OpenGL的配置3.1程序运行环境的配置 在建立程序框架前首先要下好OpenGL库文件,把解压好的库文件分别按如下路径放到文件夹里, 对于VS2005可以如下设置21、把 glut.h 复制到 VC 安装路径下的 PlatFormSDKincludegl 文件夹2、把 glut32.lib 复制到 VC 安装路径下的 PlatFormSDKlib 文件夹3、把 glut32.dll 复制到 WindowsSystem32 文件夹4、在 VC 中创建控制台应用程序,在选项中清除“使用预编译头”(以免影响可移植性)5、在 VC 中打开项目-属性对话框进行如下设置:将“配置”下拉框选则为“所有配置”,打开 “链接器-输入”项。在“附加依赖项”中增加:OpenGL32.lib glu32.lib glut32.lib4 基础类的实现4.1头文件包含类Stdafx 在Stdafx.h中包含了常用的头文件,以方便其他文件的调用,这样就不用每个用到如下头文件的文件都去写这些头文件了。常用头文件:#include #include #include #include gl头文件:#include #include #include #include OpenGL链接库文件:#pragma comment(lib, opengl32.lib)#pragma comment(lib, glu32.lib)#pragma comment(lib, glaux.lib)另外还进行了用算符重载的操作定义地面网格:const unsigned int MAP_WIDTH = 1024; /位图的宽度 const unsigned int CELL_WIDTH = 16; /单元格的宽度4.2 向量类Vector主要计算向量的点积和叉积(详细参考附录)算法的代码实现为:点积: float Vector3:dotProduct(const Vector3& v)return ( x * v.x + y * v.y + z * v.z );叉积:Vector3 Vector3:crossProduct(const Vector3& v)Vector3 vec;vec.x = y * v.z - z * v.y;vec.y = z * v.x - x * v.z;vec.z = x * v.y - y * v.x;return vec;4.3 窗口类GLWindow4.3.1 窗口类概述 任何一个Windows程序都必须处理设备描述表(Device Context),它告诉Windows怎样在一窗口中显示图形信息。一个设备描述表(DC)说明了笔和画刷的颜色绘制模式,调色盘信息,映射模式,以及其他Windows必须知道的怎样显示图形的属性。与其他的Windows应用程序一样,OpenGL应用程序也必须应用DC。不过我们将其称为着色描述表(Rendering Context,RC),由它通知Windows在窗口中绘制图形。每一个OpenGL都被连接到一个RC上。RC将所有的OpenGL调用命令连接到DC上,应用程序必须在绘图之前调用专用函数wglCreateContext()创建自己的RC,调用wglMakeCurrent使其当前化,退出OpenGL时使RC非当前化。4.3.2 GLWindow.h及GLWindow.cpp主要要完成窗口的设置:intm_WindowPosX; /* 窗口的左上角的X位置*/intm_WindowPosY; /* 窗口的左上角的Y位置*/intm_WindowWidth; /* 窗口的宽度*/intm_WindowHeight; /* 窗口的高度*/intm_ScreenWidth; /* 全屏的宽度*/intm_ScreenHeight; /* 全屏的高度*/intm_BitsPerPixel; /* 颜色位深*/bool m_IsFullScreen; /* 是否全屏*/以及设置像素格式,设置像素格式首先要填充PIXELFORMATDESCRIPTOR结构,其默认设置如下PIXELFORMATDESCRIPTOR pfd = /* 设置像素描述结构*/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缓存*/0, /* 颜色缓存区中alpha成分的移位计数*/0, /* 无累计缓存区*/0, 0, 0, 0, /* 累计缓存区无移位*/32, /* 32位深度缓存*/0, /* 无蒙版缓存*/0, /* 无辅助缓存区*/PFD_MAIN_PLANE, /* 必须为PFD_MAIN_PLANE,设置为主绘图层*/0, /* 表示OpenGL实现所支持的上层或下层平面的数量*/0, 0, 0 /* 过时,已不再使用*/;4.4 位图载入类CBMPLoader4.4.1 BMP图像文件格式3BMP是一种与硬件设备无关的图像文件格式,使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。典型的BMP图像文件由三部分组成:位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息。BMP 是(Windows 位图 ) Windows 位图可以用任何颜色深度(从黑白到 24 位颜色)存储单个光栅图像。Windows 位图文件格式与其他 Microsoft Windows 程序兼容。它不支持文件压缩,也不适用于 Web 页。 从总体上看,Windows 位图文件格式的缺点超过了它的优点。为了保证照片图像的质量,请使用 PNG 、JPEG、TIFF 文件。BMP 文件适用于 Windows 中的墙纸。优点:BMP 支持 1 位到 24 位颜色深度。BMP 格式与现有 Windows 程序(尤其是较旧的程序)广泛兼容。缺点: BMP 不支持压缩,这会造成文件非常大。 BMP 文件不受 Web 浏览器支持。4.4.1位图载入类CBMPLoader流程图如图4.1所示:打开文件并检查错误读位图文件头信息判断是否为位图文件读全文件保存文件创建指针进行文件格式转换将BGR转为RGB是退出并报错否图4.1 位图载入类流程图4.5 基本框架的组成键盘类和程序框架类(GLFrame):键盘类:class Keys public: Keys() Clear(); /* 构造函数*/void Clear() ZeroMemory(&m_KeyDown, sizeof(m_KeyDown); /* 清空所有的按键信息*/bool IsPressed(unsigned int key) return (key MAX_KEYS) ? (m_KeyDownkey = true) : false; /* 判断某个键是否按下*/void SetPressed(unsigned int key) if (key MAX_KEYS) m_KeyDownkey = true; /* 设置某个键被按下*/void SetReleased(unsigned int key) if (key MAX_KEYS) m_KeyDownkey = false; /* 设置某个键被释放*/private:static const unsigned int MAX_KEYS = 256;bool m_KeyDownMAX_KEYS;/* 保存各按键的状态*/;在继承类中完成以下函数的实现GLApplication * GLApplication:Create(const char * class_name) /创建子类的一个实例bool Init();/执行所有的初始化工作,如果成功函数返回truevoid Uninit();/执行所有的卸载工作void Update(DWORD milliseconds);/执行所有的更新操作,传入的参数为两次操作经过的时间,以毫秒 /为单位void Draw();/执行所有的绘制操作windowExtendedStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;/* 使窗口具有3D外观*/5视角控制5.1摄像机类解构图如图5.1所示摄像机类位置旋转方向设置速度左右移动前后移动根据鼠标设置摄像机观察方向与键盘关联放置摄像机位置图5.1 摄像机类结构图5.2设置摄像机的位置摄像机类主要的功能是实现三维漫游。第一要做的事就是设置摄像机的位置:设置摄像机的位置,朝向和向上向量。设置函数为:void Camera:setCamera( float positionX, float positionY, float positionZ, float viewX, float viewY, float viewZ,float upVectorX, float upVectorY, float upVectorZ)5.3 摄像机旋转功能的实现5.3.1 旋转摄像机 旋转摄像机方向函数为:void Camera:rotateView(float angle, float x, float y, float z)Angle为旋转的角度值,X,Y,Z为初始的位置。Angle值由库函数获取。下面是实现计算摄像机在空间中旋转了angle弧度后,计算其视点View更新的值newView。 Vector3 view = m_View - m_Position;/* 计算方向向量*/* 计算sin 和cos值*/float cosTheta = (float)cos(angle);float sinTheta = (float)sin(angle);/* 计算旋转向量的x值*/newView.x = (cosTheta + (1 - cosTheta) * x * x)* view.x;newView.x += (1 - cosTheta) * x * y - z * sinTheta)* view.y;newView.x += (1 - cosTheta) * x * z + y * sinTheta)* view.z;/* 计算旋转向量的y值*/newView.y = (1 - cosTheta) * x * y + z * sinTheta)* view.x;newView.y += (cosTheta + (1 - cosTheta) * y * y)* view.y;newView.y += (1 - cosTheta) * y * z - x * sinTheta)* view.z;/* 计算旋转向量的z值*/newView.z = (1 - cosTheta) * x * z - y * sinTheta)* view.x;newView.z += (1 - cosTheta) * y * z + x * sinTheta)* view.y;newView.z += (cosTheta + (1 - cosTheta) * z * z)* view.z;/* 更新摄像机的方向*/m_View = m_Position + newView;5.3.2 摄像机于鼠标相连设置鼠标位置在屏幕中心,如果鼠标不移动,则不用更新其位置。用鼠标旋转摄像机的重要函数为void Camera:setViewByMouse()POINT mousePos; /* 1; /* 1; /* 得到屏幕高度的一半*/float angleY = 0.0f; /* 摄像机左右旋转角度*/float angleZ = 0.0f; /* 摄像机上下旋转角度*/static float currentRotX = 0.0f;用函数GetCursorPos(&mousePos);得到当前鼠标位置。5.3.3 注意事项实时跟踪摄像机的上下的旋转角度如果上下旋转弧度大于1.0(或者小于-1.0),则要截取到1.0(或-1.0)并旋转,要不就会出现本该看的的物体不在我们的视野之内,跑到视野外去了,这就不符合我们的期望了。5.3.4 前后移动和速度Speed相关前后移动最重要的就是要和移动速度关联起来,根据物体的速度时刻改变摄像机的位置。前后移动的函数为moveCamera(float speed)。前后移动摄像机其主要的就是要和摄像机的速度联系起来void Camera:moveCamera(float speed)/* 计算方向向量*/Vector3 vector = m_View - m_Position;vector = vector.normalize(); /* 单位化*/* 更新摄像机*/m_Position.x += vector.x * speed; /* 根据速度更新位置*/m_Position.z += vector.z * speed;m_Position.y += vector.y * speed;m_View.x += vector.x * speed; /* 根据速度更新方向*/m_View.y += vector.y * speed;m_View.z += vector.z * speed; 以下是键盘与摄像机前后移动关联的主要实现代码 /* 键盘按键响应*/if(m_Keys.IsPressed(VK_SHIFT) /* 按下SHIFT键时加速*/m_Camera.setSpeed(0.6f);if(!m_Keys.IsPressed(VK_SHIFT)m_Camera.setSpeed(0.2f);if(m_Keys.IsPressed(VK_UP) | m_Keys.IsPressed(W) /* 向上方向键或W键按下*/m_Camera.moveCamera(m_Camera.getSpeed(); /* 移动摄像机*/if(m_Keys.IsPressed(VK_DOWN) | m_Keys.IsPressed(S) /* 向下方向键或S键按下*/m_Camera.moveCamera(-m_Camera.getSpeed(); /* 移动摄像机*/if(m_Keys.IsPressed(VK_LEFT) | m_Keys.IsPressed(A) /* 向左方向键或A键按下*/m_Camera.yawCamera(-m_Camera.getSpeed(); /* 移动摄像机*/if(m_Keys.IsPressed(VK_RIGHT) | m_Keys.IsPressed(D) /* 向右方向键或D键按下*/m_Camera.yawCamera(m_Camera.getSpeed(); /* 移动摄像机*/6 游戏场景设计6.1地面的构造6.1.1 地形可视化的概念地形可视化是一门以研究数字地形模型(Digital Terrain Model)或数字高程域( Digital Elevation Field)的显示、简化、仿真等为内容的学科,并以计算几何作为其重要的基础知识,它属于计算机图形学的一个分支。6.1.2 数据基础未被处理的用于地形三维显示的数据称为原始数据,一般被分为矢量和栅格两种形式。其中矢量数据包括线矢量数据、地形特征点数据等,栅格数据主要指数字高程模型DEM数据和纹理图像数据。其中DEM数据是地形三维显示中最重要的数据,它的精度、质量直接影响到后续的显示效果。DEM 数据也可以由线矢量数据生成,初始的DEM数据由于显示水平的不同要求,也可以用不同方法简化或内插为适应新需求的数据,这些数据称为再生数据。原始数据与再生数据共同组成地形可视化的数据基础。6.1.3 显示理论与方法对已知地形数据进行三维显示,一般要先经过投影变换、消隐和裁剪处理、颜色与光照处理、纹理映射四个基本步骤,之后还可以根据需要在模型上叠加相应的地物模型、矢量要素等。这些理论与方法均是计算机图形学中真实感图形生成算法的重要组成部分。6.1.4用OpenGL构造三维地形景观流程图如图4.2.1所示:数据处理数据设置模型构造投影变换 视口变换三维地形景观DEM数据(影像数据) 纹理映射图6.1 OpenGL构造三维地形景观基本流程图6.1.5 具体实现(1)数据准备及预处理 用于构造三维地形景观的数据包括DEM数据和纹理数据。DEM数据的处理包括不同格式DEM间的转化、DEM 数据简化、格网DEM 与TIN间的相互转化等;纹理数据的处理包括图像格式转化、图像裁切等。(2)设置基本参数 在用OpenGL绘制三维地形模型和进行纹理映射前,需要设置相关的景观参数值。这些参数包括光源性质(镜射光、漫射光和环境光)、光源方位(距离和方向)、颜色模式(索引模式或RGBA模式)、明暗处理方式(平滑处理或平面处理)、纹理映射方式等。除此之外还需设定视点位置和视线方向。这些参数设置都可以通过对OpenGL的相关函数的参数选择来实现。(3)构造地形模型三维地形模型的基本构造通常是以三角面为单元的。三角面的明亮程度除取决于光源和明暗处理方式外,还受到点与面的法向量的影响。一般点的法向量取值为其周围面法向量的均值。在图3中P点的法向量即可表示为与其相邻的四个面法向量N1、N2、N3、N4的和的平均值。PN3P3N4P1N2N1P2这样三维模型的构造可由下列程序给出:glBegin(GL_TRIANGLES_STRIP);glNormal3fv(N0); /设置顶点法向量glVertex3f(v0); /设置顶点坐标glNormal3fv(N1);glVertex3f(v1);glEnd();构造模型的同时,还可以对模型进行平移、旋转和缩放等变换,以实现各种不同的模型造型。(4)投影变换 投影变换一般分为透视投影变换和正射投影变换两类。投影方式的选择取决于显示的内容和用途。由于透视投影类似于人眼对客观世界的观察方式,因而广泛应用于三维地形模拟、飞行仿真、步行穿越仿真等模拟人眼视觉效果的研究领域。但如果需要观察模型某一个侧面不带有形变的景观,则更多采用正射投影方式,如制作地形晕渲图则一般采用正射投影方式。OpenGL只绘制位于视景体内的对象,在设置投影变换时要充分考虑模型的大小以便选择合适的视景体范围。图6.2 表示用于透视投影变换的视景体图6.3 表示用于正射投影变换的视景体(5)视口变换 视口是指计算机屏幕中的矩形绘图区域,它用窗口坐标来度量,反映了屏幕上的像素位置。视口相对于窗口的左下角。视口变换的目的就是将三维空间坐标映射为计算机屏幕上的二维平面坐标。视口变换用函数glViewport()实现,视口的宽高比通常等于视景体的宽高比,否则视口内显示的图形将会发生形变。根据视口变换后视口内每一点的z坐标值,OpenGL可以自动实现消隐功能,使得靠近视点的目标能够遮挡视口同一位置远离视点的目标。 (6)纹理映射 纹理映射是建立逼真三维地形景观的重要手段,不采用纹理映射所得到的地形模型仅仅是具有明暗效果的光照模型,光照模型可以按照高程值进行过渡着色或分层设色。它能够直观地反映地表起伏状况,但不能重现地表的真实面貌。一般纹理映射的思路是把纹理图像“贴”到由DEM数据所构成的三维模型上。其关键是实现影像与DEM之间的正确套合,使每个DEM格网点与其所在的图像位置一一对应。为提高纹理映射的运算效率,通常采用预处理好的与DEM坐标相对应的图像作为纹理以免除纹理坐标的计算。用OpenGL函数进行纹理映射的基本步骤为:1 纹理定义:用glTexImage2D*()函数说明所映射的纹理内容。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年食品安全与卫生管理职业资格考试试题及答案
- 墙面大白乳胶漆施工平台搭建及防护措施
- 2025-2030中国电子支付市场研究及投资潜力预测报告
- 2025-2030中国生态皮革制品行业市场现状及消费趋势研究报告
- 市政污水处理厂建设难点及解决措施
- 学校疫情防控我们身边的抗疫英雄主题计划
- 环保主题下的“不能和不为”高考作文范文
- 建筑工程大型施工机械设备管理方案
- 部编小学五年级语文教学目标计划
- 广东省清远市三校2024-2025学年高二下学期期中联考历史试题(解析版)
- MT 282-1994煤矿用移动式甲烷断电仪通用技术条件
- 物理因子治疗技术 压力疗法课件
- 新教材人教A版高中数学选择性必修第一册全册教学课件
- 《普通话》教学讲义课件
- 比喻(教学课件)
- 烧结基础知识课件
- 高中生物第一课-(共24张)课件
- 皮肤科质量控制指标
- 新教师跟岗学习实施方案
- 2022年高考全国甲卷:写作指导及范文课件16张
- 郭锡良《古代汉语》讲稿(不仔细看别后悔哦)
评论
0/150
提交评论