版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、软件课程设计指导书系列之二课程设计指导书基于OpenGL的3D旋转魔方实现指导老师:杨 文 涛 Mail:unxioracle2000Mobile中科技大学电子科学与技术系2011年2月20日14一、课程设计的目的和意义本课程目的和意义 通过本课程单元的学习,使学生对软件工程项目从整体上有一个较清晰的了解和认识;可以提高学生的软件编程能力,培养学生的计算机编程兴趣,培养良好的编程习惯。这对当前推进大学计算机技术普及教育,提高大学生计算机使用水平具有积极的意义。二、课程设计的要求1. 掌握软件开发模式,结构模块化分析,程序设计流程;2. 学会使用当前流行的开发工具软件V
2、isual C+6.0,能独立编制中低难度的应用程序软件;3. 掌握有关程序设计思想、数据结构定义、常用C语言算法,掌握OpenGL开发;.4. 初步培养需求分析,软件测试、调试的能力;.三、 本单元课程设计描述 基于OpenGL的3D魔方实现:在3D空间中实现2X2魔方,各个魔方单元格显示不同的贴图,魔方体能在3D空间自由旋转、每层也能旋转。 通过软件程序来模拟这个实际日常生活中魔方玩具。对于学有余力的学生可以尝试3X3魔方,其成绩可适当提高。编程开发环境操作系统为Win2000 WinXP;Visual C+ 6.0软件开发平台。 课程设计所需准备工作l 熟悉Win32应用程序开发框架与实
3、现流程;l 掌握三维立体绘图基本原理和过程;l 熟悉掌握OpenGL开发包知识与开发流程;l 学习使用OpenGL相关函数;四、课程设计内容 1.程序设计与实现1.1 需求分析首先在OpenGL 3D空间中绘制一个Cube,可以直接调用画平面的指令,重复6次,就可以绘制出一个立方体对象。再对对象实现模式变换,既可实现物体的旋转。采用贴图技术,可以将一幅画贴在某个平面上,因而可以得到包含图片的立方体。1、一个包含贴图立方体的旋转在绘制单个立方体的基础上,可以绘制多个立方体(2X2),将着8个小立方体按照一定的相对位置组合,形成一个2X2的立体魔方。2、2X2 三维魔方旋转1.2 功能模块分析根据
4、以上需求分析,可将本程序划分为以下几个子功能模块:l Win32应用框架WinMain函数入口,各个参数含义。如何构建Windows窗体,Windows消息循环机制和消息处理。l 魔方体的空间建模定义数据结构,确定一个立方体和魔方的几何模型:立方体顶点空间坐标、每个立方体的相对位置、旋转平面。 l 魔方体旋转在定时器控制下,实现魔方体整体旋转、单元立方体旋转,模拟实际中魔方体各种变换。 l OpenGL绘图OpenGL绘图原理和过程,掌握计算机3D绘图、OpenGL基础知识。1.3 程序分析与实现 依照上面划分功能模块,分析各模块是如何实现的。1.3.1 Windows窗口显示 (1) Win
5、Main主函数 WinMain主函数是所有Win32程序的入口点。在WinMain函数里实现Window是窗体的建立和消息循环,在消息循环中实现键盘、鼠标输入事件处理响应,具体内容可参考VC程序参考手册。在本课程程序中,不仅要创建Window窗体,而且构建OpenGL设备绘图环境。Window窗体创建步骤:l 窗体类注册:RegisterClassl 设置显示分辨率:ChangeDisplaySettingsl 设置窗体大小:AdjustWindowRectExl 创建窗体:CreateWindowExOpenGL绘图环境搭建:l 获取设备绘图环境(DC,DeviceContext):hDC=
6、GetDC(hWnd)l 选择绘图环境像素格式:ChoosePixelFormat(hDC,&pfd),其中pfd为像素格式描述符,如果设置不对,OpenGL绘图失败,看不到正确的显示结果。l 设置绘图环境像素格式:SetPixelFormat(hDC,PixelFormat,&pfd)l 获取OpenGL绘图环境:hRC =wglCreateContext(hDC)l 设置OpenGL绘图环境:wglMakeCurrent(hDC,hRC)1.3.2 三维建模首先确定一个立方体A各个顶点空间坐标,并对8个顶点编号,四个顶点确定一个平面。目的是便于按照OpenGL规则绘制面片和
7、贴图处理。对应的数据结构定义如下。typedef struct GLfloat p3;stPoint; /一个顶点的定义其它立方体Ci的空间坐标可以通过对A复制并且平移某个单元整数Nx,y,zstatic stPoint CubePoint8= -1.0f, -1.0f, 1.0f, /0 - 1.0f, -1.0f, 1.0f , /1 1.0f, 1.0f, 1.0f , /2 -1.0f, 1.0f, 1.0f, /3-1.0f, -1.0f, -1.0f,/4 -1.0f, 1.0f, -1.0f,/51.0f, 1.0f, -1.0f,/6 -1.0f, -1.0f, -1.0f,/
8、7 ;一个立方体由8个点组成,8个点组成6个面片,对立方体的几何操作本质上就是对这6个平面的操作(绘制、纹理、旋转和平移等)。点的索引号确定后,每个面片也就确定了,如0,1,2,3四个点构成Z向正投影面。3、一个立方体几何建模一个立方体可由如下结构体定义:typedef struct stPoint CubePoint8; /构成一个立方体的8个顶点stCube;stCube Cube8;/8个立方体构成一个魔方体8个立方体构成2X2魔方矩阵,对每个立方体进行编号i。魔方体某层的旋转是基于选中的四个立方体绕魔方体的中心轴变化的。由此定义魔方体每个层面包含的子立方体集合初始索引编号(const
9、目的是在程序运行中不可更改):const BYTE SZM4 = 0,1,2,3; /Z正向的四个子立方体编号const BYTE SZP4 = 4,5,6,7; / Z负向的四个子立方体编号const BYTE SYM4 = 0,1,5,4; / Y负向的四个子立方体编号const BYTE SYP4 = 2,3,6,7; / Y正向的四个子立方体编号const BYTE SXM4 = 1,2,6,5; / X正向的四个子立方体编号const BYTE SXP4 = 0,3,7,4; / X负向的四个子立方体编号为了便于运算,同时定义了一个静态魔方立方体,stCube Static_Cube
10、8它相对于运动的stCube Cube8其子立方的顶点位置、索引号都是固定不变的,作为运动魔方体Cube基准参考。预定义好这些层面目的是确定好旋转前后各个子立方体的相对位置。4、魔方体的构成为了记录魔方体旋转之后各子立方的绝对位置,为此专门定义了同上类似的数组结构(开始时,与初始值一样):BYTE ZP 4 = 0,1,2,3; /z-direction plus BYTE ZM 4 = 4,5,6,7; /z-direction minusBYTE YM4 = 0,1,5,4; /y-direction minusBYTE YP4 = 2,3,7,6; /z-direction plusBY
11、TE XM4 = 1,2,6,5; /x-direction minusBYTE XP4 = 0,3,7,4; /x-direction plus同时定义了一个静态魔方立方体,它们记录魔方体旋转更新之后,各层面内实际包含小立方体的索引号。如图4中,绕+Z轴逆时针旋转90°,各层面对应的子立方索引更新为:ZP 4 = 0,1,2,3; /+Z directionZM 4 = 4,5,6,7; /-Z direction YM4 = 2,1,6,7; /+Y direction minusYP4 = 3,0,5,4; /-Y direction plusXM4 = 3,4,7,2; /-
12、Xdirection minusXP4 = 0,5,6,1; /+Xdirection plus5、绕+Z轴旋转90°后各层面子立方体变化综上所述,魔方体几何位置旋转本质上就是就是同步更新各层面内的小立方的索引表。1.3.3 模型旋转立方体在空间的旋转,归根到底是其顶点的旋转,如空间点(x, y, z)绕Z轴旋转a对应的旋转矩阵:cosa sina-sina cosa一个立方体pCube绕Z轴旋转a后对应的坐标变化为:for( int i=0;i<8;i+) float x,y; x= pCube->CubePointi.p0; y= pCube->CubePoin
13、ti.p1; pCube->CubePointi.p0 = x*cosa - y*sina; pCube->CubePointi.p1 = x*sina + y*cosa;其它轴的旋转类似。由于魔方体层面的旋转是90°,在某个层面内一个子立方体Ci会被另外一个Cj完全替换,因此旋转后必须同步更新魔方体Cube各层面内包含的子立方的索引号。为了简化算法,只需查找旋转后Cubei在Static_Cube中对应的小立方编号j与i的位置匹配。for( i=0;i<8;i+) /旋转后ZM层面的子立方搜索实现成员更新 for( j=0;j<4;j+) if( is_eq
14、ual( &Cubei, &Static_Cube SZMj ) ) ZMk+ = i; 上述代码is_equal是判断旋转后的魔方体Cube的那些子立方Cubei与静态的魔方体Static_Cube的SZM层面内的子立方重合,找出之后作为ZM的新成员。最终能找到4个子立方作为新成员。其它层面的如ZP、XP、XM、YP、YM处理与之类似。1.3.4 OpenGL图形绘制在OpenGL中有画点、线、面的指令函数。在本应用课程程序中,需要绘制立方体体的每个面片,使用GL_QUADS绘图指令,同时设置纹理坐标,完成表面的贴图。绘制一个立方体的函数如下。void DrawObject(
15、int ID)stPoint *CubePoint = CubeID.CubePoint;glBegin(GL_QUADS);/ Front FaceglTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint0.p);glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint1.p);glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint2.p);glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint3.p);/ Back Facegl
16、TexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint4.p);glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint5.p);glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint6.p);glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint7.p);/ Top FaceglTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint5.p);glTexCoord2f(0.0f, 0.0f); g
17、lVertex3fv( CubePoint3.p);glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint2.p);glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint6.p);/ Bottom FaceglTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint4.p);glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint7.p);glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint1
18、.p);glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint0.p);/ Right faceglTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint7.p);glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint6.p);glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint2.p);glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint1.p);/ Left FaceglTexCoo
19、rd2f(0.0f, 0.0f); glVertex3fv( CubePoint4.p);glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint0.p);glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint3.p);glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint5.p);glEnd();其中glBegin(GL_QUADS)发布四边形绘图指令,glTexCoord2f指定平面纹理坐标,glVertex3fv是四边形的顶点坐标。glEnd()结束当前几何体绘图。
20、每个函数使用可查看MSDN手册。 1.5 OpenGL开发进阶OpenGL是为Open Graphics Library的简称,它是3D绘图工业标准,广泛地应用于计算机3D绘图领域,它是个专业的开放的3D程序接口,是一个功能强大,调用方便的底层3D图形库;它独立于视窗操作系统或其它操作系统的,亦是网络透明的。在包含CAD、内容创作、能源、娱乐、游戏开发、制造业、制药业及虚拟现实等行业领域中,OpenGL帮助程序员实现在 PC、工作站、超级计算机等硬件设备上的高性能、极具冲击力的高视觉表现力图形处理软件的开发。OpenGL是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应
21、用程序可以十分方便地在各种平台间移植;OpenGL可以与Visual C+紧密接口,Windows下3D程序开发;OpenGL使用简便,效率高。它具有七大功能: 1.建模:OpenGL图形库除了提供基本的点、线、多边形的绘制函数外,还提供了复杂的三维物体(球、锥、多面体、茶壶等)以及复杂曲线和曲面绘制函数。 2.变换:OpenGL图形库的变换包括基本变换和投影变换。基本变换有平移、旋转、变比镜像四种变换,投影变换有平行投影(又称正射投影)和透视投 影两种变换。其变换方法有利于减少算法的运行时间,提高三维图形的显示速度。 3.颜色模式设置:OpenGL颜色模式有两种,即RGBA模式和颜色索引(C
22、olor Index)。 4.光照和材质设置:OpenGL光有辐射光(Emitted Light)、环境光(Ambient Light)、漫反射光(Diffuse Light)和镜面光(Specular Light)。材质是用光反射率来表示。场景(Scene)中物体最终反映到人眼的颜色是光的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色。 5:纹理映射(Texture Mapping)。利用OpenGL纹理映射功能可以十分逼真地表达物体表面细节。 6:位图显示和图象增强图象功能除了基本的拷贝和像素读写外,还提供融合(Blending)、反走样(Antialiasing)和雾(fog)的特殊
23、图象效果处理。以上三条可使被仿真物更具真实感,增强图形显示的效果。 7:双缓存动画(Double Buffering)双缓存即前台缓存和后台缓存,简言之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面。要掌握OpenGL程序开发不是一个简单过程,需要由浅入深逐步进行。基于Visual C+6.0开发过程:l 建立基于OpenGL的应用程序框架Win32 ;l 创建项目:在file -> New->Projects中建立项目,基于Win32 Application ,输入工程名;l 添加库:在project->Setting中添加库: opengl32.lib g
24、lu32.lib glaux.lib;具体实现可参考例子Magic2D.dsw。1.6 本单元课程设计作业要求(1)在窗体显示“学生姓名、班级、学号”的消息框,程序标题显示学生姓名。(2)立方体贴图显示本人图片(256X256 BMP图片格式,否则不能正常显示)。(3)读Magic2D例子代码,在此基础上可适当改进(也可重新编写新的算法),优化算法流程结构和数据结构,关键函数重新改写,要求函数名、数据、实现过程不得与范例子源码程序Magic2D相同。(4) 学生提供的代码与报告严禁与示范例子源码抄袭和本文档,如果发现雷同,成绩考核为0;(5) 学生提供的源码需要有注释说明:介绍函数功能、参数和
25、返回值;2、阶段性考核办法2.1 前期工作(30%)学习Visual C+ 6.0开发环境,熟悉掌握Win32 Application开发流程,熟悉OpenGL基本知识,掌握OpenGL开发包的原理、规范、重要函数使用和程序开发流程。在读懂例子程序Magic2D基础上能编写最简单OpenGL程序。掌握 glViewport(0,0,width,height);/ Reset The Current ViewportglMatrixMode(GL_PROJECTION);/ Select The Projection MatrixglLoadIdentity();/ Reset The Proj
26、ection Matrix/ Calculate The Aspect Ratio Of The WindowgluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);glMatrixMode(GL_MODELVIEW);/ Select The Modelview MatrixglLoadIdentity();等函数的使用、目的等。最后提交阶段性工作报告。报告内容规范: 本软件课程设计的目的、意义,背景知识介绍; 总结VC、OpenGL程序开发方法、流程,心得体会,解决了什么问题、未确定的问题;提交报告要求:l 每个人一
27、份纸质报告,每人报告各不相同,严禁抄袭,如审核发现,两人的成绩都记为0。l 第五周星期三,过期不予受理,没有任何理由, 总成绩的30%被扣除。l 报告里面不能粘贴复制本指导l 书的相关文字或图片,也不能从网上拷贝,必须是用自己话语编写而成的。l 报告可以写伪代码描述算法流程,但不能粘贴源码滥竽充数,如发现将严厉扣分。 2.2中期工作(30%) 编写调试一个立方体旋转的程序,要求掌握如下开发技巧: 1、OpenGL贴图技术原理与函数实现: 掌握glTexCoord2f、glGenTextures、glBindTexture、glTexImage2D、glTexParameteri等函数用法; 2、掌握Win32程序消息循环机制,消息函数、键盘鼠标输入处理; 了解函数的PeekMessage、TranslateMessage、DispatchMessage使用和键盘虚码值;WndProc函数工作; 3、掌握Win32程序中定时器函数处理及如何实现旋转动画; Set
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 档案员竞聘演讲稿
- 读书心得体会
- 龙年元旦联欢晚会闭幕词(9篇)
- 新教材高考地理二轮复习一8类识图技法专项训练技法8区域分布图判读含答案
- 第二十五章 锐角的三角比(单元重点综合测试)
- 统编版语文二年级上学期期末备考真题分类汇编专题04 名篇名句默写 (含答案)
- 陕西省西安市曲江第一小学2024-2025学年三年级上学期期中学业水平测试科学试题(无答案)
- 广东省汕尾市华大实验学校2024-2025学年第一学期期中考试九年级化学试卷
- 采矿权购买合同范本
- 广州居民租房协议格式
- 苏教版二年级上册数学 7的乘法口诀 教学课件
- 功能主义基本理论和思想发展
- SAPAPO快速指引
- 总裁办部门职责文件
- 音乐教师述职报告
- 英语语法入门笔记(崔荣容-)(共43页)
- LS风险矩阵评价准则(3页)
- 机房维护表格-运维部
- 安全标识中英文可直接打印
- 小学四年级上册音乐-第8课《龙里格龙》--人音版(简谱)(19张)ppt课件
- 1π到100π表比较全
评论
0/150
提交评论