openGL设计报告.doc_第1页
openGL设计报告.doc_第2页
openGL设计报告.doc_第3页
openGL设计报告.doc_第4页
openGL设计报告.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

计算机系统综合课程设计简单的OpenGL动画 设计报告学生 陈 鲁 蔡 滨 班级 成教02计算机本科 指导 陆 卫 忠 时间 2005年12月23日 苏州科技学院成教02计算机科学与技术总任务1 课题名称使用OpenGL技术,制作一个彩色旋转立方体。2 制作单位苏州科技学院成教02计算机科学与技术3 完成地点电子系学生机房4 完成时间2006年1月6日用户需求分析1.背景a .使用OpenGL制作彩色旋转立方体b05年第一学期末实验周课程设计c电子系学生机房完成该课程设计 1.1参考资料Visual C+ CAD 应用程序开发技术王清辉 王彪 编著 机械工业出版社 Visual C+ 实践与提高 图形图像编程篇 李于剑 编著中国铁道出版社2.任务概述2.1目标利用OpenGL的动画功能,实现运动彩色立方体的旋转。效果如图所示。2.2使用特点 程序编译成功后生成EXE文件,可以观看到利用OpenGL的函数实现动画功能,使彩色立方体旋转。3需求规定 3.1对技术的需求OpenGL技术:OpenGL(Open Graphics Library)是一个优秀的三维图形硬件接口,实际上是一个维图形和模型库。使用OpenGL可以绘制出真实感很强的三维图形,且由于越来越多的高档加速卡支持OpenGL,所以使用OpenGL绘图可以获得很快的执行速度。OpenGL是一个与硬件无关的图形编程接口,可以在不同的硬件平台上实现。OpenGL最初目的是将用户从具体的硬件环境的操作系统中解放出来,而可以完全不到理解这些系统的结构和指令系统。OpenGL本身不提供高级的造型命令,而是通过基本的几何图元-点,线和多边形来建 立几何模型。用户则是通过这些基本图元来建立高级的几何模型。OpenGL可以提供的功能主要包括:(1) 图形绘制。(2) 充换操作(3) 颜色模式(4) 光照(5) 图像效果增强(6) 位图和图像(7) 纹理映射(8) 交互与动画4运行环境规定4.1设备硬件:CPU P3 533 内存 128M 显示卡:支持OpenGL 硬盘空间:20G软件:Win 98/Win me/Win NT/Win 2000/Win XP/Win 2003 Visual C+ 编程工具详细设计说明书1引言1.1编写目的本系统可以提供一个彩色旋转立方体,使用户直接就可以看到一个使用OpenGL技术而旋转的彩色立方体。1.2背景a .使用OpenGL制作彩色旋转立方体b05年第一学期末实验周课程设计c电子系学生机房完成该课程设计 1.3定义OpenGL(Open Graphics Library)是一个三维图形硬件接口,实际上是一个三维图形和模型库。1.4参考资料Visual C+ CAD 应用程序开发技术 王清辉 王彪 编著机械工业出版社 Visual C+ 实践与提高 图形图像编程篇李于剑 编著 中国铁道出版社2总体设计2.1需求规定 为用户提供一个可以旋转的彩色立方体。2.2运行环境 硬件:CPU P3 533 内存 128M 显示卡:支持OpenGL 硬盘空间:20G软件:Win 98/Win me/Win NT/Win 2000/Win XP/Win 2003 Visual C+ 编程工具2.3设计概念 OpenGL支持双缓存技术。使用双缓存可以实现平滑的图形动画效果。在双缓存模式下,帧存被分为两个视频缓存:前台视频和后台视频。当绘制函数调用结束,并完成了后台视频缓的内容时,OpenGL便将它拷贝到前台视频缓存。由于这个视频交换的时间极短,肉眼感觉不出来,因此可以实现 平滑的图形动画效果。Gcameraobject2.4结构CViewCOpenGLDC Object m_CameraCGLViewm_pDC CGLView的结构 OnDraw() M_pGLDC-Ready()RenderScene()M_pGLDC-Finish()OnDestroy()Delete m_pGLDC OnCreate()Create COpenGLDC CGLViewWindows Message LoopOnSize()M_pGLDC-GLResize() CGLView的消息处理2.5尚未问决的问题在本系统中,该立方体的绕XYZ轴旋转的时间还没有具体的程序来确定。3接口设计3.1用户接口向用户提供一个.exe文件,用户直接运行该文件就可以得到一个彩色旋转立方体。4运行设计4.1运行控制 直接运行4.2运行时间由于程序占用资源很少,运行时间快,点击后即可看见图形效果。5系统出错处理设计由于该系统简单可靠,出错后关闭再重新运行就可以再次得到该立方体。主要源代码DialogGLDlg.hclass CDialogGLDlg : public CDialog/ Constructionpublic:void Onabout();void BuildList();CDialogGLDlg(CWnd* pParent = NULL);/ standard constructorBOOL SetWindowPixelFormat(HDC hDC);BOOL CreateViewGLContext(HDC hDC);void RenderScene();void Rotate();BOOL m_Rotate;HGLRC m_hGLContext;int m_GLPixelIndex;double m_transY;double m_transX;double m_angle1;double m_angle2;floatm_ScaleX;float m_ScaleY;float m_ScaleZ;GLdouble m_xRotate;GLdouble m_yRotate;int m_width;int m_height;int m_exp;float m_size;CPoint m_RightDownPos;CPoint m_LeftDownPos;BOOL m_RightButtonDown;BOOL m_LeftButtonDown;/ Dialog Data/AFX_DATA(CDialogGLDlg)enum IDD = IDD_DIALOGGL_DIALOG ;/ NOTE: the ClassWizard will add data members here/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CDialogGLDlg)protected:virtual void DoDataExchange(CDataExchange* pDX);/ DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:afx_msg void OnContextMenu(CWnd*, CPoint point);HICON m_hIcon;/ Generated message map functions/AFX_MSG(CDialogGLDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);afx_msg void OnDestroy();afx_msg void OnSize(UINT nType, int cx, int cy);afx_msg void OnLButtonDown(UINT nFlags, CPoint point);afx_msg void OnLButtonUp(UINT nFlags, CPoint point);afx_msg void OnMouseMove(UINT nFlags, CPoint point);afx_msg void OnTimer(UINT nIDEvent);afx_msg void OnPopupRotate();afx_msg void OnPopupSizeDecrease();afx_msg void OnPopupSizeIncrease();afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);/AFX_MSGDECLARE_MESSAGE_MAP();/AFX_INSERT_LOCATION/ Microsoft Developer Studio will insert additional declarations immediately before the previous line.DialogGLDlg.cppBOOL CDialogGLDlg:SetWindowPixelFormat(HDC hDC) PIXELFORMATDESCRIPTOR pixelDesc; /结构体,用于构造画图面pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR); /大小pixelDesc.nVersion = 1;/Specifies the version of this data structure. This value should be set to 1. pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL |PFD_DOUBLEBUFFER |PFD_STEREO_DONTCARE;pixelDesc.iPixelType = PFD_TYPE_RGBA;pixelDesc.cColorBits = 32;pixelDesc.cRedBits = 8;pixelDesc.cRedShift = 16;pixelDesc.cGreenBits = 8;pixelDesc.cGreenShift = 8;pixelDesc.cBlueBits = 8;pixelDesc.cBlueShift = 0;pixelDesc.cAlphaBits = 0;pixelDesc.cAlphaShift = 0;pixelDesc.cAccumBits = 64;pixelDesc.cAccumRedBits = 16;pixelDesc.cAccumGreenBits = 16;pixelDesc.cAccumBlueBits = 16;pixelDesc.cAccumAlphaBits = 0;pixelDesc.cDepthBits = 32;pixelDesc.cStencilBits = 8;pixelDesc.cAuxBuffers = 0;pixelDesc.iLayerType = PFD_MAIN_PLANE;pixelDesc.bReserved = 0;pixelDesc.dwLayerMask = 0;pixelDesc.dwVisibleMask = 0;pixelDesc.dwDamageMask = 0;m_GLPixelIndex = ChoosePixelFormat(hDC,&pixelDesc);if(m_GLPixelIndex=0) / Choose default m_GLPixelIndex = 1;if(DescribePixelFormat(hDC,m_GLPixelIndex,sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)=0)return FALSE;if(SetPixelFormat(hDC,m_GLPixelIndex,&pixelDesc)=FALSE)return FALSE;return TRUE;BOOL CDialogGLDlg:CreateViewGLContext(HDC hDC)m_hGLContext = wglCreateContext(hDC);if(m_hGLContext=NULL)return FALSE;if(wglMakeCurrent(hDC,m_hGLContext)=FALSE)return FALSE; return TRUE;/窗体颜色int CDialogGLDlg:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CDialog:OnCreate(lpCreateStruct) = -1)return -1;HWND hWnd = GetSafeHwnd();HDC hDC = :GetDC(hWnd);if(SetWindowPixelFormat(hDC)=FALSE)return 0;if(CreateViewGLContext(hDC)=FALSE)return 0;COLORREF color = :GetSysColor(COLOR_3DFACE);glClearColor(float)GetRValue(color)/255.0f, (float)GetGValue(color)/255.0f, (float)GetBValue(color)/255.0f, 1.0);glPolygonMode(GL_FRONT,GL_FILL);glPolygonMode(GL_BACK,GL_FILL);/ Gouraud glShadeModel(GL_SMOOTH);BuildList();SetTimer(0,5,NULL);return 0;void CDialogGLDlg:OnDestroy() CDialog:OnDestroy();if(wglGetCurrentContext() != NULL)wglMakeCurrent(NULL,NULL);if(m_hGLContext != NULL) wglDeleteContext(m_hGLContext);m_hGLContext = NULL;void CDialogGLDlg:OnSize(UINT nType, int cx, int cy) CDialog:OnSize(nType, cx, cy);GLsizei width,height;GLdouble aspect;width = cx;height = cy;if(cy=0)aspect = (GLdouble)width; elseaspect = (GLdouble)width/(GLdouble)height;glViewport(0,0,width,height);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(45,aspect,1,10.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glDrawBuffer(GL_BACK);glEnable(GL_DEPTH_TEST);void CDialogGLDlg:RenderScene() /着色glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /刷新窗口背景glPushMatrix();/ Position / translationglTranslated(0.0,0.0,-8.0);glRotated(m_xRotate, 1.0, 0.0, 0.0);glRotated(m_yRotate, 0.0, 1.0, 0.0);glScalef(m_ScaleX,m_ScaleY,m_ScaleZ);:glCallList(1);glPopMatrix();void CDialogGLDlg:OnLButtonDown(UINT nFlags, CPoint point) m_LeftButtonDown = TRUE;m_LeftDownPos = point;KillTimer(0);CDialog:OnLButtonDown(nFlags, point);void CDialogGLDlg:OnLButtonUp(UINT nFlags, CPoint point) m_LeftButtonDown = FALSE;CDialog:OnLButtonUp(nFlags, point);void CDialogGLDlg:OnMouseMove(UINT nFlags, CPoint point) if(m_LeftButtonDown) CSize rotate = m_LeftDownPos - point;m_LeftDownPos = point;m_yRotate -= rotate.cx;m_xRotate -= rotate.cy;InvalidateRect(NULL,FALSE);CDialog:OnMouseMove(nFlags, point);void CDialogGLDlg:OnContextMenu(CWnd*, CPoint point) / CG: This block was added by the Pop-up Menu component if (point.x = -1 & point.y = -1)/keystroke invocationCRect rect;GetClientRect(rect);ClientToScreen(rect);point = rect.TopLeft();point.Offset(5, 5);CMenu menu;VERIFY(menu.LoadMenu(CG_IDR_POPUP_DIALOG_GLDLG);CMenu* pPopup = menu.GetSubMenu(0);ASSERT(pPopup != NULL);CWnd* pWndPopupOwner = this;while (pWndPopupOwner-GetStyle() & WS_CHILD)pWndPopupOwner = pWndPopupOwner-GetParent();pPopup-TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,pWndPopupOwner);void CDialogGLDlg:Rotate() m_yRotate -= 2;InvalidateRect(NULL,FALSE);void CDialogGLDlg:OnTimer(UINT nIDEvent) m_yRotate -= 3;m_xRotate -= 2;InvalidateRect(NULL,FALSE);CDialog:OnTimer(nIDEvent);void CDialogGLDlg:OnPopupRotate() SetTimer(0,5,NULL);void CDialogGLDlg:OnPopupSizeDecrease() m_ScaleX /= 1.1f;m_ScaleY /= 1.1f;m_ScaleZ /= 1.1f;InvalidateRect(NULL,FALSE);void CDialogGLDlg:OnPopupSizeIncrease() m_ScaleX *= 1.1f;m_ScaleY *= 1.1f;m_ScaleZ *= 1.1f;InvalidateRect(NULL,FALSE);void CDialogGLDlg:BuildList() :glNewList(1,GL_COMPILE_AND_EXECUTE); glShadeModel(GL_SMOOTH);float x = m_size;float xt = 5.0f;glBegin(GL_POLYGON); /分别绕x y z轴旋转glNormal3d(0.0,0.0,1.0);glColor3ub(255,0,0);glVertex3d( x, x, x);glColor3ub(0,255,0);glVertex3d( x, -x, x);glColor3ub(0,0,255);glVertex3d(-x, -x, x);glColor3ub(255,255,0);glVertex3d(-x, x, x);glEnd();glBegin(GL_POLYGON);glNormal3d(0.0,0.0,-1.0);glColor3ub(255,0,0);glVertex3d( -x, x, -x);glColor3ub(0,255,0);glVertex3d( -x, -x, -x);glColor3ub(0,0,255);glVertex3d( x, -x, -x);glColor3ub(255,255,0);glVertex3d( x, x, -x);glEnd();glBegin(GL_POLYGON);glNormal3d(1.0,0.0,0.0);glColor3ub(255,0,0);glVertex3d( x, x, x);glColor3ub(0,255,0);glVertex3d( x, x, -x);glColor3ub(0,0,255);glVertex3d( x, -x, -x);glColor3ub(255,255,0);glVertex3d( x, -x, x);glEnd();glBegin(GL_POLYGON);glNormal3d(-1.0,0.0,0.

温馨提示

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

评论

0/150

提交评论