基于OpenGL 的3D图形绘制.doc_第1页
基于OpenGL 的3D图形绘制.doc_第2页
基于OpenGL 的3D图形绘制.doc_第3页
基于OpenGL 的3D图形绘制.doc_第4页
基于OpenGL 的3D图形绘制.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

多媒体技术实验实验报告册班级:计算机1072 姓名:高磊 学号:1071301211实验二基于OpenGL的3D图形绘制一、实验目的与要求1. 学习 OpenGL 图形格式、数学原理;2. 掌握 OpenGL 基本图元的绘制,熟悉曲线、曲面、二次几何体的绘制技术;3. 掌握 OpenGL 光照、材质、纹理的基本原理;4. 掌握基于 Win32、Visual C+环境绘制3D 图形绘制原理、过程与步骤。二、实验仪器与设备1. 微型电子计算机80台2. Windows 2000以上版本操作系统80套3. Visual C+ 6.0开发系统80套4. OpenGL 2.0 以上函数库 80套三、实验内容与步骤本实验主要做使用图形绘制系统,实现线条,矩形,圆,文本等基本图形的绘制,保存与打开功能。实验步骤如下。1. 设计流程图开始选择演示模式选择演示类型设置光照和材质鼠标操纵3D图形翻转、移动是否自动旋转?设置旋转速度是否结束停止转动自动旋转演示 图1设计流程图2. 关键代码解析2.1 基于Win32Conslolevoid background(void)glClearColor(0.0,0.0,0.0,0.0);/设置背景颜色为黑色void myDisplay(void)glClear(GL_COLOR_BUFFER_BIT);/buffer设置为颜色可写glBegin(GL_TRIANGLES);/开始画三角形 glShadeModel(GL_SMOOTH);/设置为光滑明暗模式glColor3f(1.0,0.0,0.0);/设置第一个顶点为红色glVertex2f(-1.0,-1.0);/设置第一个顶点的坐标glColor3f(0.0,1.0,0.0);/设置第二个顶点为绿色glVertex2f(0.0,-1.0);/设置第二个顶点的坐标glColor3f(0.0,0.0,1.0);/设置第三个顶点为蓝色glVertex2f(-0.5,1.0);/设置第三个顶点的坐标glEnd();/三角形结束glPointSize(5.0f);glBegin(GL_POINTS);glVertex2f(1.0f,-0.5f);glEnd();glLineWidth(3.0f);glBegin(GL_LINES);glColor3f(1.0,0.0,0.0);/设置第一个顶点为红色glVertex2f(0.3f,-1.0f);glColor3f(0.0,1.0,0.0);/设置第二个顶点为绿色glVertex2f(1.3f,-1.0f);glEnd();glBegin(GL_POLYGON);/画五边形glColor3f(1.0,0.0,0.0);glVertex2f(0.0f,0.0f);glColor3f(0.0,1.0,0.0);glVertex2f(1.0f,0.0f);glColor3f(0.0,0.0,1.0);glVertex2f(1.5f,1.0f);glColor3f(1.0,1.0,0.0);glVertex2f(0.5f,1.5f);glColor3f(0.0,0.0,1.0);glVertex2f(-0.5f,1.0f);glEnd();/五边形结束glFlush();/强制OpenGL函数运行void myReshape(GLsizei w,GLsizei h)glViewport(0,0,w,h);/设置视口glMatrixMode(GL_PROJECTION);/指明当前矩阵为GL_PROJECTIONglLoadIdentity();/将当前矩阵置换为单位阵if(w GetSafeHdc();/BOOL COpenGL_MFCView:InitializeOpenGL()m_pDC = new CClientDC(this);SetupPixelFormat();m_hRC = :wglCreateContext(m_pDC-GetSafeHdc(); /生成绘制描述表:wglMakeCurrent(m_pDC-GetSafeHdc(), m_hRC); /置当前绘制描述表return TRUE;BOOL COpenGL_MFCView:RenderScene()glLoadIdentity();glTranslatef(0.0f,0.0f,m_zPos); glRotatef(m_xAngle,1.0f,0.0f,0.0f);glRotatef(m_yAngle,0.0f,1.0f,0.0f);/光照&材质glEnable(GL_DEPTH_TEST);/深度测试glShadeModel(GL_SMOOTH);/平滑GLfloat glfAmbient = GetRValue(m_AmbientColor)/255.0,GetGValue(m_AmbientColor)/255.0,GetBValue(m_AmbientColor)/255.0,1.0;/定义环境反射GLfloat glfDiffuse = GetRValue(m_DiffuseColor)/255.0,GetGValue(m_DiffuseColor)/255.0,GetBValue(m_DiffuseColor)/255.0,1.0;/定义漫反射GLfloat glfSpecular = GetRValue(m_SpecularColor)/255.0,GetGValue(m_SpecularColor)/255.0,GetBValue(m_SpecularColor)/255.0,1.0;/定义镜面反射GLfloat glfEmission = GetRValue(m_EmissionColor)/255.0,GetGValue(m_EmissionColor)/255.0,GetBValue(m_EmissionColor)/255.0,0.0;/定义发射光GLfloat glfShininess = 50.0;/定义高光指数glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,glfAmbient);/设置环境反射glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,glfDiffuse);/设置漫反射glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,glfSpecular);/设置镜面反射glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,glfEmission);/设置发射光glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,glfShininess);/设置辉度系数glEnable(GL_LIGHTING);/启动光照模型glEnable(GL_LIGHT0);/启动一号光源/switch(m_nType)case TEAPOT:if(m_nMode=SOLID)glutSolidTeapot(1.0f);elseglutWireTeapot(1.0f);break;case CUBE:if(m_nMode=SOLID)glutSolidCube(1.0f);elseglutWireCube(1.0f);break;case TORUS:if(m_nMode=SOLID)glutSolidTorus(0.5f, 1.0f, 50, 50);elseglutWireTorus(0.5f, 1.0f, 50, 50);break;case CONE:if(m_nMode=SOLID)glutSolidCone(0.8f,1.3f,100,100);elseglutWireCone(0.8f,1.3f,100,100);break;case SPHERE:if(m_nMode=SOLID)glutSolidSphere(1.0f,100,100);elseglutWireSphere(1.0f,100,100);break;default:break; return TRUE;BOOL COpenGL_MFCView:SetupPixelFormat()PIXELFORMATDESCRIPTOR pfd =sizeof(PIXELFORMATDESCRIPTOR), / pfd 结构的大小1, / 版本号PFD_DRAW_TO_WINDOW | / 支持在窗口中绘图PFD_SUPPORT_OPENGL | / 支持 OpenGLPFD_DOUBLEBUFFER, / 双缓存模式PFD_TYPE_RGBA, / RGBA 颜色模式24, / 24 位颜色深度0, 0, 0, 0, 0, 0, / 忽略颜色位0, / 没有非透明度缓存0, / 忽略移位位0, / 无累加缓存0, 0, 0, 0, / 忽略累加位32, / 32 位深度缓存0, / 无模板缓存0, / 无辅助缓存PFD_MAIN_PLANE, / 主层0, / 保留0, 0, 0 / 忽略层,可见性和损毁掩模;int pixelformat;pixelformat = :ChoosePixelFormat(m_pDC-GetSafeHdc(), &pfd);/选择像素格式:SetPixelFormat(m_pDC-GetSafeHdc(), pixelformat, &pfd);/设置像素格式return TRUE;void COpenGL_MFCView:OnSize(UINT nType, int cx, int cy) CView:OnSize(nType, cx, cy);/GLdouble aspect_ratio; if ( 0 = cx | 0 = cy )return;:glViewport(0, 0, cx, cy);aspect_ratio = (GLdouble)cx/(GLdouble)cy;:glMatrixMode(GL_PROJECTION);:glLoadIdentity();:gluPerspective(45.0f, aspect_ratio, .01f, 200.0f);:glMatrixMode(GL_MODELVIEW); :glLoadIdentity();/void COpenGL_MFCView:OnLButtonDown(UINT nFlags, CPoint point) m_ptOrigin=point; SetCapture();CView:OnLButtonDown(nFlags, point);void COpenGL_MFCView:OnMouseMove(UINT nFlags, CPoint point) /X,Y方向旋转if (GetCapture()!=this)return;m_xAngle+=(point.y-m_ptOrigin.y)/3.6;m_yAngle+=(point.x-m_ptOrigin.x)/3.6;m_ptOrigin=point;Invalidate();/CView:OnMouseMove(nFlags, point);BOOL COpenGL_MFCView:OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) /Z方向移动m_zPos-=zDelta/240.0;Invalidate();/return CView:OnMouseWheel(nFlags, zDelta, pt);void COpenGL_MFCView:OnLButtonUp(UINT nFlags, CPoint point) ReleaseCapture();CView:OnLButtonUp(nFlags, point);void COpenGL_MFCView:OnAutorotate() SetTimer(1,10,NULL);void COpenGL_MFCView:OnTimer(UINT nIDEvent) m_xAngle-=m_dSpeed;m_yAngle+=m_dSpeed;Invalidate();CView:OnTimer(nIDEvent);3. 软件测试结果图2基于Win32Console图3基于Win32 API图4实心茶壶图5网状茶壶图6立方体图7圆环体图8圆锥体图9球体四、思考题1 查阅资料,简述 OpenGL 的发展史,比较各个版本的主要特点。答案:OpenGL的发展史及各版本特点如下表所示:表1OpenGL发展史及各版本特点版本发布时间主要特点1.01992年基本规范,成为当时的工业标准。1.11995年改进打印机支持,在增强元文件中包含OpenGL 的调用,顶点数组的新特性,提高顶点位置、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等。1.32001年年增加了立方纹理贴图、纹理环境、多重采样、纹理框架压缩等扩展指令,但是改进程度非常有限。1.42002年只加入了深度纹理阴影纹理、顶点设计框架、自动纹理贴图等简单的功能。1.52003年包含 ARB 制定的“正式扩展规格绘制语言”(OpenGL Shading Language v1.0),该语言用于着色对象、顶点着色、片断着色等扩展功能,同时作为下一代OpenGL2.0 版本的内核。OpenGL 1.5 的变化还增加了顶点缓冲对象(可提高透视性能)、非乘方纹理(可提高纹理内存的使用效率)以及阴影功能、隐蔽查询功能等。2.02005年复杂的核心被彻底精简;完全的硬件可编程能力;改进的内存管理机制、支持高级像素处理;扩展至数字媒体领域

温馨提示

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

评论

0/150

提交评论