计算机图形学实验报告-OpenGL基本使用_第1页
计算机图形学实验报告-OpenGL基本使用_第2页
计算机图形学实验报告-OpenGL基本使用_第3页
计算机图形学实验报告-OpenGL基本使用_第4页
计算机图形学实验报告-OpenGL基本使用_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

学生实验实习报告册学年学期:2016-2017学年春eq\o\ac(□,√)秋学期课程名称:大学计算机基础学生学院:通信与信息工程学院专业班级:学生学号:学生姓名:联系电话:重庆邮电大学教务处印制实验实习名OpenGL基本使用指导教师秦红星考核成绩课程名称计算机图形学A课程编号实验实习地点信息科技大厦S306完成日期学生姓名学生学号学院专业广电与数字媒体类所在班级教师评语教师签名:年月日实验实习目的及要求目的:认识了解OpenGL的性质、功能要求:1.利用OpenGL绘制一个简单的场景:比如球体、正方体2.加入灯光3.实现交互操作:平移、缩放、旋转二、实验实习设备(环境)及要求(软硬件条件)采用MicrosoftVisualC2010生成环境并用C++编写程序三、实验实习内容与步骤内容:背景为黑色,在点光源下,能够实现平移、缩放、旋转的球。步骤:建立立体-->添加光照-->添加变换1.先写“主函数”,在主函数中将窗口生成好。2.在“自定义函数1”中对窗口进行清除、填色等操作。3.在“自定义函数1”中设置点光源,设置光照的各种参数。4.在“自定义函数1”中设置平移、缩放、旋转及各参数。5.在“自定义函数2”中设置平移和缩放的循环。6.在主函数中调用这两个自定义函数,并且在主函数里面用“自定义函数1”为参数调用glutDisplayFunc()来注册一个绘图函数。其次用空闲回调函数glutIdleFunc()来使球体不停地循环有缩放、平移功能的函数。实现动画。四、实验实习过程或算法(源程序、代码)#include<GL/glut.h>GLfloatangle=0.0f;GLfloatmultiply=0.0f;voiddisplay(void){ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glClearColor(0.0f,0.0f,0.0f,0.0f);//设置窗口里面的背景颜色 glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(90.0f,1.0f,1.0f,20.0f); glLoadIdentity(); gluLookAt(0.5,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0); { //设置一个点光源 GLfloatlight_position[]={0.5f,0.0f,0.0f,1.0f};//(xyzw)w为1时代表点光源,0时代表方向光源 GLfloatlight_ambient[]={0.5f,0.5f,0.5f,1.0f};//(0001) GLfloatlight_diffuse[]={1.0f,1.0f,1.0f,1.0f};//(1111) GLfloatlight_specular[]={1.0f,1.0f,1.0f,1.0f};//(1111) glLightfv(GL_LIGHT0,GL_POSITION,light_position); glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);//光源环境光强值 glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);//光源漫反射强值 glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);//光源镜面反射强值 glEnable(GL_LIGHT0);//打开该光源 glEnable(GL_LIGHTING);//打开光照 } { glRotatef(angle,0.0f,1.0f,0.0f); glTranslatef(0.0f,0.0f,0.6f);//平移 glScaled(multiply,multiply,multiply);//缩放 glutSolidSphere(0.2,50,50); } glutSwapBuffers();}voidrotateAndzoom(void)//旋转和缩放{ angle+=1.0f; if(angle>=360.0f) angle=0.0f; display(); //设置旋转 multiply+=0.01f; if(multiply>=2.0f) //multiply-=0.01f; //if(multiply<=1.0f) multiply=1.0f; display(); //设置缩放} intmain(intargc,char*argv[]){ glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE); glutInitWindowPosition(400,50); glutInitWindowSize(800,800); glutCreateWindow("立体"); glutDisplayFunc(&display); glutIdleFunc(&rotateAndzoom);//旋转 glutMainLoop();//调用该函数启动程序,所有以创建的窗口将会显示 return0;}五、实验实习结果分析和(或)源程序调试过程实验实习名直线扫面和区域填充实现指导教师考核成绩课程名称课程编号实验实习地点完成日期学生姓名学生学号学院专业通信与信息工程学院广电与数字媒体类所在班级教师评语教师签名:年月日一、实验实习目的及要求项目目的:熟悉光栅图形学中的相关算法项目要求:1.应用OpenGL点绘制函数直线与区域2.采用直线扫面算法绘制一条线段,直线有离散点组成3.利用区域填充算法绘制多边形区域,区域由离散点组成二、实验实习设备(环境)及要求(软硬件条件)采用MicrosoftVisualC2010生成环境并用C++编写程序三、实验实习内容与步骤内容:1.用DDA算法实现点绘制直线。2.用直线扫描法填充绘制绿色的六边形。步骤:点绘制直线:选定用利用DDA算法。完善相应计算点的算法代码,利用该代码算出直线上所有的点。用OpenGL函数将点连接起来形成直线绘制直线。区域填充:1.初始化一个空的栈用于存放种子点,将种子点(x,y)入栈;2.判断栈是否为空,如果栈为空则结束算法,否则取出栈顶元素作为当前扫描线的种子点(x,y),y是当前的扫描线;3.从种子点(x,y)出发,沿当前扫描线向左、右两个方向填充,直到边界。分别标记区段的左、右端点坐标为xLeft和xRight;4.分别检查与当前扫描线相邻的y-1和y+1两条扫描线在区间[xLeft,xRight]中的像素,从xLeft开始向xRight方向搜索,若存在非边界且未填充的像素点,则找出这些相邻的像素点中最右边的一个,并将其作为种子点压入栈中,然后返回第(2)步;四、实验实习过程或算法(源程序、代码)1.“点绘制直线”的代码:#include<GL/glut.h>#include<stdlib.h>voidinit(void){ glClearColor(0.0,0.0,0.0,0.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0,500.0,0.0,500.0); glMatrixMode(GL_MODELVIEW);}voiddrawpixel(intx,inty,intz)//此为一个画点的函数{ glBegin(GL_POINTS); glViewport(0,0,500,500);//指定在窗口中的位置。0,0为左下角窗口的位置,500,500为宽度和高度 glVertex3d(x,y,0); glEnd(); glFlush();}voidDDALine(intx0,inty0,intx1,inty1){ intx; GLfloatNx,Ny,y;//x,y的点的个数 intdx,dy,quantity;//dx是x0-x1的x的总增量,dy是y0-y1的y的总增量,quantity为点的数量 floatk; dx=x1-x0; dy=y1-y0; k=dy/dx; if(abs(dx)>abs(dy))//通过绝对值判断谁为先变 { quantity=abs(dx); } else { quantity=abs(dy); } Nx=(GLfloat)dx/(GLfloat)quantity;//x方向上的单位增量 Ny=(GLfloat)dy/(GLfloat)quantity;//y方向上的单位增量 for(x=x0,y=y0;x<=x1;x++) { x=int(x+Nx); y=y+Ny; drawpixel(x,int(y+0.5),0); }}voiddisplay(void)//生成直线的函数{ glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0,0.0,0.0);//红色 DDALine(100,150,300,100); glFlush();}voidmain(intargc,char*argv[]){ glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(500,500); glutCreateWindow("项目2"); init(); glutDisplayFunc(display); glutMainLoop();}2.“区域填充”的代码:#include<gl/glut.h>#include<windows.h>constintPOINTNUM=6;//多边形点数. //定义结构体用于活性边表AET和新边表NETtypedefstructXET{ floatx; floatdx,ymax; XET*next;}AET,NET;//定义点结构体pointstructpoint{ floatx; floaty;}polypoint[POINTNUM]={250,50,500,150,550,400,400,250,200,350,100,100};//多边形顶点voidPolyScan(){ //计算最高点的y坐标(扫描到此结束) intMaxY=0; inti; for(i=0;i<POINTNUM;i++) if(polypoint[i].y>MaxY) MaxY=polypoint[i].y; //初始化AET表 AET*pAET=newAET; pAET->next=NULL; //初始化NET表 NET*pNET[1024]; for(i=0;i<=MaxY;i++) { pNET[i]=newNET; pNET[i]->next=NULL; } glClear(GL_COLOR_BUFFER_BIT);//赋值的窗口显示. glColor3f(0.5,0.5,0.0);//设置直线的颜色红色 glBegin(GL_POINTS); //扫描并建立NET表 for(i=0;i<=MaxY;i++) { for(intj=0;j<POINTNUM;j++) if(polypoint[j].y==i) {//一个点跟前面的一个点形成一条线段,跟后面的点也形成线段 if(polypoint[(j-1+POINTNUM)%POINTNUM].y>polypoint[j].y) { NET*p=newNET; p->x=polypoint[j].x; p->ymax=polypoint[(j-1+POINTNUM)%POINTNUM].y; p->dx=(polypoint[(j-1+POINTNUM)%POINTNUM].x-polypoint[j].x)/(polypoint[(j-1+POINTNUM)%POINTNUM].y-polypoint[j].y); p->next=pNET[i]->next; pNET[i]->next=p; } if(polypoint[(j+1+POINTNUM)%POINTNUM].y>polypoint[j].y) { NET*p=newNET; p->x=polypoint[j].x; p->ymax=polypoint[(j+1+POINTNUM)%POINTNUM].y; p->dx=(polypoint[(j+1+POINTNUM)%POINTNUM].x-polypoint[j].x)/(polypoint[(j+1+POINTNUM)%POINTNUM].y-polypoint[j].y); p->next=pNET[i]->next; pNET[i]->next=p; } } } //建立并更新活性边表AET for(i=0;i<=MaxY;i++) { //计算新的交点x,更新AET NET*p=pAET->next; while(p) { p->x=p->x+p->dx; p=p->next; } //更新后新AET先排序 //断表排序,不再开辟空间 AET*tq=pAET; p=pAET->next; tq->next=NULL; while(p) { while(tq->next&&p->x>=tq->next->x) tq=tq->next; NET*s=p->next; p->next=tq->next; tq->next=p; p=s; tq=pAET; }//(改进算法)先从AET表中删除ymax==i的结点 AET*q=pAET; p=q->next; while(p) { if(p->ymax==i) { q->next=p->next; deletep; p=q->next; } else { q=q->next; p=q->next; } }//将NET中的新点加入AET,并用插入法按X值递增排序 p=pNET[i]->next; q=pAET; while(p) { while(q->next&&p->x>=q->next->x) q=q->next; NET*s=p->next; p->next=q->next; q->next=p; p=s; q=pAET; }//配对填充颜色 p=pAET->next; while(p&&p->next) { for(floatj=p->x;j<=p->next->x;j++) glVertex2i(static_cast<int>(j),i); p=p->next->next;//考虑端点情况 } } glEnd(); glFlush();}voidinit(void){ glClearColor(1.0,1.0,1.0,0.0);//窗口的背景颜色设置为白色 glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,600.0,0.0,600.0);}voidmain(intargc,char*argv){ glutInit(&argc,&argv);//I初始化GLUT. glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//设置显示模式:单个缓存和使用RGB模型 glutInitWindowPosition(50,50);//设置窗口的顶部和左边位置 glutInitWindowSize(800,800);//设置窗口的高度和宽度 glutCreateWindow("AnExampleOpenGLProgram");//创建显示窗口 init();//调用初始化过程 glutDisplayFunc(PolyScan);//图形的定义传递给我window. glutMainLoop();//显示所有的图形并等待}五、实验实习结果分析和(或)源程序调试过程实验实习名利用OpenGL绘制Bezier曲线指导教师秦红星考核成绩课程名称计算机图形学A课程编号040659实验实习地点信息科技大厦S306完成日期2016年12月7日学生姓名张春光学生学号2015210589学院专业通信与信息工程学院广电与数字媒体类所在班级01151504教师评语教师签名:年月日一、实验实习目的及要求项目目的:了解Bezier曲线,并熟悉生成Bezier曲线的迭代算法项目要求:1.使用鼠标在在屏幕中任意设置控制点,并声称曲线2.使用鼠标和键盘的交互设计操作实现对曲线的修改二、实验实习设备(环境)及要求(软硬件条件)采用MicrosoftVisualC2010生成环境并用C++编写程序三、实验实习内容与步骤内容:利用迭代算法绘制贝塞尔曲线,并且实现鼠标、键盘的交互:鼠标点击左键出现点,点击右键生成Bezier曲线;键盘输入a/b/c实现清除等。步骤:利用迭代算法,并且通过opengl库提供的回调函数进行相关设计。四、实验实习过程或算法(源程序、代码)代码:#include"stdafx.h"#include<stdlib.h>#include<stdio.h>#include<math.h>#include<GL/glut.h>constintMAX_POINT=40;constintwidth=800;constintheight=600;intr_num=0;typedefstruct{ GLfloatx,y;}POINT;POINTpoint[MAX_POINT];//存储控制点的坐标intnumnum(intn){ if(n==1||n==0) { return1; } else { returnn*numnum(n-1); }}//求阶乘doubleQueqe(intn,inti){ return(double)numnum(n)/((double)numnum(i)*(double)numnum(n-i));}//求排列voidDraw(POINT*p){ voiddisplay(); if(r_num<=0) return; POINT*p1; p1=newPOINT[1000]; GLfloatu=0,x,y; inti,num=1; p1[0]=p[0]; for(u=0;u<=1;u+=0.001) { x=0; y=0; for(i=0;i<r_num;i++) { x+=Queqe(r_num-1,i)*pow(u,i)*pow(1-u,r_num-1-i)*p[i].x; y+=Queqe(r_num-1,i)*pow(u,i)*pow(1-u,r_num-1-i)*p[i].y; } p1[num].x=x; p1[num].y=y; num++; } glPointSize(4.0); glColor3f(0.0,0.0,0.0); glBegin(GL_LINE_STRIP); for(intk=0;k<1000;k++) glVertex2f(p1[k].x,p1[k].y); glEnd(); glFlush(); return;}voidmouse(intbutton,intstate,intx,inty){ voiddisplay(); floatwx,wy; if(state!=GLUT_DOWN) { return; } else { if(button==GLUT_LEFT_BUTTON) { wx=(2.0*x)/(float)(width-1)-1.0; wy=(2.0*(height-1-y))/(float)(height-1)-1.0; if(r_num==MAX_POINT) { return; } point[r_num].x=wx;

温馨提示

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

评论

0/150

提交评论