ImageVerifierCode 换一换
格式:DOCX , 页数:56 ,大小:770.95KB ,
资源ID:1445463      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/1445463.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于opengl的3d旋转魔方的实现终期报告加源码.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

基于opengl的3d旋转魔方的实现终期报告加源码.docx

1、基于opengl的3d旋转魔方的实现终期报告加源码1课程设计介绍 11.1.内容 1 1.2.目的 11.3.取得的成果 12程序分析 2 2.1. 程序原理 22.1. 程序流程 32.3. 数据结构 8 2.4. 重要函数用法分析 83结果演示与程序分析 93.1. 成果演示 93.2. 程序分析 114编程中遇到的问题125课程设计小结13参考文献14 基于OpenGL的3D旋转魔方实现1 课程设计介绍1.1 目的当今计算机技术流行,引领了各行各业。而程序是计算机的灵魂,因此编程能力对当今的学生而言至关重要。虽然我们在前期已经学习了C语言,但是还只对程序有一些简单的认识,说实话,是很浅显

2、的认识。通过本软件课程设计的学习,可以从整体上对软件工程和项目有全面的认识。通过此次课程设计,可以锻炼编程能力,激发对编程的兴趣,同时也能培养良好的编程习惯。这对于个人今后的学习,今后的工作乃至今后的生活都会产生重要的影响。对于国家而言,极大的推动了计算机普及教育,提高了大学生的计算机使用水平,具有重大的意义。 1.2 内容(1) 通过此次项目掌握软件开发模式,模块化结构分析以及程序设计流程(2) 学会使用VC+6.0进行编程(3) 掌握有关程序设计的思想,数据结构的知识,掌握C语言算法,掌握OpenGL编程知识如贴图与键盘控制(4) 掌握win32编程知识,了解windows程序内部运行机制

3、(5) 初步培养需求分析、软件测试、调试的能力(6) 在2X2魔方的基础上,尝试编写3X3的魔方,并实现其旋转1.3 取得的成果在理解Magic2D例子程序的基础上,借助了Win32平台进行了一系列调试和学习。在此次项目中,学习了Visual C+6.0软件开发环境,熟练掌握了Win32 Application开发流程。同时也学习了OpenGL的基本知识,掌握了一些OpenGL的重要技术与重要函数的使用,编写了一些简单的OpenGL程序。参考Magic2D例子流程,我对原程序进行了比较大的修改,并换上了自己的图片,实现了一个立方体贴六张不同的图片,并编写出了自己的2X2魔方程序。根据相似度分析

4、,成功的编写出了3X3旋转魔方,并自己设计了算法,实现了各个层面的转动,转动效果很完美。同时,为了增加程序的娱乐效果,我加入了歌曲最炫民族风,虽然很简单,不过感觉非常实用且有趣。2 程序分析2.1 程序原理 (1)OpenGL OpenGL是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植;OpenGL可以与Visual C+紧密接口,便于实现机械手的有关计算和图形算法,可保证算法的正确性和可靠性;OpenGL使用简便,效率高。 本设计是在Visual C+6.0开发环境下,使用OpenGL(Open Graphics Library

5、)函数库,绘制魔方并实现魔方的绘制、随机旋转、贴图以及键盘控制等功能。采用基本图形的绘图函数及定位函数,添加相应纹理来实现魔方模型的绘制。通过读取载入BMP文件,应用纹理贴图技术来完成对魔方旋转面的处理。 (2)模型的旋转首先对立方体进行建模。一个立方体由8个点组成,8个点组成6个面片,对立方体的几何操作本质上就是对这6个平面的操作(绘制、纹理、旋转和平移等)。点的索引号确定后,每个面片也就确定了,如0,1,2,3四个点构成Z向正投影面。立方体在空间的旋转,归根到底是其顶点的旋转,如空间点(x, y, z)绕Z轴旋转a对应的旋转矩阵:cosa sina-sina cosa一个立方体pCube绕

