计算机图形学课程设计-三维真实感图形设计与绘制

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

计算机图形学课程设计报告一、实验题目三维真实感图形设计与绘制(1)题目内容说明:本题目要求应用OpenGL的光照技术和纹理技术实现一个简单的三维真实感图形的程序设计。具体要求实现功能:1)通过对话方式实现交互式设计光照模型功能。2)实现三维模型纹理映射功能3)用鼠标跟踪球方法实现三维模型的空间旋转2)实现鼠标跟踪球方法程序二、需求分析真实感图形的设计与绘制,是计算机图形学中的一个重要研究领域,也是三维实体造型系统和特征造型系统的重要组成部分。一般地,三维实体在计算机显示屏上有三种表现形式:简单线框图、线框消隐图和真实感图形。其中,简单线框图能够粗略表达实体的形状,但由于简单线框图的二义性,从而导致表达其的实体形状具有不确定性。而线框消隐图虽然能反映实体各表面间的相互遮挡关系,从而达到消除简单线框图产生的二义性的目的,但是这两者一样地只能反映实体的几何形状和实体间的相互关系,而不能反映实体表面的特征,如表面的颜色、材质、纹理等。所以,只有真实感图形才能表现实体的这些特征,因此,在三维实体造型中,生成三维实体的光照模型,进行实体的真实感绘制与显示占有重要的地位,是很有必要的,也是我做此设计的初衷。在设计中,我主要使用Opengl绘制真实感图形,它作为一种强大的三维图形开发工具,通过便捷的编程接口提供了处理光照和物体材质、颜色属性等通用功能。真实感图形学是计算机图形的核心内容之一,是最能直接反映图形学魅力的分支。寻求能准确地描述客观世界中各种现象与景观的数学模型,并逼真地再现这些现象与景观,是图形学的一个重要研究课题。很多自然景物难以用几何模型描述,如烟雾、植物、水波、火焰等。本文所讨论的几种建模及绘制技术都超越了几何模型的限制,能够用简单的模型描述复杂的自然景物。在计算机的图形设备上实现真实感图形必须完成的四个基本任务。1.三维场景的描述。三维造型。2.将三维几何描述转换成为二维透视图。透视变换。3.确定场景中的所有可见面。消隐算法,可见面探测算法。4.计算场景中可见面的颜色。根据基于光学物理的光照模型计算可见面投射到观察者眼中的光亮度大小和色彩组成。三、设计简介及设计方案论述3.1设计简介为了实现本程序的两大功能,计划采用OPENGL图形库并调用一系列WINDOWSAPI采用C/C++语言编写。首先,应熟悉OPENGL在WIN32平台下的相关API,以及其余WINDOWS窗口交互的相关接口方法,来构建窗口的内容。其次,熟悉了解OPENGL库函数在窗体中实现绘图,实现图形的旋转、光照、纹理等功能的相关函数。最后,实现OPENGL与WINDOWS的交互的过程,完成程序及注释。3.2OPENGL图形库简介3.2.1OPENGL特点从程序开发人员的角度来看,OpenGL是一组绘图命令的API集合。利用这些API能够方便地描述二维和三维几何物体,并控制这些物体按某种方式绘制到显示缓冲区中。OpenGL的API集合提供了物体描述、平移、旋转、缩放、光照、纹理、材质、象素、位图、文字、交互以及提高显示性能等方面的功能,基本涵盖了开发二、三维图形程序所需的各个方面。与一般的图形开发工具相比,OpenGL具有以下几个突出特点:(1)应用广泛(2)跨平台性(3)高质量和高性能(4)出色的编程特性(5)网络透明性3.2.2OPENGL工作顺序OpenGL的工作顺序就是一个从定义几何要素到把象素段写入帧缓冲区的过程。在屏幕上显示图象的主要步骤是以下3步:1)构造几何要素(点、线、多边形、图像、位图),创建对象的数学描述。在三维空间放置对象,选择有利的观察点。2)计算对象的颜色,这些颜色可能直接定义,或由光照条件及纹理间接给出。3)光栅化,把对象的数学描述和颜色信息转换到屏幕的象素。3.3OPENGL简单编程方法3.3.1OPENGL基本语法OpenGL基本函数均使用gl作为函数名的前缀,如glClearColor();实用函数则使用glu作为函数名的前缀,如gluSphere()。OpenGL基本常量的名字以GL_开头,如GL_LINE_LOOP;实用常量的名字以GLU_开头,如GLU_FILL。一些函数如glColor*()(定义颜色值),函数名后可以接不同的后缀以支持不同的数据类型和格式。如glColor3b(…)、glColor3d(…)、glColor3f(…)和glColor3bv(…)等,这几个函数在功能上是相似的,只是适用于不同的数据类型和格式,其中3表示该函数带有三个参数,b、d、f分别表示参数的类型是字节型、双精度浮点型和单精度浮点型,v则表示这些参数是以向量(数组)形式出现的。OpenGL还定义了一些特殊的类型名,如GLfloat,GLvoid。它们其实就是C中的float和void。在gl.h文件中可以看到以下定义:typedeffloatGLfloat;typedefvoidGLvoid;……一些基本的数据类型都有类似的定义。3.3.2OPENGL状态机制OpenGL的工作方式是一种状态机制,它可以进行各种状态或模式设置,这些状态或模式在重新改变它们之前一直有效。例如,当前颜色就是一个状态变量,在这个状态改变之前,绘制的每个象素都将使用该颜色,直到当前颜色被设置为其它颜色为止。OpenGL中大量地使用了这种状态机制,如颜色模式、投影模式、单双显示缓存区的设置、背景色的设置、光源的位置和特性等等。3.3.3OPENGL基本结构OpenGL程序的基本结构可分为三个部分:第一部分是初始化部分,主要是设置一些OpenGL的状态开关,如颜色模式(RGBA或ALPHA等)的选择,是否作光照处理(若有的话,还需设置光源的特性),深度检验,裁剪等等。这些状态一般都用函数glEnable(),glDisable()来设置,()中为相应的状态。第二部分设置观察坐标系下的取景模式和取景框位置及大小。主要利用了三个函数:1.函数voidglViewport(left,top,right,bottom):设置在屏幕上的窗口大小,四个参数描述屏幕窗口四个边界坐标(以象素表示);2.函数voidglOrtho(left,right,bottom,top,near,far):设置投影方式为正交投影(平行投影),其取景体积(观察体)是一个各面均为矩形的六面体;3.函数voidgluPerspective(fovy,aspect,zNear,zFar):设置投影方式为透视投影,其取景体积(观察体)是一个截头锥体(棱台),在这个体积内的物体投影到锥体的顶点。第三部分是OpenGL的主要部分,使用OpenGL的库函数构造几何物体对象的数学描述,包括点线面的位置和拓扑关系,几何变换,光照处理等。3.4OPENGL及WINDOWS坐标系OPENGL的三维坐标系如图3-1所示:XOY平面为屏幕所在图3-1OPENGL三维坐标系WINDOWS的窗体坐标如图3-2所示:图3-2WINDOWS窗体二维坐标系ZXYOXYO3.5、WINDOWS消息机制消息机制是Windows应用程序的核心,在Windows中发生的一切都可以用消息来表示,消息用于告诉操作系统发生了什么,所有的Windows应用程序都是消息驱动的,除了WM_COMMAND消息,所有以WM_为前缀的消息都是标准的Windows消息,如窗口、鼠标移动、窗口大小改变等,程序启动或退出甚至每一段固定的时间都会产生标准Windows消息。Windows消息控制中心一般是三层结构,其顶端就是Windows内核。Windows内核维护着一个消息队列,第二级控制中心从这个消息队列中获取属于自己管辖的消息,后做出处理,有些消息直接处理掉,有些还要发送给下一级窗体(Window)或控件(Control)。第二级控制中心一般是各Windows应用程序的Application对象。第三级控制中心就是Windows窗体对象,每一个窗体都有一个默认的窗体过程,这个过程负责处理各种接收到的消息。1、消息的组成:一个消息由一个消息名称(UINT),和两个参数(WPARAM,LPARAM)。当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。例如当菜单转中之后会有WM_COMMAND消息发送,WPARAM的高字中(HIWORD(wParam))是命令的ID号,对菜单来讲就是菜单ID。当然用户也可以定义自己的消息名称,也可以利用自定义消息来发送通知和传送数据。2、谁将收到消息:一个消息必须由一个窗口接收。在窗口的过程(WNDPROC)中可以对消息进行分析,对自己感兴趣的消息进行处理。例如你希望对菜单选择进行处理那么你可以定义对WM_COMMAND进行处理的代码,如果希望在窗口中进行图形输出就必须对WM_PAINT进行处理。3、未处理的消息到那里去了:M$为窗口编写了默认的窗口过程,这个窗口过程将负责处理那些你不处理消息。正因为有了这个默认窗口过程我们才可以利用Windows的窗口进行开发而不必过多关注窗口各种消息的处理。例如窗口在被拖动时会有很多消息发送,而我们都可以不予理睬让系统自己去处理。4、窗口句柄:说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。例如有两个窗口共用一个窗口过程代码,你在窗口一上按下鼠标时消息就会通过窗口一的句柄被发送到窗口一而不是窗口二。一个消息从产生到被一个窗口响应,其中有5个步骤:1)系统中发生了某个事件。2)Windows把这个事件翻译为消息,然后把它放到消息队列中。3)应用程序从消息队列中接收到这个消息,把它存放在TMsg记录中。4)应用程序把消息传递给一个适当的窗口的窗口过程。5)窗口过程响应这个消息并进行处理。步骤3和4构成了应用程序的消息循环。消息循环往往是Windows应用程序的核心,因为消息循环使一个应用程序能够响应外部的事件。消息循环的任务就是从消息队列中检索消息,然后把消息传递给适当的窗口。如果消息队列中没有消息,Windows就允许其他应用程序处理它们的消息。Windows操作系统最大的特点就是其图形化的操作界面,其图形化界面是建立在其消息处理机制这个基础之上的3.6大体设计方案综上所述,在本程序中。首先使用相关的WINDOWSAPI创建窗口,其次实现程序的相应功能:1.使用OPENGL相应库函数画出三维图形。2.使之旋转起来。3.在窗体中响应鼠标事件,控制正方体的旋转。程序流程图如图3-3所示:图3-3程序流程图程序的大体内容以及机构已经构造成型,功能部分还需要进一步的细化。显然在消息循环中的内容还远不止这些,还需加入响应以下事件:1.当窗口大小发生变化时,重置窗口。2.响应鼠标事件,并改变相对应的参数值,来改变旋转速度。3.响应窗口中断事件,如关闭事件、屏保事件。4.WINMAIN主程序将程序激活并进入消息循环程序激活由CreateGLWindow()创建窗体创建窗体成功由函数Initialize()初始化OPENGL调用相关参数由Draw()在窗体中实现绘图旋转由LoadTexture()实现纹理贴图程序完成由DestroyWindowGL()销毁窗口,推出消息循环,结束程序。四、详细设计4.1OPENGL的绘制工作上面提到完成OPENGL的绘制工作主有两个主要方面的工作需要完成:1.OPENGL的初始化。2.OPENGL的绘制工作,其中包括了是图形旋转,纹理。以下我们分别来完成。4.1.1OPENGL的初始化工作通过查找资料OPENGL的初始化工作由如下库函数过程来完成glShadeModel(GL_SMOOTH);//启用阴影平滑启用smoothshading(阴影平滑)。阴影平滑通过多边形精细的混合色彩,并对外部光进行平滑。glClearColor(1.0f,0.0f,1.0f,0.5f);//紫色背景色彩值的范围从0.0f到1.0f。0.0f代表最黑的情况,1.0f就是最亮的情况。glClearColor后

1 / 30
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功