已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、编程环境简介 : Visual C+6.0是微软公司推出的开发Win32应用程序(Windows 95/98/2000/XP/NT)的、面向对象的可视化集成工具。它的最大优点就是提供了功能强大的MFC类库,MFC是一个很大的C+类层次结构,其中封装了大量的类及其函数,很多Windows程序所共有的标准内容可以由MFC的类来提供,MFC类为这些内容提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓,这将简化编程工作,大大的减少程序员编写的代码数量,使编程工作变得更加轻松容易。下面介绍一下MFC类库:MFC 是一个很大的、扩展了的 C+ 类层次结构,它能使开发 Windows 应用程序变得更加容易。MFC 是在整个 Windows 家族中都是兼容的,也就是说,无论是 Windows3.x、Windows95 还是 Windows NT,所使用的 MFC 是兼容的。每当新的 Windows 版本出现时,MFC 也会得到修改以便使旧的编译器和代码能在新的系统中工作。MFC 也回得到扩展,添加新的特性、变得更加容易建立应用程序。 与传统上使用 C 语言直接访问 Windows API相反,使用 MFC 和 C+ 的优点是 MFC 已经包含和压缩了所有标准的样板文件代码,这些代码是所有用 C 编写的 Windows 程序所必需的。因此用 MFC 编写的程序要比用C语言编写的程序小得多。另外,MFC所编写的程序的性能也毫无损失。必要时,你也可以直接调用标准 C 函数,因为 MFC 不修改也不隐藏 Windows 程序的基本结构。 使用 MFC 的最大优点是它为你做了所有最难做的事。MFC 中包含了上成千上万行正确、优化和功能强大的 Windows 代码。你所调用的很多成员函数完成了你自己可能很难完成的工作。从这点上将,MFC 极大地加快了你的程序开发速度。 MFC 是很庞大的。例如,版本4.0中包含了大约200个不同的类。万幸的是,你在典型的程序中不需要使用所有的函数。事实上,你可能只需要使用其中的十多个 MFC 中的不同类就可以建立一个非常漂亮的程序。该层次结构大约可分为几种不同的类型的类: 应用程序框架 图形绘制的绘制对象 文件服务 异常处理 结构 - List、Array 和 Map Internet 服务 OLE 2 数据库 通用类 OpenGL的特点及功能介绍OpenGL是用于开发简捷的交互式二维和三维图形应用程序的最佳环境,任何高性能的图形应用程序,从3D动画、CAD辅助设计到可视化访真,都可以利用OpenGL高质量、高性能的特点。OpenGL自1992年出现以来,逐渐发展完善,已成为一个唯一开放的,独立于应用平台的图形标准,一个典型的OpenGL应用程序可以在任何平台上运行-只需要使用目标系统的OpenGL库重新编译一下。OpenGL非常接近硬件,是一个图形与硬件的接口,包括了100多个图形函数用来建立三维模型和进行三维实时交互。OpenGL强有力的图形函数不要求开发人员把三维物体模型的数据写成固定的数据格式,也不要求开发人员编写矩阵变换、外部设备访问等函数,大大地简化了编写三维图形的程序。例如:1) OpenGL提供一系列的三维图形单元(图元)供开发者调用。2) OpenGL提供一系列的图形变换函数。 3) OpenGL提供一系列的外部设备访问函数,使开发者可以方便地访问鼠标、键盘、空间球、数据手套等外部设备。由于微软在Windows中包含了OpenGL,所以OpenGL可以与Visual C+紧密接合,简单快捷地实现有关计算和图形算法,并保证算法的正确性和可靠性。简单地说,OpenGL具有建模、变换、色彩处理、光线处理、纹理影射、图像处理、动画及物体运动模糊等功能:1、建模OpenGL图形库除了提供基本的点、线、多边形的绘制函数外,还提供了复杂的三维物体,如球、锥、多面体、茶壶以及复杂曲线和曲面(例如Bezier、Nurbs等曲线或曲面)的绘制函数。2、变换OpenGL图形库的变换包括基本变换和投影变换。基本变换有平移、旋转、变比、镜像四种变换,投影变换有平行投影(又称正射投影)和透视投影两种变换。3、颜色模式设置OpenGL颜色模式有两种,即RGBA模式和颜色索引(Color Index)。4、光照和材质设置OpenGL光有辐射光(Emitted Light)、环境光(Ambient Light)、漫反射光(Diffuse Light)和镜面光(Specular Light)。材质是用光反射率来表示。客观世界中的物体最终反映到人眼的颜色是光的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色。5、纹理映射(Texture Mapping)利用OpenGL纹理映射功能可以十分逼真地表达物体表面细节。6、位图显示和图象增强OpenGL的图象功能除了基本的拷贝和像素读写外,还提供融合(Blending)、反走样(Antialiasing)和雾(fog)的特殊图象效果处理。以上三条可是被仿真物更具真实感,增强图形显示的效果。7、双缓存动画(Double Buffering)OpenGL使用了前台缓存和后台缓存交替显示场景(Scene)技术,简而言之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面。8、特殊效果利用OpenGL还能实现深度暗示(Depth Cue)、运动模糊(Motion Blur)等特殊效果。运动模糊的绘图方式(motion-blured),模拟物体运动时人眼观察所感觉的动感现象。深度域效果(depth-of-effects),类似于照相机镜头效果,模型在聚焦点处清晰,反之则模糊。这些三维物体绘图和特殊效果处理方式,说明OpenGL能够模拟比较复杂的三维物体或自然景观。本次课程设计的题目就是运用FC开发的OpenGL应用程序二选择的题目及要求概述:题目:本次题目是我自选的,根据课堂上老师的讲课,我发现我对光照这部分的内容感兴趣,所以我决定做一个关于模拟关照模型的应用程序要求:做一个旋转的正方体,可以通过鼠标的左右键控制该正方体的旋转与停止,并可以控制它的大小变化,为了更加形象化,在正方体的各个面上添加进去一个纹理(纹理自己选择)三程序所用到的知识光照模型:真实感图形是通过景物表面的颜色和明暗色调来表现景物的几何形状、空间位置和表面材料的,物体表面呈现的颜色是由表面向视线方向辐射的光能来决定的;在计算机图形学中,为了描述物体表面朝某方向辐射光的颜色,常使用一个既能表示光能大小、又能表示其色彩组成的物理量,称为光亮度(luminance);物体表面向空间给定方向辐射的光亮度可应用光照模型进行计算。简单光照模型仅考虑光源照射在物体表面产生的反射光,整体光照模型还要考虑周围环境的光对物体表面的影响,因此能模拟出镜面映像、透明等较为精致的光照效果;对相应光源照明影响的取舍,可以表现自然界中的阴影;纹理映射技术将已有的平面花纹映射到物体表面上,并应用光照模型产生物体的表面细节,使绘制的图形更加的逼真;Gouraud阴暗处理:在计算机图形学中,光滑的曲面表面常用多边形逼近予以表示。但由于多边形平面上所有的法向相同,不同平面块之间存在不连续的法向量变化,从而引起不连续的光亮度跳跃。采用Gouraud明暗处理技术,对离散的光亮度采样作双线性插值以获得连续的光亮度函数。纹理及纹理映射用简单光照明模型生成真实感图象,由于表面过于光滑单调,反而显得不真实现实物体表面有各种表面细节 纹理木材表面的木纹建筑物墙壁上的装饰图案桔子皮表面的皱纹三指定功能要求的完成情况:通过左键单击可以让其停止旋转,右键单击可以弹出一个快捷菜单,可以重新启动他的运转,并可以控制其变大变小四、具体功能:本题目的完成,一个重要的方面是需要定义一个类,一个纹理类CTexture,用来给正方体的表面上添加纹理在此,需要定义一个关于Texture的头文件和cpp文件(略述)详细的见主程序段在上述这个本程序中最重要的类定义好后,下面就可以用这个类中的对象来给正方体的各个面上添加纹理这里主要简述几个重要的程序段变量的定义public: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;CTexture m_Texture;定义了一个类中的对象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;并初始化:m_hGLContext = NULL;m_GLPixelIndex = 0;m_xRotate = 0;m_yRotate = 0;m_Rotate = FALSE;m_ScaleX = 1.0f;m_ScaleY = 1.0f;m_ScaleZ = 1.0f;m_RightButtonDown = FALSE;m_LeftButtonDown = FALSE;调进函数:m_Texture.ReadFile(Apple.bmp);m_Texture.BGRtoRGB();定义正方体的各个面void CDialogGLDlg:BuildList():glNewList(1,GL_COMPILE_AND_EXECUTE);if(m_Texture.GetData() != NULL)glTexImage2D(GL_TEXTURE_2D,0,3, m_Texture.GetWidth(), m_Texture.GetHeight(),0, GL_RGB,GL_UNSIGNED_BYTE, m_Texture.GetData();glColor3f(1.0f,1.0f,1.0f);float x = 1.5f;下述的x均为这个值,所定义的是个正方体glBegin(GL_POLYGON); glNormal3d(0.0,0.0,1.0);glTexCoord2f(0.0, 1.0); glVertex3d(-x, x, x);glTexCoord2f(1.0, 1.0); glVertex3d(-x, -x, x); glTexCoord2f(1.0, 0.0); glVertex3d( x, -x, x);glTexCoord2f(0.0, 0.0); glVertex3d( x, x, x);glEnd();glBegin(GL_POLYGON);glNormal3d(0.0,0.0,-1.0);glTexCoord2f(0.0, 1.0); glVertex3d( x, x, -x);glTexCoord2f(0.0, 0.0); glVertex3d( x, -x, -x);glTexCoord2f(1.0, 0.0); glVertex3d( -x, -x, -x);glTexCoord2f(1.0, 1.0); glVertex3d( -x, x, -x);glEnd();glBegin(GL_POLYGON);glNormal3d(1.0,0.0,0.0);glTexCoord2f(0.0, 0.0); glVertex3d( x, x, x);glTexCoord2f(1.0, 0.0); glVertex3d( x, -x, x);glTexCoord2f(1.0, 1.0); glVertex3d( x, -x, -x);glTexCoord2f(0.0, 1.0); glVertex3d( x, x, -x);glEnd();glBegin(GL_POLYGON);glNormal3d(-1.0,0.0,0.0);glTexCoord2f(0.0, 0.0); glVertex3d( -x, x, x);glTexCoord2f(1.0, 0.0); glVertex3d( -x, x, -x);glTexCoord2f(1.0, 1.0); glVertex3d( -x, -x, -x);glTexCoord2f(0.0, 1.0); glVertex3d( -x, -x, x);glEnd();glBegin(GL_POLYGON);glNormal3d(0.0,-1.0,0.0);glTexCoord2f(0.0, 0.0); glVertex3d( -x, -x, x);glTexCoord2f(1.0, 0.0); glVertex3d( -x, -x, -x);glTexCoord2f(1.0, 1.0); glVertex3d( x, -x, -x);glTexCoord2f(0.0, 1.0); glVertex3d( x, -x, x);glEnd();glBegin(GL_POLYGON);glNormal3d(0.0,1.0,0.0);glTexCoord2f(0.0, 0.0); glVertex3d( -x, x, x);glTexCoord2f(1.0, 0.0); glVertex3d( x, x, x);glTexCoord2f(1.0, 1.0); glVertex3d( x, x, -x);glTexCoord2f(0.0, 1.0); glVertex3d( -x, x, -x);glEnd();:glEndList();这里正方体共个面,每一个面以三角形为单位定义两次定义菜单:在资源文件里定义如下并添加调用菜单代码如下:void CDialogGLDlg:OnContextMenu(CWnd*, CPoint point)/ CG: This block was added by the Pop-up Menu componentif (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);:添加创建正方体响应函数: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;/ BackColorCOLORREF 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); glShadeModel(GL_SMOOTH);BuildList();SetTimer(0,10,NULL);return 0;添加键盘响应函数:void CDialogGLDlg:OnKeyDown(UINT nChar,UINT nRepCnt, UINT nFlags) switch(nChar)case VK_ADD:m_ScaleX *= 1.1f;m_ScaleY *= 1.1f;m_ScaleZ *= 1.1f;InvalidateRect(NULL,FALSE);break;case VK_SUBTRACT:m_ScaleX /= 1.1f;m_ScaleY /= 1.1f;m_ScaleZ /= 1.1f;InvalidateRect(NULL,FALSE);break;default :CDialog:OnKeyDown(nChar, nRepCnt, nFlags);此为右键单击响应函数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:OnPopupRotate() SetTimer(0,10,NULL);旋转角度控制函数:void CDialogGLDlg:OnTimer(UINT nIDEvent) m_yRotate -= 3;m_xRotate -= 2;InvalidateRect(NULL,FALSE);CDialog:OnTimer(nIDEvent);void CDialogGLDlg:Rotate()m_yRotate -= 2;InvalidateRect(NULL,FALSE);:菜单中的控制大小的函数:void CDialogGLDlg:OnPopupSizeDecrease() m_ScaleX /= 1.1f;m_ScaleY /= 1.1f;m_ScaleZ /= 1.1f;InvalidateRect(NULL,FALSE);减小1.1倍void CDialogGLDlg:OnPopupSizeIncrease() m_ScaleX *= 1.1f;m_ScaleY *= 1.1f;m_ScaleZ *= 1.1f;InvalidateRect(NULL,FALSE);增大.1倍:读进纹理void CDialogGLDlg:OnPopupTexturefile() CFileDialogdlg(TRUE,*.bmp,*.bmp,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,RAW image file (*.raw),NULL);if(dlg.DoModal() = IDOK)CString filename = dlg.GetFileName();m_Texture.ReadFile(filename.GetBuffer(255);m_Texture.BGRtoRGB();filename.ReleaseBuffer();:glDeleteLists(1,1);BuildList();InvalidateRect(NULL,FALSE);:屏幕处理函数:void CDialogGLDlg:RenderScene()glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glPushMatrix();/ Position / translation (mouse rotation)glTranslated(0.0,0.0,-8.0);glRotated(m_x
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 社区补贴协议书范本
- 的录音制作合同范本
- 新生儿病房护理质量评价标准
- 手机新功能介绍
- 2026年高端私人影院建设公司线下营销(展会沙龙)管理制度
- 高压氧气疗法教学
- 婴儿仰卧抬头训练
- 足球课安全教育
- 流行病学学科疾病症状解析及护理宝典
- 高血压病初期症状识别及护理方法讲解
- 小儿头皮静脉穿刺课件
- 物业反恐防暴培训
- 2025收费员年度工作总结
- 2025初中英语复习策略
- 恶性肿瘤的内科治疗教案(2025-2026学年)
- 药剂科入科培训
- 安全生产责任制度(全员)
- 2024年6月GESP编程能力认证C++等级考试二级真题试卷(含答案)
- 2025-2030留守儿童认知发展滞后问题的多中心干预报告
- 《金融风险管理》-课件 第一章金融风险管理概论
- 2026年广东公务员考试行测真题之言语理解和表达含答案(巩固)
评论
0/150
提交评论