旋转的彩色立方体2016_第1页
旋转的彩色立方体2016_第2页
旋转的彩色立方体2016_第3页
旋转的彩色立方体2016_第4页
旋转的彩色立方体2016_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程设计(论文)任务书 软 件 学 院 学院 桥梁 专业 2 班 一、课程设计(论文)题目 旋转的彩色立方体 二、课程设计(论文)工作自 2014 年 6 月 2 日起至 2014 年 6 月 6 日止。三、课程设计(论文) 地点: 软 件 学 院 实 训 中 心 四、课程设计(论文)内容要求:1本课程设计的目的 计算机图形学课程设计是计算机图形学课程中的知识、技术和技能的一个综合应用, 是培养图形软件开发能力的综合训练。通过课程设计,使学生更深入地理解和掌握计算机图形学理论与相关算法,巩固课内所学的知识、技术和技能,进一步提高图形软件开发的能力。为毕业设计和毕业后从事计算机绘图、计算机辅助设

2、计、辅助教学、辅助工程、图形处理等打下基础。2课程设计的任务及要求1)课程设计任务:1、绘制一个不停转动的立方体,通过键盘的方向控制旋转方向;2、实现立方体的纹理映射,为立方体的六个面分别贴上不同的纹理;3、利用消影技术,实验立方体表面的遮挡关系;4、具有比较好的动画效果,消除闪烁现象。2)课程设计论文编写要求(1)课程设计任务及要求(2)设计思路-工作原理、功能规划(3)详细设计-数据分析、算法思路、功能实现(含程序流程图、主要代码及注释)、界面等。(4)运行调试与分析讨论-给出运行屏幕截图,分析运行结果,有何改进想法等。(5)设计体会与小结-设计遇到的问题及解决办法,通过设计学到了哪些新知

3、识,巩固了哪些知识,有哪些提高。(6)参考文献(必须按标准格式列出,可参考教材后面的参考文献格式)(7)报告按规定排版打印,要求装订平整,否则要求返工;(8)课设报告的装订顺序如下:封面-任务书-中文摘要-目录-正文-附录(代码及相关图片)(9)严禁抄袭,如有发现,按不及格处理。4)课程设计评分标准: (1)学习态度:10分;(2)系统设计:20分;(3)编程调试:20分;(4)回答问题:20分;(5)论文撰写:30分。5)参考文献:(1)陆枫 何云峰. 计算机图形学基础(第2版)M. 电子工业出版社(2)张曦煌 杜俊俐. 计算机图形学M. 北京邮电大学出版社(3)孙家广. 计算机图形学M.

4、清华大学出版社. 6)课程设计进度安排1准备阶段(4学时):选择设计题目、了解设计目的要求、查阅相关资料2程序模块设计分析阶段(4学时):程序总体设计、详细设计3代码编写调试阶段(8学时):程序模块代码编写、调试、测试4撰写论文阶段(4学时):总结课程设计任务和设计内容,撰写课程设计论文学生签名: 2014 年 6 月 6 日课程设计(论文)评审意见(1)学习态度(10分):优()、良()、中()、一般()、差(); (2)系统设计(20分):优( )、良()、中()、一般()、差(); (3)编程调试(20分):优()、良()、中()、一般()、差();(4)回答问题(20分):优()、良(

5、)、中()、一般()、差();(5)论文撰写(30分):优()、良()、中()、一般()、差(); 评阅人: 职称: 讲师 2014 年 6 月 6 日中文摘要 软件专业经过三年的课程学习,已经积累了相关高级语言程序设计的基本知识。画出彩色正方体并使之旋转,这一题目考察了程序设计自顶而下、逐步细化的相关基本思想。题目难点在于实现可视化界面的交互、颜色的显示以及图像的旋转过程。 经过查找相关资料,本程序采用功能强大的图形库OPENGL并调用一系列WINDOWS API采用C/C+语言在Microsoft Visual C+6.0环境下编写。很好的解决了用C/C+编写图形界面的难点问题。通过Win

6、32平台的OPENGL API实现了逼真的三维旋转效果 关键词:正方体;颜色变化;旋转;可视化;OPENGL目录一、课程设计任务及要求1二、需求分析21、设计说明22、运行环境23、程序功能实现2三、总体设计31.OpenGL实现3四、详细设计41、程序流程图42.程序代码分析51.OPENGL的初始化工作52.立方体的主体绘制53.颜色的绘制及变换84.旋转的控制105.鼠标的控制11六、设计体会与小结15七、参考文献16一、课程设计任务及要求1、绘制一个不停转动的立方体,通过键盘的方向控制旋转速度;2、实现立方体的纹理映射,为立方体的六个面分别贴上不同的纹理;3、利用消影技术,实验立方体表

