您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 数据通信与网络 > 实验一 opengl高级图形图像实验报告
高级图形图像第一次实验报告一、实验描述以及关键步骤1.opengl编程环境组建(基于VC6.0)1)下载opengl开发库文件夹;2)复制glut32.dll和glut.dll到…\windows\system32;3)复制glut.h到...\MicrosoftVisualStudio\VC98\Include\GL;4)复制glut32.lib和glut.lib到…\MicrosoftVisualStudio\VC98\Lib;5)新建工程后,进入Project菜单,选Settings项,弹出Settings对话框,选Link项,在Libraries栏目中加入OpenGL库:opengl32.libglu32.libglaux.lib。2.基本图形绘制首先运行一个Windows环境下的一个基本OpenGL程序,直接打开60version文件夹内的工程,它将显示一个空的OpenGL窗口,可以在定制窗口大小和全屏模式下切换(按F1),按ESC退出,该程序为以后的应用程序提供了实验平台,并预留了绘图接口。根据教材P67-70,了解绘制函数,根据附件2提供的源码baseshape.cpp,将该文件内的场景绘制函数Drawsence()替代空窗口程序中的同名函数,修改图形绘制命令和参数,显示出点、线、矩形、三角形等,可设置不同线宽。3.图形的二维变换根据附件3提供源码,将该文件内的场景绘制函数Drawsence()替代空窗口程序中的同名函数,通过调用glTranslate*,glRotate*,glscale*等二维变换函数实现平移、旋转、缩放等变换,通过参数操作和矩阵操作两种方式执行。glTranslatef:在opengl中,函数glTranslatef的作用就是移动坐标原点。glRotatef:glRotatef(angle,x,y,z)函数的作用是将当前坐标系以a(x,y,z)向量为旋转轴旋转angle角度,满足右手法则,即沿着右手握拳时四个手指指向的方向旋转。glScalef:模型缩放函数。4.二维观察流水线根据附件viewport.cpp提供的源代码和课本P253-259,将该文件内的场景绘制函数Drawsence()替代空窗口程序中的同名函数,参考glut窗口操作函数,实现同一窗口中的视口变换和多视口显示。5.分形在完成前面工作的基础上,引入分形的递归算法,通过绘制小的三角形动作,生成Sierpinski镂垫。二、实验步骤解析1.首先用vc6.0新建一个支持MFC的工程,把附件所给的空窗口的源代码拷贝到工程里,运行,显示一个空窗。如图1。2.将附件2提供的源码代替上一步骤中的Drawsence()函数,运行窗口中显示出一个三角形和一个正方形,如图2。3.修改上述程序,实现画两个点,线段,矩形,如图3。4.改变上一个步骤中的线宽,画出不同宽度的线段。如图4。5.将附件3提供的源代码代替上一步骤中的Drawsence()函数,运行窗口中显示缩放,平移,旋转的三角形和正方形。如图5。6.修改上述程序,用矩阵方法实现平移,缩放和旋转。如图6。7.修改上述程序,用参数方法实现平移、旋转和缩放,并添加颜色。如图7,图8。8.将附件viewport.cpp代替上述程序中的Drawsence()函数,实现同一窗口中的视口变换和多视口显示。如图9。9.修改上述程序,实现同一窗口中的视口变换和多视口显示。如图10。10.在完成前面工作的基础上,引入分形的递归算法,通过绘制小的三角形动作,生成Sierpinski镂垫。如图11。三、编程思路及实现1.空窗程序这个程序运行后给出一个黑色背景的空窗,在DrawGLScene函数中,不写任何图形绘制的代码,仅仅进行初始设置。设置F1键的功能为跳出全屏窗口。intDrawGLScene(GLvoid)//从这里开始进行所有的绘制{glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//清除屏幕和深度缓存glLoadIdentity();//重置当前的模型观察矩阵returnTRUE;//一切OK}2.画三角形和正方形画三角形调用glBegin(GL_TRIANGLES)函数,函数中只要指定三个点即可。接着在三角形右侧3个单位距离处画正方形,用glBegin(GL_QUADS),需要四个点。intDrawGLScene(GLvoid)//{glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//清除屏幕及深度缓存glLoadIdentity();//重置当前的模型观察矩阵glTranslatef(-1.5f,0.0f,-6.0f);//左移1.5单位,并移入屏幕6.0glBegin(GL_TRIANGLES);//绘制三角形glVertex3f(0.0f,1.0f,0.0f);//上顶点glVertex3f(-1.0f,-1.0f,0.0f);//左下glVertex3f(1.0f,-1.0f,0.0f);//右下glEnd();//三角形绘制结束glTranslatef(3.0f,0.0f,0.0f);//右移3单位glBegin(GL_QUADS);//绘制正方形glVertex3f(-1.0f,1.0f,0.0f);//左上glVertex3f(1.0f,1.0f,0.0f);//右上glVertex3f(1.0f,-1.0f,0.0f);//左下glVertex3f(-1.0f,-1.0f,0.0f);//右下glEnd();//正方形绘制结束returnTRUE;//继续运行}3.画点,线段,矩形画点是最基础的绘制,使用glBegin(GL_POINTS)函数。由于单独一个点非常小,我们渲染成原来的5倍大小,用函数glPointSize(5.0f)。画线段用glBegin(GL_LINES),线段加粗用函数glLineWidth(5.0f)。画长方形与画正方形一样,只是用函数glBegin(GL_POLYGON)。//画点,线,矩型intDrawGLScene(GLvoid)//Here'sWhereWeDoAllTheDrawing{glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//清除屏幕及深度缓存glLoadIdentity();//重置当前的模型观察矩阵glTranslatef(-1.5f,0.0f,-6.0f);//左移1.5单位,并移入屏幕6.0glPointSize(5.0f);//画两个点glBegin(GL_POINTS);glVertex2f(0.0f,0.0f);glVertex2f(1.0f,0.0f);glEnd();glLineWidth(5.0f);glBegin(GL_LINES);//画线段glVertex2f(2.0f,0.0f);glVertex2f(3.0f,0.0f);glEnd();glBegin(GL_POLYGON);//按顺时针绘制一个长方形,在右上方glVertex2f(0.0f,1.0f);glVertex2f(0.0f,1.5f);glVertex2f(1.0f,1.5f);glVertex2f(1.0f,1.0f);glEnd();returnTRUE;//继续运行}4.改变线段的宽度根据上个步骤,画出几条粗细不同的线段,互为对比。//改变宽度intDrawGLScene(GLvoid)//Here'sWhereWeDoAllTheDrawing{glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//清除屏幕及深度缓存glLoadIdentity();//重置当前的模型观察矩阵glTranslatef(-1.5f,0.0f,-6.0f);//左移1.5单位,并移入屏幕6.0glLineWidth(5.0f);glBegin(GL_LINES);//画线段glVertex2f(0.0f,1.0f);glVertex2f(2.0f,1.0f);glEnd();glLineWidth(8.0f);glBegin(GL_LINES);//画线段glVertex2f(0.0f,0.0f);glVertex2f(2.0f,0.0f);glEnd();glLineWidth(12.0f);glBegin(GL_LINES);//画线段glVertex2f(0.0f,-1.0f);glVertex2f(2.0f,-1.0f);glEnd();returnTRUE;//继续运行}5.平移,缩放,旋转平移使用函数glTranslatef(3.0f,1.0f,0.0f),把当前矩阵和一个表示移动物体的矩阵相乘。三个参数分别是向x,y,z方向平移的距离。这个函数要用在绘制函数之前。缩放使用函数glScalef(1.5f,0.5f,0.0f),把当前矩阵和一个表示缩放物体的矩阵相乘。三个参数分别是x,y,z方向上的缩放倍数。旋转用函数glRotatef(rtri,0.0f,1.0f,0.0f),把当前矩阵和一个表示旋转物体的矩阵相乘。物体将绕着(0,0,0)到(x,y,z)的直线以逆时针旋转,参数rtri表示旋转的角度。//平移,缩放和旋转GLfloatrtri;//用于三角形的角度GLfloatrquad;//用于四边形的角度intDrawGLScene(GLvoid)//Here'sWhereWeDoAllTheDrawing{glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//清除屏幕及深度缓存glLoadIdentity();//重置模型观察矩阵glTranslatef(-1.5f,0.0f,-6.0f);//左移1.5单位,并移入屏幕6.0glBegin(GL_TRIANGLES);//绘制三角形glColor3f(1.0f,0.0f,0.0f);//设置当前色为红色glVertex3f(0.0f,1.0f,0.0f);//上顶点//glColor3f(0.0f,1.0f,0.0f);//设置当前色为绿色glVertex3f(-1.0f,-1.0f,0.0f);//左下//glColor3f(0.0f,0.0f,1.0f);//设置当前色为蓝色glVertex3f(1.0f,-1.0f,0.0f);//右下glEnd();//三角形绘制结束glScalef(1.5f,0.5f,0.0f);//三角形缩放glTranslatef(2.0f,1.0f,0.0f);//三角形向x方向移动1个单位glRotatef(rquad,1.0f,0.0f,0.0f);//绕X轴旋转四边形glBegin(GL_QUADS);//绘制正方形glVertex3f(-1.0f,1.0f,0.0f);//左上glVertex3f(1.0f,1.0f,0.0f);//右上glVertex3f(1.0f,-1.0f,0.0f);//左下glVertex3f(-1.0f,-1.0f,0.0f);//右下glEnd();//正方形绘制结束rtri+=0.2f;//增加三角形的旋转变量rquad-=0.15f;//减少四边形的旋转变量returnTRUE;//继续运行}6.矩阵方法实现平移,缩放和旋转GLfloatrtri;//用于三角形的角度GLfloatrquad;//用于四边形的角度intDrawGLScene(GLvoid)//Here'sWhereWeDoAllTheDrawing{GLfloatmoveMatrix[]={1.0f,0.0f,0.0f,0.0f,0.0f,1.0f,0.0f,0.0f,0.0f,0.0f,1.0f,0.0f,-1.5f,0.0f,-6.0f,1.0f};GLfloatrotateYMatrix[]={cos(rtri),0.0f,-sin(rtri),0.0f,0.0f,1.0f,0.0
本文标题:实验一 opengl高级图形图像实验报告
链接地址:https://www.777doc.com/doc-3377802 .html