资源预览内容
第1页 / 共21页
第2页 / 共21页
第3页 / 共21页
第4页 / 共21页
第5页 / 共21页
第6页 / 共21页
第7页 / 共21页
第8页 / 共21页
第9页 / 共21页
第10页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
华中科技大学电子科学与技术系课程设计报告( 2010- 2011年度第 2 学期)名 称: 软件课程设计 题 目: 基于OpenGL的3D旋转魔方实现 院 系: 班 级: 学 号: 学生姓名: 指导教师: 设计周数: 成 绩: 日期: 年 月 日目 录1.课程设计介绍. 21.1目的. 21.2内容. 21.3取得的成果22.程序分析. 32.1 程序原理32.2 程序流程42.3 数据结构132.4 重要函数133.程序分析与结果演示16 3.1 成果演示16 3.2 程序分析174.出现过的问题185.心得和小节19211.课程设计介绍 1.1目的 21世纪是高科技时代,是信息技术时代,而计算机技术无疑会引领各行各业,为我们带来一个全新的时代。作为新世纪的接班人,我们必须拥有良好的计算机应用能力,才能跟上世界发展的大流,不至于在激烈的竞争中被淘汰。而程序作为计算机的灵魂,因此编程能力对当代大学生来说至关重要。通过本课程单元的学习,可以对软件工程项目从整体上有一个较清晰的了解和认识;可以提高自身软件编程能力,培养对计算机编程兴趣,培养良好的编程习惯。同时编程时的态度和方法对我们今后的学习和工作也有重要影响。所以整体看来软件课程设计这门课程提高了我们计算机使用水平,培养了我们良好的学习态度,对我们个人的发展而言有着重要的意义。 1.2 内容 (1)巩固和加强c语言相关编程知识,学会用Visual C+6.0进行c语言编程。(2)掌握程序设计流程和思想,模块化结构分析以及程序设计流程,初步培养需求分析、软件测试、调试的能力。 (3)掌握win32相关编程知识,了解windows程序内部运行机制。 (4)掌握OpenGL贴图技术原理与函数实现,掌握OpenGL几何的移动、旋转等模式变化的原理。 (5)掌握魔方图形构造原理,在掌握二阶魔方构造原理的基础上,构造出三阶魔方并实现其旋转。 1.3 取得的成果 在理解和掌握老师所给的范例程序的基础上,借助Win32平台进行了一系列调试和学习,熟练掌握了Win32 Application开发流程。同时也学习和了解了OpenGL的基本知识,掌握了一些OpenGL的重要技术与重要函数的使用,编写了一些简单的OpenGL程序。在比较透彻的了解了二阶魔方的构造原理后,成功地构造出了三阶魔方,换上了自己班级同学的图片,并且在一个小立方体的六个面上贴上了不同的图片。能够比较完美的实现三阶魔方各个层面的随机旋转,并且把窗口背景设置为红色。为了使程序更加有趣,我在程序中导入了刘德华的爱你一万年这首歌,使魔方在旋转的同时能够播放歌曲。除此之外,我还实现了一种三阶魔方自由移动的屏保效果:即三阶魔方在旋转的同时能够在屏幕内部自由移动,并且在边缘无限次的反弹。在魔方平移的过程中同样可以通过四个方向键来控制魔方的移动。当松开方向键后,魔方会继续按照先前的方式自由移动。2.程序分析2.1 程序原理(1)OpenGLOpenGL是为Open Graphics Library的简称,它是3D绘图工业标准,广泛地应用于计算机3D绘图领域。它是个专业的开放的3D程序接口,是一个功能强大,调用方便的底层3D图形库。它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植;OpenGL可以与Visual C+紧密接口,便于实现机械手的有关计算和图形算法,可保证算法的正确性和可靠性;它具有七大功能:建模、变换、颜色模式设置、光照和材质设置、纹理映射、位图显示和图象增强和双缓存动画功能。OpenGL使用简便,效率高。 本项目是在Visual C+6.0开发环境下,使用OpenGL函数库,绘制魔方并实现魔方贴图、随机旋转、以及键盘控制等功能。采用基本图形的绘图函数及定位函数,添加相应纹理来实现魔方模型的绘制。通过读取载入BMP文件,应用纹理贴图技术来完成对魔方旋转面的处理。通过OpenGL中对图形的旋转和平移函数来实现对魔方整体的旋转和平移。 (2)旋转 在建立好空间三维模型后,要实现魔方体每一层面的旋转。而魔方体每一层面的旋转归结于每一个小立方体的旋转。每个小立方体的旋转又最终归结于每个点的旋转。对于一个坐标为(x,y,z)的点,如果围绕z轴逆时针旋转角度为a,则旋转之后z坐标不变,x和y坐标分别变为x*cosa - y*sina,x*sina + y*cosa,如图1所示: 图1 这样,实现了每个点的旋转,针对每个立方体只需采用循环对8个点均采取旋转操作就可实现一个立方体的旋转。 (3)消息循环与定时器 由于程序在运行时CPU只能执行一个任务,然而此项目中魔方在旋转的同时要实现平移,所以需要用到Win32中的定时器功能。此程序中要用到的定时器的函数原型为:SetTimer(HWND hWnd ,UINT nIDEvent,UINT uElapse,TIMERPROC lpTimerFunc) HWND hWnd为窗口句柄,使程序和定时器建立联系,UINT nIDEvent是定时器ID,用于区分不同的定时器;UINT uElapse为定时器触发周期,意味着多长时间执行一次;,TIMERPROC lpTimerFunc为该定时器执行时触发的函数。所以控制好不同定时器的触发周期和触发函数,就能使魔方的各个层面的旋转和平移互不冲突。 2.2 程序流程(1)WinMain主函数 WinMain主函数是所有Win32程序的入口点。在WinMain函数里窗体的建立和消息循环,在消息循环中实现键盘、鼠标输入事件处理响应。在本程序中,要创建Window窗体和构建OpenGL设备绘图环境。Window窗体创建步骤:l 窗体类注册:RegisterClassl 设置显示分辨率:ChangeDisplaySettingsl 设置窗体大小:AdjustWindowRectExl 创建窗体:CreateWindowExOpenGL绘图环境搭建:l 获取设备绘图环境(DC,DeviceContext):hDC=GetDC(hWnd)l 选择绘图环境像素格式:ChoosePixelFormat(hDC,&pfd),其中pfd为像素格式描述符,如果设置不对,OpenGL绘图失败,看不到正确的显示结果。l 设置绘图环境像素格式:SetPixelFormat(hDC,PixelFormat,&pfd)l 获取OpenGL绘图环境:hRC =wglCreateContext(hDC)l 设置OpenGL绘图环境:wglMakeCurrent(hDC,hRC)(2)三维建模一个三阶魔方体由27个小立方体构成,每个小立方体由8个顶点组成,而每个顶点又有x,y,z三个方向上的坐标值。这样由结构体的层层嵌套就可以对魔方体的每个小立方体、每个顶点进行操作。typedef struct GLfloat p3; /定义一个点的x,y,z坐标值stPoint;typedef struct stPoint CubePoint8;/定义一个小立方体的8个顶点stCube;如图2: 图2 stCube Cube27; /定义魔方体的27个小立方体其中一个难点是怎样根据各个点的坐标值构造出魔方体,其实只要定义好每个顶点的坐标就行了。但是三阶魔方必须定义27*8=216个顶点的坐标值,而且很难用for循环实现,因为各个顶点的x,y,z坐标值几乎没有什么规律。但是如果能够将一个小魔方体作为一个整体来看待,工作量似乎会减轻很多。先在整个魔方体中间定义一个基准小立方体,则整个魔方体的各个小立方体均可以通过这个基准立方体的平移来实现,各个小立方体上各点的平移向量和小立方体中心的平移向量相同。static stPoint CubePoint8= /定义好基准小立方体,边长为1 -0.5f, -0.5f, 0.5f, /0 - 0.5f, -0.5f, 0.5f , /1 0.5f, 0.5f, 0.5f , /2 -0.5f, 0.5f, 0.5f, /3-0.5f, -0.5f, -0.5f,/4 -0.5f, 0.5f, -0.5f,/50.5f, 0.5f, -0.5f,/6 -0.5f, -0.5f, -0.5f,/7; 基准小立方体平移得到一个小立方体Cube0:for(int i=0;i8;i+)Cube0.CubePointi.p0 = CubePointi.p0 + 1.0f;Cube0.CubePointi.p1 = CubePointi.p1 - 1.0f;Cube0.CubePointi.p2 = CubePointi.p2 - 1.0f;其他26个立方体可通过同样的方法得到。我认为这是整个程序中最难也是最麻烦的一点。本程序是通过reset_model()这一函数来构造出整个魔方体的。(3)OpenGL贴图实现glGenTextures(1, &texturei),作用是利用载入的图像生成纹理。glTexCoord2f(GLfloat s, GLfloat t) 函数用于绘制图形时指定纹理的坐标。第一个参数是X坐标,0.0是纹理的左侧,0.5是纹
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号