7、面的遮挡关系;4、可以通过键盘的方向改变视点及视线方向,从不同的位置和不同角度观察立方体;5、具有比较好的动画效果,消除闪烁现象。二、需求分析1、设计说明计划采用OPENGL图形库并调用一系列WINDOWS API采用C/C+语言编写。首先,应熟悉OPENGL在WIN32平台下的相关API,以及其余WINDOWS窗口交互的相关接口方法,来构建窗口的内容。其次,熟悉了解OPENGL库函数在窗体中实现绘图(既绘制正方体),实现正方体旋转功能的相关函数。最后,实现OPENGL与WINDOWS的交互的过程,完成程序及注释。2、运行环境 一台可以实现.exe可执行文件,读取txt文本文档,以及在Visu

8、alC +6.0环境下进行程序设计的可操作系统或其他电子设备。3、程序功能实现 1、可实现立方体的六个面分别具有不同的纹理; 2、通过消影技术,显现立方体表面的遮挡关系; 3、有较好的动画效果并去除闪烁现象; 4、使用键盘可更改旋转的速度和方向且能从不同视角观察立方体; 5、操作界面简洁,程序易于修改。 三、总体设计 1.OpenGL实现 OpenGL 的工作顺序就是一个从定义几何要素到把象素段写入帧缓冲区的过程。在屏幕上显示图象的主要步骤是以下3 步: 1)构造几何要素(点、线、多边形、图像、位图),创建对象的数学描述。在三维空间放置对象,选择有利的观察点。 2)计算对象的颜色,这些颜色可能

9、直接定义,或由光照条件及纹理间接给出。 3)光栅化,把对象的数学描述和颜色信息转换到屏幕的象素。 2.程序模块图 图3-2-1 程序模块图 四、详细设计1、程序流程图图4-1-1 程序流程图2.程序代码分析1.OPENGL的初始化工作 通过查找资料OPENGL的初始化工作由如下库函数过程来完成 glShadeModel(GL_SMOOTH); / 启用阴影平滑 启用smooth shading(阴影平滑)。阴影平滑通过多边形精细的混合色彩,并对外部光进行平滑。 glClearColor(0.0f, 0.0f, 0.0f, 0.5f); / 黑色背景 色彩值的范围从0.0f到1.0f。0.0f代

10、表最黑的情况,1.0f就是最亮的情况。glClearColor 后的第一个参数是Red Intensity(红色分量),第二个是绿色,第三个是蓝色。最大值也是1.0f,代表特定颜色分量的最亮情况。 接下来的三个函数必须做的是关于depth buffer(深度缓存)的。将深度缓存设想为屏幕后面的层。深度缓存不断的对物体进入屏幕内部有多深进行跟踪。我们本节的程序其实没有真正使用深度缓存,但几乎所有在屏幕上显示3D场景OpenGL程序都使用深度缓存。它的排序决定那个物体先画。这样您就不会将一个圆形后面的正方形画到圆形上来。深度缓存是OpenGL十分重要的部分。 glClearDepth(1.0f);

11、 / 设置深度缓存 glEnable(GL_DEPTH_TEST); / 启用深度测试 glDepthFunc(GL_LEQUAL); / 所作深度测试的类型 接下来是透视图修饰使透视图好看些: glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); / 真正精细的透视修正。2.立方体的主体绘制 首先使glClear(GL_COLOR_BUFFER_BITGL_DEPTH_BUFFER_BIT); 清除屏幕和深度缓存然后进行各顶点的绘制并开始绘制立方体void CCubeView:CreateRGBPalette() PIXELFORMATDESC

