




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机图形学课程设计摘要本文主要描述了计算机图形学中,运用Visual C+6.0和OpenGL来实现的绘制一个三维真实感图形设计与绘制的一个课题,在本课题中主要是介绍三维图形及动画场景,就是把所建立的三维空间模型,经过计算机的复杂处理,最终在计算机二维屏幕上显示的过程,并且在显示的过程要保证其真实感,三维图形经过计算机的简单处理之后,通过在显示屏上显示出来,达到预定的三维效果。本文就是运用Visual C+6.0和OpenGL来实现的,运用计算机技术显示三维图像,最终达到预期效果。本次课题主要做了以下几方面的工作:具体包括三维几何造型技术、曲面造型方法、OpenGL的工作原理及相关技术、真实感图形的实现,基于上述理论及成果,以XP系统和Visual C+6.0为平台,利用基本OpenGL函数编程技术实现了一系列三维图形,实现了各种角度下的三维图形,显示出了三维图形真实感的效果,本课题具有较重要的理论和实践指导意义。关键字:三维图形 VC+ OpenGL 真实感目录摘要2目录3第一章 绪论41.1、三维图形设计的意义与趋势4第二章 需求分析52.1、课题实现的功能52.2、课题设计思路5第三章 三维图形的设计过程63.1、三维图形设计的过程如下:63.2、设计过程说明:6第四章 三维图形的主程序74.1、主要程序设计的说明7第五章 设计结果185.1、设计结果如下:18第六章 设计小结20参考文献21附录22OpenGL简介22第一章 绪论1.1、三维图形设计的意义与趋势 三维图形在很多领域都有很广泛的实际应用,在开发三维图形应用程序的过程中,为了确保核心算法模块的通用性与扩展性,并可能的降低成本,通常把与核心技术密切相关的内容提取出来进行地理开发,而三维图形引擎正是这样的一个独立模块。目前,计算机图形学已进入三维时代,三维图形引擎作为上层图形应用的核心,决定着三维图形的表现、稳定性、速度和真实感等特性,这些特性都与三维图形引擎密切相关,建立在引擎的基础之上。因此,研究开发一款功能强大、稳定高效的三维图形引擎,以及其中的关键技术具有极大的应用价值和研究意义。融合知识工程的三维设计软件是辅助设计工具变革的一个里程碑,三维设计软件不但能将设计规则、设计标准等规则性知识集成在软件中,而且能将设计人员的设计过程有效纪录下来,完成设计过程知识的积累。后期设计人员在使用三维软件时,既能高效率地保证设计方案满足设计规则、设计标准的要求,又能使用早期积累的过程知识自动完成设计方案的构建。 现阶段市场竞争激烈,产品日趋复杂,个性化要求日益增多,设计开发的难度越来越大。在知识爆炸的时代,企业如何满足市场环境的要求是每个企业必须面临的问题。有效的知识积累、知识重用,促进高效率、高质量、创新性的设计开发是企业的唯一生存之道。采用三维软件辅助设计将满足这一发展需求,因而采用三维软件辅助设计是必然的发展趋势。这种发展趋势可以从汽车、飞机等行业近期的发展,以及3D软件近年的市场份额增加得到证实。 第二章 需求分析2.1、课题实现的功能(1)本课题要求应用OpenGL的光照技术和纹理技术实现一个简单的三维真实感图形的程序设计。具体要求实现功能: 1、通过对话方式实现交互式设计光照模型功能。 2、实现三维模型纹理映射功能。 3、用鼠标跟踪球方法实现三维模型的空间旋转。(2)技术要点说明1、三维模型显示场景树:将三维可视化模型场景内容分解用一种树或表数据结构描述。 2、实现一个读Targa文件的程序:Targa是一种常见的图像格式文件,该文件通常以未压缩的格式存储图像。3、实现鼠标跟踪球方法程序。2.2、课题设计思路要设计一个良好的场景和优秀的交互方式,现在虚拟现实场景十分繁多,各种交互方式也五花八门,我们要选择特定的场景,场景要保证两点:一是其新鲜性,让人耳目一新,否则会让人有过于老套的感觉;另外就是其真实度,这是本次课题的着重关注点;在选取选定的场景后,我们要定义各交互方式,在从现有可得到的交互方式案例中提取和创新,以保证开发出来的交互方式可以最大程度的提高人机交互的效率。 场景的规模是必须考虑的,因为设计的时间和人员有限,必须限制场景规模,没有时间和人力去开发过大的场景规模,但是如果场景规模过小,演示系统就无法给人带来非常强烈的真实感冲击,而且过小规模的场景也会限制交互方式的设计和开发。 三维图形及动画场景的显示,就是把所建立的三维空间模型,经过计算机的复杂处理,最终在计算机二维屏幕上显示的过程,并且在显示的过程要保证其真实感。一般,设计三维图形软件要经过以下步骤:(1)图元建立三维模型。(2)设置观看物体的窗口和观看点(视点)。(3)设定各物体的属性(如色彩、光照、纹理映射等)(4)如果要物体动起来,还要进行图形变换(如几何变换、视窗变换和投影变换等)。(5)三维图形的二维化。第三章 三维图形的设计过程3.1、三维图形设计的过程如下:(1) 建立三维模型建立三维模型,就是在三维坐标系中画三维场景。利用画点(Point)、画线(Line)、画多边形(Polygon)等函数可以建立复杂的空间模型。在表示三维空间时,一般用齐次坐标(Homogeneous Coordinate)。在实际应用时一般把一系列顶点(Vertex )组织起来以构成物体或图元。(2) 置窗口和视口 图形显示的区域称为显示窗口。流程顺序为:定义一个窗口一般由以下步骤完成:设置窗口模式,设置窗口位置、大小,初始化窗口,窗口颜色设置清理窗口是指把窗口清成某种颜色。要观看场景,也需要一个窗口,即视口。通俗地讲,视口变大,场景被放大;视口变小,场景被缩小。(3) 设置光照 要使物体具有真实感,就要对物体进行光照处理。在计算机图形学中,物体的真实感应考虑两种因素:光源和物体材质。3.2、 设计过程说明:首先,为了绘制三维分形图形,我们先要建立数学模型。物体的三维模型的建立,需要向计算机输入三维数据,而在实际应用中,三维数据的输入是一个复杂的问题,需要用曲线、曲面拟合的方法建立模型。因此要根据不同的三维分形图形的具体情况,寻找合适的方法来建立它们各自的数学模型。其次,要在计算机上进行三维分形的算法实现。在显示设备上逼真地显示出建立的模型,需要对原始图形数据进行坐标变换、隐藏面消除和明暗处理,最后生成所要显示的真实感图形。针对不同的三维分形图形,如何采取合适的方法在计算机上实现,需要通过对问题的具体分析后进行选取。第四章 三维图形的主程序4.1、主要程序设计的说明/main函数(其中部分函数代码省略)#include #include #include #include gtools.h#include Texture.h#define MAXTEXTURE 1 /定义纹理贴图数GLuint textureMAXTEXTURE; /纹理数组,保存纹理名字(name)/ 鼠标位置 int OldX = -1;int OldY = -1;/ 是否进行鼠标追踪球 bool gIsStartTrackBall = false;/ 旋转矩阵 double mMatrix16;/ 向量的点积 double dotMult(GPoint3d v1, GPoint3d v2)/ 向量的叉积 GPoint3d crossMult(GPoint3d v1, GPoint3d v2) / 将鼠标二维点映射为球面向量(用于鼠标追踪球) GPoint3d gMousePtToSphereVec(int x, int y, int w, int h) /绘制网格线void drawPlane() glColor3f(1.0f, 1.0f, 1.0f); for(float u=-1.0; u=1.0; u+=0.2f) glBegin(GL_LINES); glVertex3f(-1, 0, u); glVertex3f(1, 0, u); glVertex3f(u, 0, -1); glVertex3f(u, 0, 1); glEnd(); /绘制正方体void DrawTextureCube(double xPos,double yPos,double zPos)glPushMatrix();glTranslatef(xPos,yPos,zPos);/顶面 glBegin(GL_QUADS); glTexCoord2f(0.0,0.0);glVertex3f(-0.3,0.3,0.3); glTexCoord2f(1.0,0.0);glVertex3f(0.3,0.3,0.3); glTexCoord2f(1.0,1.0);glVertex3f(0.3,0.3,-0.3); glTexCoord2f(0.0,1.0);glVertex3f(-0.3,0.3,-0.3); glEnd();/正面: glBegin(GL_QUADS); glTexCoord2f(0.0,0.0);glVertex3f(0.3,-0.3,0.3); glTexCoord2f(1.0,0.0);glVertex3f(0.3,0.3,0.3); glTexCoord2f(1.0,1.0);glVertex3f(-0.3,0.3,0.3); glTexCoord2f(0.0,1.0);glVertex3f(-0.3,-0.3,0.3); glEnd()/右面: glBegin(GL_QUADS); glTexCoord2f(0.0,0.0);glVertex3f(0.3,0.3,-0.3); glTexCoord2f(1.0,0.0);glVertex3f(0.3,0.3,0.3); glTexCoord2f(1.0,1.0);glVertex3f(0.3,-0.3,0.3); glTexCoord2f(0.0,1.0);glVertex3f(0.3,-0.3,-0.3); glEnd();/左面 glBegin(GL_QUADS); glTexCoord2f(0.0,0.0);glVertex3f(-0.3,-0.3,0.3); glTexCoord2f(1.0,0.0);glVertex3f(-0.3,0.3,0.3); glTexCoord2f(1.0,1.0);glVertex3f(-0.3,0.3,-0.3); glTexCoord2f(0.0,1.0);glVertex3f(-0.3,-0.3,-0.3); glEnd();/底面: glBegin(GL_QUADS); glTexCoord2f(0.0,0.0);glVertex3f(0.3,-0.3,0.3); glTexCoord2f(1.0,0.0);glVertex3f(-0.3,-0.3,0.3); glTexCoord2f(1.0,1.0);glVertex3f(-0.3,-0.3,-0.3); glTexCoord2f(0.0,1.0);glVertex3f(0.3,-0.3,-0.3); glEnd();/后面: glBegin(GL_QUADS); glTexCoord2f(0.0,0.0);glVertex3f(0.3,0.3,-0.3); glTexCoord2f(1.0,0.0);glVertex3f(0.3,-0.3,-0.3); glTexCoord2f(1.0,1.0);glVertex3f(-0.3,-0.3,-0.3); glTexCoord2f(0.0,1.0);glVertex3f(-0.3,0.3,-0.3); glEnd(); glPopMatrix();/ 绘制事件函数 void displayEvent() glClearColor(0, 0, 0, 0); /设置背景颜色 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); /设置当前矩阵为模型视图矩阵 glLoadIdentity(); /载入单位矩阵 glTranslatef(0, 0, -3.50f); glMultMatrixd(mMatrix); drawPlane(); glLineWidth(2); /线宽glDisable(GL_BLEND);/ 关闭透明处理 glEnable(GL_DEPTH_TEST); / 启用深度测试glBlendFunc(GL_SRC_COLOR,GL_DST_COLOR); / 指定计算源混合因子和目标混合因子 glPushMatrix(); glTranslatef(-0.3, 0.3, -0.3); DrawTextureCube(0.0,0.0,0.0); / 绘制正方体 glPopMatrix(); glPushMatrix(); glTranslatef(0.3, 0.2, -0.3);glColor3f(0.98,0.625,0.12); glutSolidSphere(0.2f, 16, 16); / 绘制球体 glPopMatrix(); glPushMatrix(); glTranslatef(-0.1, 0.0, 0.3); glRotatef(-90, 1, 0, 0);glColor3f(0.0,0.9,0.0); glutWireCone(0.2f, 0.8f, 16, 16); / 绘制圆锥体 glPopMatrix(); glFlush(); glutSwapBuffers(); / 交换缓存 /对opengl进行设置void InitGL(GLvoid) glClearColor(0.0,0.0,0.0,0.0); glShadeModel(GL_SMOOTH); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glFrontFace(GL_CCW); /启用2D纹理映射: glEnable(GL_TEXTURE_2D); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); / 最精细的透视计算 BuildTexture(B_mar003b_49.jpg, texture0); /生成纹理,并保存在texture0中。/ 窗体尺寸变化事件 void resizeEvent(int w, int h) / 鼠标事件函数 void mouseEvent(int button, int state, int x, int y) /鼠标移动事件 void mouseMoveEvent(int x, int y) /光源及材质设置void SetupRC()/主函数int main(int argc, char *argv)/Texture.cpp载入图片并转换为纹理#include / 标准输入输出头文件#include / OLE控制库头文件#include / 数学函数头文件#include / OpenGL32库的头文件#include Texture.hbool BuildTexture(char *szPathName, GLuint &texid) / 载入图片并转换为纹理 HDC hdcTemp; / DC用来保存位图 HBITMAP hbmpTemp; / 保存临时位图 IPicture *pPicture; / 定义IPicture Interface OLECHAR wszPathMAX_PATH+1; / 图片的完全路径 char szPathMAX_PATH+1; / 图片的完全路径 long lWidth; / 图像宽度 long lHeight; / 图像高度 long lWidthPixels; / 图像的宽带(以像素为单位) long lHeightPixels; / 图像的高带(以像素为单位) GLint glMaxTexDim ; / 保存纹理的最大尺寸 if (strstr(szPathName, http:/) / 如果路径包含 http:/ 则. strcpy(szPath, szPathName); / 把路径拷贝到 szPath else / 否则从文件导入图片 GetCurrentDirectory(MAX_PATH, szPath); / 取得当前路径 strcat(szPath, ); / 添加字符 strcat(szPath, szPathName); / 添加图片的相对路径 MultiByteToWideChar(CP_ACP, 0, szPath, -1, wszPath, MAX_PATH); / 把ASCII码转化为Unicode标准码 HRESULT hr = OleLoadPicturePath(wszPath, 0, 0, 0, IID_IPicture, (void*)&pPicture); if(FAILED(hr) / 如果导入失败 / 图片载入失败出错信息 MessageBox (HWND_DESKTOP, 图片导入失败!n(TextureLoad Failed!), Error, MB_OK | MB_ICONEXCLAMATION); return FALSE; / 返回 FALSE hdcTemp = CreateCompatibleDC(GetDC(0); / 建立窗口设备描述表 if(!hdcTemp) / 建立失败? pPicture-Release(); / 释放IPicture / 图片载入失败出错信息 MessageBox (HWND_DESKTOP, 图片导入失败!n(TextureLoad Failed!), Error, MB_OK | MB_ICONEXCLAMATION); return FALSE; / 返回 FALSE glGetIntegerv(GL_MAX_TEXTURE_SIZE, &glMaxTexDim); / 取得支持的纹理最大尺寸 pPicture-get_Width(&lWidth); / 取得IPicture 宽度 (转换为Pixels格式) lWidthPixels = MulDiv(lWidth, GetDeviceCaps(hdcTemp, LOGPIXELSX), 2540); pPicture-get_Height(&lHeight); / 取得IPicture 高度 (转换为Pixels格式) lHeightPixels = MulDiv(lHeight, GetDeviceCaps(hdcTemp, LOGPIXELSY), 2540); / 调整图片到最好的效果 if (lWidthPixels = glMaxTexDim) / 图片宽度是否超过显卡最大支持尺寸 lWidthPixels = 1 (int)floor(log(double)lWidthPixels)/log(2.0f) + 0.5f); else / 否则,将图片宽度设为显卡最大支持尺寸 lWidthPixels = glMaxTexDim; if (lHeightPixels = glMaxTexDim) / 图片高度是否超过显卡最大支持尺寸 lHeightPixels = 1 Release(); / 释放IPicture / 图片载入失败出错信息 MessageBox (HWND_DESKTOP, 图片导入失败!n(TextureLoad Failed!), Error, MB_OK | MB_ICONEXCLAMATION); return FALSE; / 返回 FALSE SelectObject(hdcTemp, hbmpTemp); / 选择临时DC句柄和临时位图对象 / 在位图上绘制IPicture pPicture-Render(hdcTemp, 0, 0, lWidthPixels, lHeightPixels, 0, lHeight, lWidth, -lHeight, 0); / 将BGR转换为RGB将ALPHA值设为255 for(long i = 0; i Release(); / 释放 IPicture return true; / 返回 TRUEbool BuildTexture(char *filename, TextureTga *texture) / 载入一个.TGA 文件到内存 GLubyte TGAheader12 = 0,0,2,0,0,0,0,0,0,0,0,0; / 没有压缩的TGA Header GLubyte TGAcompare12; / 用来比较 TGA Header GLubyte header6; / Header里,头六个有用字节 GLuint bytesPerPixel; / 保存TGA文件里每个像素用到的字节数 GLuint imageSize; / 用来保存随机产生的图像的大小GLuint temp; / 临时变量 GLuint type = GL_RGBA; / 将默认的GL模式设置为RBGA (32 BPP) FILE *file = fopen(filename, rb); / 打开 TGA 文件 if (file = NULL) / 文件是否已存在? / 图片载入失败出错信息 MessageBox (HWND_DESKTOP, 图片导入失败!n(TextureLoad Failed!), Error, MB_OK | MB_ICONEXCLAMATION); return FALSE; / 返回FALSE if (fread(TGAcompare,1,sizeof(TGAcompare),file) != sizeof(TGAcompare)/ 是否有十二个字节可读? | memcmp(TGAheader,TGAcompare,sizeof(TGAheader) != 0 / header和我们想要的是否相符? | fread(header,1,sizeof(header),file) != sizeof(header) / 如果是读下六个字节 fclose(file); / 如果失败,关闭文件 / 图片载入失败出错信息 MessageBox (HWND_DESKTOP, 图片导入失败!n(TextureLoad Failed!), Error, MB_OK | MB_ICONEXCLAMATION); return FALSE; / 返回FALSE texture-width = header1 * 256 + header0; / 确定的TGA 宽度 (高字节*256+低字节) texture-height = header3 * 256 + header2; / 确定的TGA 高度 (高字节*256+低字节) if (texture-width height bpp = header4; / 获取TGA每个像素的位(24 or 32) bytesPerPixel = texture-bpp / 8; / 除以8以取得 每个像素的字节 imageSize = texture-width*texture-height*bytesPerPixel; / 计算TAG数据所需要的内存 texture-imageData = (GLubyte *)malloc(imageSize); / 开辟一个内存空间用来存储TGA数据 if (texture-imageData = NULL / 用来存储的内存是否存在? | fread(texture-imageData, 1, imageSize, file) != imageSize) / 图像大小是否和内存空间大小相符? if (texture-imageData != NULL) / 图像数据是否载入 free(texture-imageData); / 如果是 释放图像数据 fclose(file); / 关闭文件 MessageBox (HWND_DESKTOP, 图片导入失败!n(TextureLoad Failed!), Error, MB_OK | MB_ICONEXCLAMATION); return FALSE; / 返回FALSE for (GLuint i=0; iimageDatai; / 将图像数据i的值存在临时变量中 texture-imageDatai = texture-imageDatai + 2; / 将第三个字节的值存到第一个字节里 texture-imageDatai + 2 = temp; / 将临时变量的值存入第三字节(第一字节的值) fclose (file); / 关闭文件 /创建一种纹理 glGenTextures(1, &texture-texID); / 产生OpenGL纹理ID glBindTexture(GL_TEXTURE_2D, texture-texID); / 绑定纹理 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); / 线性滤波 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); / 线性滤波if (texture-bpp = 24) / TGA图片是不是 24 位的 type = GL_RGB; / 如果是将type设置为 GL_RGB glTexImage2D(GL_TEXTURE_2D, 0, type, texture-width, texture-height, 0, type, GL_UNSIGNED_BYTE, texture-imageData); return true; / 纹理创建成功,返回正确第五章 设计结果5.1、设计结果如下:第六章 设计小结本次对三维图形的设计与制作使我对三维图形有了新的了解和认识,通过对三维图形设计过程的了解,我对三维图形的制作过程非常感兴趣,特别是对VC+和OpenGL等工具的运用,总而言之,OpenGL是一个硬性图形发生器的软件接口,可以让开发者利用复杂的三维物体或自然场景,由于微软公司将OpenGL集成到windows上,为能够在微机上实现高品质和交互式三维图像奠定了基础。此次课程设计更让我对编程有了进一步的认识,在程序的运行中出现了许多问题,例如程序运行出错、标点符号的缺失等等,特别是在此次课题设计过程中对开发工具Visual C+6.0和OpenGL更加熟悉,为以后熟练运用打下了坚实的基础。经历了两个礼拜的课程设计,我对计算机图像学有了新的认识,使我对图形的变换和三维图形的制作过程更加喜爱,我相信计算机图像学将来的发展无可想象,图形变幻莫测特别是三维图形的设计,以后我会加大对三维图形设计与制作的学习。参考文献1 孙家广,胡事民 . 计算机图形学基础教程(第二版)M 北京:清华大学出版社,2009 . 2 David Fogers 石教英等 翻译 计算机图形学的算法基础
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 8 蝴蝶的家 公开课一等奖创新教案
- 统编版四年级下册语文第八单元习作故事新编 公开课一等奖创新教学设计(2课时)
- 先天性血管环课件
- 教育内容审核与质量控制的自动化方法研究-洞察及研究
- 9端午粽 公开课一等奖创新教学设计
- 内河船员内部安全培训课件
- 药物质量标准建立-洞察及研究
- 进阶任务执行策略解析
- 化妆品企业安全培训课件
- 技术培训流程
- 第13课《警惕可怕的狂犬病》 课件
- 仪表施工全过程的管理
- 如何预防与处理跑步中的常见损伤
- MSOP(测量标准作业规范)测量SOP
- 001 220kV升压站事故油池施工方案
- 智慧停车场运营管理项目风险评估报告
- 九年义务教育全日制小学数学教学大纲(试用)
- 出资比例的协议合同
- GB/T 10345-2022白酒分析方法
- GB/T 19418-2003钢的弧焊接头缺陷质量分级指南
- 四川省参保单位职工社会保险费欠费补缴申报表
评论
0/150
提交评论