6、Z轴旋转a后对应的坐标变化为:for( int i=0;iCubePointi.p0; y= pCube-CubePointi.p1; pCube-CubePointi.p0 = x*cosa - y*sina; pCube-CubePointi.p1 = x*sina + y*cosa;其它轴的旋转类似。由于魔方体层面的旋转是90,在某个层面内一个子立方体Ci会被另外一个Cj完全替换,因此旋转后必须同步更新魔方体Cube各层面内包含的子立方的索引号。为了简化算法,只需查找旋转后Cubei在Static_Cube中对应的小立方编号j与i的位置匹配。 2.2 程序的流程 通过分析,整个程序大致可

7、以分为6个子功能模块(1) Win32应用程序框架WinMain主函数是所有Win32程序的入口点。在WinMain函数里实现Window是窗体的建立和消息循环,在消息循环中实现键盘、鼠标输入事件处理响应,具体内容可参考VC程序参考手册。在本课程程序中,不仅要创建Window窗体,而且构建OpenGL设备绘图环境。 Window窗体创建步骤: 窗体类注册:RegisterClass 设置显示分辨率:ChangeDisplaySettings 设置窗体大小:AdjustWindowRectEx 创建窗体:CreateWindowExOpenGL绘图环境搭建: 获取设备绘图环境(DC,Device

8、Context):hDC=GetDC(hWnd) 选择绘图环境像素格式:ChoosePixelFormat(hDC,&pfd),其中pfd为像素格式描述符,如果设置不对,OpenGL绘图失败,看不到正确的显示结果。 设置绘图环境像素格式:SetPixelFormat(hDC,PixelFormat,&pfd) 获取OpenGL绘图环境:hRC =wglCreateContext(hDC) 设置OpenGL绘图环境:wglMakeCurrent(hDC,hRC)(2)空间建模得到3阶魔方 显然,要建立3X3的魔方必须首先建立单个魔方的模型,然后通过对单个立方体进行平移从而得到3X3的魔方。 平移

9、单个立方体通过reset_model( )函数中的语句实现 for(i=0;i8;i+)Cube0.CubePointi.p0 = CubePointi.p0-2.0f ;Cube0.CubePointi.p1 = CubePointi.p1-2.0f ;Cube0.CubePointi.p2 = CubePointi.p2+2.0f;上述代码只得到了编号为0的立方体,其他编号的立方体同理可以得到构成2X2的魔方需要8个立方体,构建3X3的魔方则需要27个立方体。根据2阶魔方的一些方法,类比到3阶魔方。则首先对魔方的立方体进行编号,然后通过编号得到魔方各层所包含立方体的编号。其中编号为BYTE

10、 ZP9 = 0,1,2,3,4,5,6,7,8; /z轴方向正向一层BYTE ZZ9 = 9,10,11,12,13,14,15,16,17; /z轴方向中间一层BYTE ZM9 = 18,19,20,21,22,23,24,25,26; /z轴方向负向一层BYTE YM9 = 0,1,2,11,10,9,18,19,20; /y轴方向负向一层BYTE YZ9 = 3,4,5,14,13,12,21,22,23; /y轴方向中间一层BYTE YP9 = 6,7,8,17,16,15,24,25,26; /y轴方向正向一层BYTE XM9 = 2,3,8,17,12,11,20,21,26;

11、/x轴方向正向一层BYTE XZ9 = 1,4,7,16,13,10,19,22,25; /x轴方向中间一层BYTE XP9 = 0,5,6,15,14,9,18,23,24; /x轴方向负向一层(3)OpenGL纹理贴图以下是纹理贴图的流程,其中实现了一个立方体贴六张图片 (4)同步更新索引 在整个程序中,同步更新索引所涉及到的算法可以算是最核心的了。当然,你也可以让每层每个周期转动360度,这样就不需要动态更新索引了,因为每次转动前后,立方体的相对坐标位置并没有改变。但是这样得到的旋转效果并不好,因为这并没有考虑到魔方旋转的所有情况,每次旋转后魔方都没有被打乱。 由于涉及到动态刷新索引,于

12、是按照常理定义一个静态的魔方与动态的魔方进行比较。类似动态魔方的编号可以得到静态魔方的编号。const BYTE SZP9 = 0,1,2,3,4,5,6,7,8; /z轴方向正向一层const BYTE SZZ9 = 9,10,11,12,13,14,15,16,17; /z轴方向中间一层const BYTE SZM9 = 18,19,20,21,22,23,24,25,26; /z轴方向负向一层const BYTE SYM9 = 0,1,2,11,10,9,18,19,20; /y轴方向负向一层const BYTE SYZ9 = 3,4,5,14,13,12,21,22,23; /y轴方向

13、中间一层const BYTE SYP9 = 6,7,8,17,16,15,24,25,26; /y轴方向正向一层const BYTE SXM9 = 2,3,8,17,12,11,20,21,26; /x轴方向正向一层const BYTE SXZ9 = 1,4,7,16,13,10,19,22,25; /x轴方向中间一层const BYTE SXP9 = 0,5,6,15,14,9,18,23,24; /x轴方向负向一层 然后编写一个函数int is_equal(stCube *pc1,stCube *pc2)判断两个立方体是否重合,这个函数的算法就是比较立方体所有顶点的坐标是否相同。 最后一步编写函数void Update_Cube_index(),由于魔方转动情况总体上有九种情况,则该函数必须编写九块功能类似的代码,现在只列出X轴负向一层刷新索引的算法。int i,j,k=0;k =0 ; for( i=0;i9;i+) for( j=0;j27;j+) if( is_equal( &Cubej, &Static_Cube SZMi ) ) ZMk+ = j; (5)魔方的旋转以及键盘控制对魔方的平移 魔方层面的旋转已经在前面介绍,

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1