12、RIPTOR pfd; LOGPALETTE *pPal; int n, i; n = :GetPixelFormat(m_pDC-GetSafeHdc(); :DescribePixelFormat(m_pDC-GetSafeHdc(), n, sizeof(pfd), &pfd); if (pfd.dwFlags & PFD_NEED_PALETTE) n = 1 palVersion = 0x300; pPal-palNumEntries = n; for (i=0; ipalPalEntryi.peRed = ComponentFromIndex(i, pfd.cRedBits, pf

13、d.cRedShift); pPal-palPalEntryi.peGreen = ComponentFromIndex(i, pfd.cGreenBits, pfd.cGreenShift); pPal-palPalEntryi.peBlue = ComponentFromIndex(i, pfd.cBlueBits, pfd.cBlueShift); pPal-palPalEntryi.peFlags = 0; /* fix up the palette to include the default GDI palette */ if (pfd.cColorBits = 8) & (pfd

14、.cRedBits = 3) & (pfd.cRedShift = 0) & (pfd.cGreenBits = 3) & (pfd.cGreenShift = 3) & (pfd.cBlueBits = 2) & (pfd.cBlueShift = 6) )void CCubeView:CreateRGBPalette() PIXELFORMATDESCRIPTOR pfd; LOGPALETTE *pPal; int n, i; n = :GetPixelFormat(m_pDC-GetSafeHdc(); :DescribePixelFormat(m_pDC-GetSafeHdc(),

15、n, sizeof(pfd), &pfd); if (pfd.dwFlags & PFD_NEED_PALETTE) n = 1 palVersion = 0x300; pPal-palNumEntries = n; for (i=0; in; i+) /* fix up the palette to include the default GDI palette */ if (pfd.cColorBits = 8) & (pfd.cRedBits = 3) & (pfd.cRedShift = 0) & (pfd.cGreenBits = 3) & (pfd.cGreenShift = 3)

16、 & (pfd.cBlueBits = 2) & (pfd.cBlueShift = 6) ) for (i = 1 ; i palPalEntrydefaultOverridei = defaultPalEntryi; m_cPalette.CreatePalette(pPal); delete pPal; m_pOldPalette = m_pDC-SelectPalette(&m_cPalette, FALSE); m_pDC-RealizePalette(); 3.颜色的绘制及变换void CCubeView:DrawScene(void) static BOOL bBusy = FA

17、LSE; static GLfloat wAngleY = 10.0f; static GLfloat wAngleX = 1.0f; static GLfloat wAngleZ = 5.0f; if(bBusy) return; bBusy = TRUE; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glTranslatef(0.0f, 0.0f, -m_fRadius); glRotatef(wAngleX, 1.0f,

18、0.0f, 0.0f); glRotatef(wAngleY, 0.0f, 1.0f, 0.0f); glRotatef(wAngleZ, 0.0f, 0.0f, 1.0f); wAngleX += 1.0f; wAngleY += 10.0f; wAngleZ += 5.0f;glBegin(GL_QUAD_STRIP);glColor3f(1.0f, 0.0f, 1.0f);glVertex3f(-0.5f, 0.5f, 0.5f); glColor3f(0.0f, 0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, -0.5f); glEnd(); glPopMa

19、trix(); glFinish(); SwapBuffers(wglGetCurrentDC(); bBusy = FALSE;BOOL CCubeView:OnEraseBkgnd(CDC* pDC) return TRUE;4.旋转的控制 void CCubeView:OnSize(UINT nType, int cx, int cy) CView:OnSize(nType, cx, cy); if(cy 0) glViewport(0, 0, cx, cy); if(m_oldRect.right cx) | (m_oldRect.bottom cy) RedrawWindow();

20、m_oldRect.right = cx; m_oldRect.bottom = cy; glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f, (GLdouble)cx/cy, 3.0f, 7.0f); glMatrixMode(GL_MODELVIEW); void CCubeView:OnTimer(UINT nIDEvent) DrawScene();CView:OnTimer(nIDEvent);/ Eat spurious WM_TIMER messagesMSG msg;while(:PeekMes

21、sage(&msg, m_hWnd, WM_TIMER, WM_TIMER, PM_REMOVE);/ GL helper functions5.鼠标的控制void CCubeView:Init() PIXELFORMATDESCRIPTOR pfd; int n;HGLRChrc;GLfloatfMaxObjSize, fAspect;GLfloatfNearPlane, fFarPlane; m_pDC = new CClientDC(this); ASSERT(m_pDC != NULL); if (!bSetupPixelFormat() return; n = :GetPixelFo

22、rmat(m_pDC-GetSafeHdc(); :DescribePixelFormat(m_pDC-GetSafeHdc(), n, sizeof(pfd), &pfd); CreateRGBPalette(); hrc = wglCreateContext(m_pDC-GetSafeHdc(); wglMakeCurrent(m_pDC-GetSafeHdc(), hrc); GetClientRect(&m_oldRect); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST);BOOL CCubeView:bSetupPixelFormat() s

23、tatic PIXELFORMATDESCRIPTOR pfd = sizeof(PIXELFORMATDESCRIPTOR), / size of this pfd 1, / version number PFD_DRAW_TO_WINDOW | / support window PFD_SUPPORT_OPENGL | / support OpenGL PFD_DOUBLEBUFFER, / double buffered PFD_TYPE_RGBA, / RGBA type 24, / 24-bit color depth 0, 0, 0, 0, 0, 0, / color bits ignored 0, / no alpha buffer 0, / shift bit ignored 0, / no accumulation buffer 0, 0, 0, 0, / accum bits ignored 32, / 32-bit z-buffer 0, / no stencil buffer 0, / no auxiliary buffer PFD_MAIN_PLANE, / main layer 0, / reserved 0, 0, 0 / layer masks ignored ; int pixelformat; if ( (pixelformat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论