计算机图形学实验报告(同名14180)_第1页
计算机图形学实验报告(同名14180)_第2页
计算机图形学实验报告(同名14180)_第3页
计算机图形学实验报告(同名14180)_第4页
计算机图形学实验报告(同名14180)_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

计算机图形学实验报告(同名14180)计算机图形学计算机图形学实验报告计算机图形学课计算机图形学课程实验报告姓名:姓名:学号:DDA算法绘制直线DDA算法绘制直线实验一dx=x1-x0;dy=y1-y0;x=x0;y=y0;if(abs(dx)>abs(dy))epsl=abs(dx);elseepsl=abs(dy);xIncre=(float)dx/(float)epsl;yIncre=(float)dy/(float)epsl;for(k=0;k<=epsl;k++){glPointSize(3);glBegin(GL_POINTS);glVertex2i(int(x+0.5),(int)(y+0.5));glEnd();x+=xIncre;y+=yIncre;}}voidDisplay(void){glClear(GL_COLOR_BUFFER_BIT);DDALine(100,100,200,180);glFlush();}voidwinReshapeFcn(GLintnewWidth,GLintnewHeight){glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,GLdouble(newWidth),0.0,GLdouble(newHeight));glClear(GL_COLOR_BUFFER_BIT);winWidth=newWidth;winHeight=newHeight;}intmain(intargc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(400,300);glutInitWindowPosition(100,120);glutCreateWindow("line");Initial();glutDisplayFunc(Display);glutReshapeFunc(winReshapeFcn);glutMainLoop();return0;}Bresenham算法Bresenham算法实验二实验二Bresenham绘制直线和圆一、【实验目的】1.掌握Bresenham算法扫描转换圆和直线的基本原理。二、【实验内容】1.利用Bresenham算法扫描转换圆和直线的基本原理编程实现对圆和直线的扫描转换。三、【测试数据及其结果】四、【实验源代码】绘制直线:#include<stdlib.h>#include<math.h>#include<GL/glut.h>#include<stdio.h>GLsizeiwinWidth=500;GLsizeiwinHeight=500;voidlineBres(intx0,inty0,intxEnd,intyEnd){glColor3f(0.0,0.0,1.0);intdx=fabs(xEnd-x0),dy=fabs(yEnd-y0);intp=2*dy-dx;inttwoDy=2*dy,twoDyMinusDx=2*(dy-dx);intx,y;if(x0>xEnd){ x=xEnd;y=yEnd;xEnd=x0;}else{ x=x0;y=y0;}glPointSize(6);glBegin(GL_POINTS);glVertex2i(x,y);glEnd();while(x<xEnd){ x++; if(p<0) p+=twoDy; else{ y++;p+=twoDyMinusDx; }glPointSize(2);glBegin(GL_POINTS);glVertex2i(x,y);glEnd();}}voidinit(void){glClearColor(1.0,1.0,1.0,1.0);glShadeModel(GL_FLAT);}voiddisplay(void){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);lineBres(10,10,400,300);glFlush();}voidwinReshapeFcn(GLintnewWidth,GLintnewHeight){glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,GLdouble(newWidth),0.0,GLdouble(newHeight));glClear(GL_COLOR_BUFFER_BIT);winWidth=newWidth;winHeight=newHeight;}voidmain(intargc,char**argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowPosition(10,10);glutInitWindowSize(winWidth,winHeight);glutCreateWindow("lineBres");init();glutDisplayFunc(display);glutReshapeFunc(winReshapeFcn);glutMainLoop();}绘制圆:#include<gl/glut.h>voidinit(){glClearColor(0,0,0,0);}voidMidBresenhamCircle(intr){ intx,y,d; x=0; y=r; d=1-r; glBegin(GL_LINE_STRIP); while(x<=y){glVertex2f(x,y); if(d<0)d+=2*x+3; else{ d+=2*(x-y)+5; y--; } x++; } glEnd();}voiddisplay(){ glClearColor(1,1,1,1); glClear(GL_COLOR_BUFFER_BIT); glColor3f(1,0,0); MidBresenhamCircle(8); glRotated(45,0,0,1); MidBresenhamCircle(8); glRotated(45,0,0,1); MidBresenhamCircle(8);glRotated(45,0,0,1); MidBresenhamCircle(8); glRotated(45,0,0,1); MidBresenhamCircle(8); glRotated(45,0,0,1); MidBresenhamCircle(8); glRotated(45,0,0,1); MidBresenhamCircle(8); glRotated(45,0,0,1); MidBresenhamCircle(8);glutSwapBuffers();}voidreshape(intw,inth){ glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-10,10,-10,10);}intmain(intargc,char**argv){ glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); glutInitWindowSize(400,400); glutInitWindowPosition(100,100); glutCreateWindow("扫描转换圆"); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return0;}反走样及五环的绘制反走样及五环的绘制实验三实验三反走样及五环的绘制一、【实验目的】1.了解走样和反走样的内容,熟练掌握用opengl实现图形的反走样。

2.学会用反走样消除走样现象。3.学会五环的绘制方法。二、【实验内容】1.通过学习反走样相关课程,用opengl实现光栅图形的反走样。2.绘制五环。三、【测试数据及其结果】四、【实验源代码】反走样:#include<gl/glut.h>#pragmacomment(linker,"/subsystem:\"windows\"/entry:\"mainCRTStartup\"")GLuintlineList;//指定显示列表voidInitial(){ glClearColor(1.0f,1.0f,1.0f,0.0f); glLineWidth(12.0f); glColor4f(0.0,0.6,1.0,1.0); lineList=glGenLists(1);//获得一个显示列表标识 glNewList(lineList,GL_COMPILE);//定义显示列表 glBegin(GL_LINE_LOOP); glVertex2f(1.0f,1.0f);glVertex2f(4.0f,2.0f);glVertex2f(2.0f,5.0f); glEnd();glEndList();}voidChangeSize(GLsizeiw,GLsizeih){ if(h==0)h=1; glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION);//指定设置投影参数 glLoadIdentity(); if(w<=h) gluOrtho2D(0.0,5.0,0.0,6.0*(GLfloat)h/(GLfloat)w); else gluOrtho2D(0.0,5.0*(GLfloat)w/(GLfloat)h,0.0,6.0); glMatrixMode(GL_MODELVIEW);//指定设置模型视图变换参数 glLoadIdentity();}voidDisplayt(void){ glClear(GL_COLOR_BUFFER_BIT); glCallList(lineList);//调用显示列表 glFlush();}voidDisplayw(void){ glClear(GL_COLOR_BUFFER_BIT); glEnable(GL_LINE_SMOOTH);//使用反走样 glEnable(GL_BLEND);//启用混合函数 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);//指定混合函数 glCallList(lineList);//调用显示列表 glFlush();}voidmain(void){ glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(300,300); glutCreateWindow("原始图形"); glutDisplayFunc(Displayt);glutReshapeFunc(ChangeSize); Initial(); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowPosition(300,300); glutInitWindowSize(300,300); glutCreateWindow("反走样图形");glutDisplayFunc(Displayw); glutReshapeFunc(ChangeSize); Initial(); glutMainLoop();}五环:#include<gl/glut.h>#include<MATH.H>#pragmacomment(linker,"/subsystem:\"windows\"/entry:\"mainCRTStartup\"")constfloatPI=3.1415;voidDrawCircle(GLfloatradius){ GLfloatx,y,z; glBegin(GL_LINE_LOOP); for(intalpha=0;alpha<360;alpha++) { x=radius*cos(alpha*PI/180); y=radius*sin(alpha*PI/180); z=0; glVertex3f(x,y,z); } glEnd();}voidDisplay(){ glClearColor(1,1,1,1); glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); glTranslatef(0,0,-25); glColor3f(0,1,0); glLineWidth(3); DrawCircle(3.0); glPopMatrix(); glPushMatrix(); glTranslatef(7,0,0); glColor3f(1,0,0); DrawCircle(3.0); glPopMatrix(); glPushMatrix(); glTranslatef(-7,0,0); glColor3f(0,0,1);DrawCircle(3.0); glPopMatrix(); glPushMatrix(); glTranslatef(-3.5,-3.5,0); glColor3f(0.3,0.5,0.7);DrawCircle(3.0); glPopMatrix(); glPushMatrix(); glTranslatef(3.5,-3.5,0); glColor3f(0.7,0.0,0.3);DrawCircle(3.0); glPopMatrix(); glutSwapBuffers();}voidreshape(intw,inth){ glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45,GLdouble(w)/h,1,100); glMatrixMode(GL_MODELVIEW);}voidmain(intargc,char**argv){ glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE); glutInitWindowPosition(10,10); glutInitWindowSize(500,500); glutCreateWindow("Test"); glutDisplayFunc(Display); glutReshapeFunc(reshape); glutMainLoop();}多视区多视区实验四实验四多视区一、【实验目的】1.熟练掌握各种裁剪算法和二维观察变换。

2.学会在屏幕坐标系下创建多个视区、指定视区的宽度和高度,了解二维观察变换中包含窗口到视区的映射。二、【实验内容】1.在一个显示窗口内指定多个视区,分别显示具有相同坐标、不同颜色和不同显示模式的各种图形面。

2.在书本给定程序基础上,对程序做一些改变并在视区中绘制各种图形。三、【测试数据及其结果】四、【实验源代码】#include<gl/glut.h>#include<MATH.H>constfloatPI=3.1415;voidinitial(void){ glClearColor(1.0,1.0,1.0,1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-10.0,10.0,-10.0,10.0);}voidtriangle(GLsizeimode){ if(mode==1) glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); else glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); glBegin(GL_TRIANGLES); glVertex2f(0.0,5.0); glVertex2f(5.0,-5.0); glVertex2f(-5.0,-5.0); glEnd();}voidpolygon(GLsizeimode){ if(mode==1) glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); else glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); glBegin(GL_POLYGON); glVertex2f(2.0,7.0); glVertex2f(5.0,3.0); glVertex2f(4.0,0.0); glVertex2f(0.0,0.0); glVertex2f(1.0,4.0); glEnd();}voidDrawCircle(GLfloatr){ GLfloatx,y,z; glBegin(GL_LINE_LOOP); for(intalpha=0;alpha<360;alpha++) { x=r*cos(alpha*PI/180); y=r*sin(alpha*PI/180); z=0; glVertex3f(x,y,z); } glEnd();}voidDisplay(){ glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0,0.0,0.0); glViewport(0,0,100,100); triangle(1);glColor3f(0.0,0.0,1.0);glViewport(100,0,100,100); triangle(2); glColor3f(1.0,0.0,0.0);glViewport(0,100,100,100);polygon(2); glViewport(100,100,100,100);DrawCircle(5); glFlush();}voidmain(void){ glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowPosition(10,10); glutInitWindowSize(400,200); glutCreateWindow("多视区"); initial(); glutDisplayFunc(Display); glutMainLoop();}分子模型分子模型实验五实验五分子模型一、【实验目的】1.熟练掌握二维、三维几何变换矩阵和透视投影的相关知识从而用opengl实现分子模型的运动。

2.熟练掌握opengl中相关函数的调用和实现。二、【实验内容】1.显示分子模型:红色大球表示原子,三个黄色小球表示电子,分别绕原子旋转,采用透视投影变换显示电子旋转过程。2.启用深度测试和模型视图矩阵完成分子动画。三、【测试数据及其结果】四、【实验源代码】#include<gl/glut.h>GLintangleSelf=0;voidInitial(){ glEnable(GL_DEPTH_TEST); glClearColor(1.0f,1.0f,1.0f,1.0f);}voidChangeSize(intw,inth){ if(h==0)h=1; glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); GLfloatfAspect; fAspect=(float)w/(float)h; gluPerspective(45.0,fAspect,1,500.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity();}voidDisplay(void){ staticfloatfElect1=0.0f; glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0f,0.0f,-250.0f); glColor3f(1.0f,0.0f,0.0f); glutWireSphere(12.0f,15,15); glColor3f(0.0f,1.0f,0.0f); glPushMatrix(); glRotatef(fElect1,0.0f,1.0f,0.0f); glTranslatef(90.0f,0.0f,0.0f); glRotatef(angleSelf,0,1,0); glutWireSphere(6.0f,15,15); glPopMatrix(); glPushMatrix(); glRotatef(45.0f,0.0f,0.0f,1.0f); glRotatef(fElect1,0.0f,1.0f,0.0f); glTranslatef(-70.0f,0.0f,0.0f); glRotatef(angleSelf,0,1,0); glutWireSphere(6.0f,15,15); glPopMatrix(); glPushMatrix(); glRotatef(-45.0f,0.0f,0.0f,1.0f); glRotatef(fElect1,0.0f,1.0f,0.0); glTranslatef(0.0f,0.0f,60.0f); glRotatef(angleSelf,0,1,0); glutWireSphere(6.0f,15,15); glPopMatrix(); fElect1+=5.0f; if(fElect1>360.0f)fElect1=10.0f; glutSwapBuffers();}voidRotateSelf(intvalue){ if(value==1) { angleSelf+=5; angleSelf%=360; glutPostRedisplay(); glutTimerFunc(100,RotateSelf,1); }}voidTimerFunc(intvalue){ glutPostRedisplay(); glutTimerFunc(100,TimerFunc,1);}intmain(intargc,char*argv[]){ glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH); glutCreateWindow("分子动画示例"); glutReshapeFunc(ChangeSize); glutDisplayFunc(Display); glutTimerFunc(500,TimerFunc,1); glutTimerFunc(100,RotateSelf,1); Initial(); glutMainLoop(); return0;} Bezier曲线Bezier曲线实验六实验六Bezier曲线一、【实验目的】1.掌握Bezire曲线定义。

2.掌握设计绘制一次、二次和三次Bezier曲线算法。二、【实验内容】1.绘制NURBS曲面。2.基于Bezier定义根据控制多边形的阶次绘制

Bezier曲线。三、【测试数据及其结果】四、【实验源代码】原实验代码:#include<GL/glut.h>#include<math.h>#include<stdlib.h>classPt3D{public: GLfloatx,y,z;};voidGetCnk(GLintn,GLint*c){ GLinti,k; for(k=0;k<=n;k++){ c[k]=1; for(i=n;i>=k+1;i--)c[k]=c[k]*i; for(i=n-k;i>=2;i--)c[k]=c[k]/i; }}voidGetPointPr(GLint*c,GLfloatt,Pt3D*Pt,intControlN,Pt3D*ControlP){ GLintk,n=ControlN-1; GLfloatBernstein; Pt->x=0.0; Pt->y=0.0; Pt->z=0.0; for(k=0;k<ControlN;k++){Bernstein=c[k]*pow(t,k)*pow(1-t,n-k); Pt->x+=ControlP[k].x*Bernstein;Pt->y+=ControlP[k].y*Bernstein;Pt->z+=ControlP[k].z*Bernstein; }}voidBezierCurve(GLintm,GLintControlN,Pt3D*ControlP){ GLint*C,i; Pt3DCurvePt; C=newGLint[ControlN]; GetCnk(ControlN-1,C); glBegin(GL_POINTS); for(i=0;i<=m;i++){ GetPointPr(C,(GLfloat)i/(GLfloat)m,&CurvePt,ControlN,ControlP); glVertex2f(CurvePt.x,CurvePt.y); } glEnd(); delete[]C;}voidinitial(void){ glClearColor(1.0,1.0,1.0,1.0);}voidDisplay(void){ glClear(GL_COLOR_BUFFER_BIT); GLintControlN=4,m=500; Pt3DControlP[4]={{-80.0,-40.0,0.0},{-10.0,90.0,0.0},{10.0,-90.0,0.0},{80.0,40.0,0.0}}; glPointSize(2); glColor3f(0.0,0.0,0.0); BezierCurve(m,ControlN,ControlP); glBegin(GL_LINE_STRIP); for(GLinti=0;i<4;i++)glVertex3f(ControlP[i].x,ControlP[i].y,ControlP[i].z); glEnd(); glFlush();}voidreshape(GLintnewWidth,GLintnewHeight){ glViewport(0,0,newWidth,newHeight); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-100.0,100.0,-100.0,100.0); }voidmain(void){ glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowPosition(100,100); glutInitWindowSize(400,400); glutCreateWindow("Bezier曲线"); initial(); glutDisplayFunc(Display); glutReshapeFunc(reshape); glutMainLoop();}加改后的:#include<GL/glut.h>voidinitial(void){glClearColor(1.0,1.0,1.0,1.0);glLineWidth(4.0);GLfloatControlP[4][3]={{-80.0,40.0,0.0},{-10.0,90.0,0.0},{10.0,-90.0,0.0},{80.0,40.0,0.0}};glMap1f(GL_MAP1_VERTEX_3,0.0,1.0,3,4,*ControlP);glEnable(GL_MAP1_VERTEX_3);}voidDisplay(void){glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);glMapGrid1f(100,0.0,1.0);glEvalMesh1(GL_LINE,0,100);glFlush();}voidReshape(GLintnewWidth,GLintnewHeight){glViewport(0,0,newWidth,newHeight);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(-100.0,100.0,-100.0,100.0);}voidmain(void){glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowPosition(100,100);glutInitWindowSize(400,400);glutCreateWindow("Bezier曲线");initial();glutDisplayFunc(Display);glutReshapeFunc(Reshape);glutMainLoop();NURBSNURBS实验九实验七NURBS曲面和Bezier曲面一、【实验目的】1.掌握NURBS曲线定义。

2.掌握设计绘制一次、二次和三次NURBS曲面算法。二、【实验内容】1.在屏幕上单击鼠标左键绘制控制多边形,基于NURBS定义根据控制多边形的阶次绘制NURBS曲面。2.绘制的曲面中,红色的点表示曲面的控制点,并增加了光标键控制旋转的交互式方式,以获得更好的显示效果。三、【测试数据及其结果】四、【实验源代码】NURBS曲面:#include<windows.h>#include<gl/glut.h>#include<math.h>GLUnurbsObj*pNurb=NULL;GLintnNumPoints=4;GLfloatctrlPoints[4][4][3]={{{-6.0f,-6.0f,0.0f},{-6.0f,-2.0f,0.0f},{-6.0f,2.0f,0.0f},{-6.0f,6.0f,0.0f}},{{-2.0f,-6.0f,0.0f},{-2.0f,-2.0f,8.0f},{-2.0f,2.0f,8.0f},{-2.0f,6.0f,0.0f}},{{2.0f,-6.0f,0.0f},{2.0f,-2.0f,8.0f},{2.0f,2.0f,8.0f},{2.0f,6.0f,0.0f}},{{6.0f,-6.0f,0.0f},{6.0f,-2.0f,0.0f},{6.0f,2.0f,0.0f},{6.0f,6.0f,0.0f}}};GLfloatKnots[8]={0.0f,0.0f,0.0f,0.0f,1.0f,1.0f,1.0f,1.0f};staticGLfloatxRot=0.0f;staticGLfloatyRot=0.0f;voidDrawPoints(void){ inti,j; glPointSize(5.0f); glColor3ub(255,0,0); glBegin(GL_POINTS); for(i=0;i<4;i++) for(j=0;j<4;j++) glVertex3fv(ctrlPoints[i][j]); glEnd();}voidInitial(){ glClearColor(1.0f,1.0f,1.0f,1.0f); pNurb=gluNewNurbsRenderer(); gluNurbsProperty(pNurb,GLU_SAMPLING_TOLERANCE,25.0f);gluNurbsProperty(pNurb,GLU_DISPLAY_MODE,(GLfloat)GLU_OUTLINE_POLYGON);}voidReDraw(void){ glColor3ub(0,0,220); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glRotatef(330.0f,1.0f,0.0f,0.0f); glRotatef(xRot,1.0f,0.0f,0.0f); glRotatef(yRot,0.0f,1.0f,0.0f); gluBeginSurface(pNurb); gluNurbsSurface(pNurb, 8, Knots, 8, Knots, 4*3, 3, &ctrlPoints[0][0][0], 4, 4, GL_MAP2_VERTEX_3); gluEndSurface(pNurb); DrawPoints(); glPopMatrix(); glutSwapBuffers();}voidSpecialKeys(intkey,intx,inty){ if(key==GLUT_KEY_UP)xRot-=5.0f; if(key==GLUT_KEY_DOWN)xRot+=5.0f; if(key==GLUT_KEY_LEFT)yRot-=5.0f; if(key==GLUT_KEY_RIGHT)yRot+=5.0f; if(xRot>356.0f)xRot=0.0f; if(xRot<-1.0f)xRot=355.0f; if(yRot>356.0)yRot=0.0f; if(yRot<-1.0f)yRot=355.0f; glutPostRedisplay();}voidChangeSize(intw,inth){ if(h==0)h=1; glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f,(GLdouble)w/(GLdouble)h,1.0,40.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0f,0.0f,-20.0f);}intmain(intargc,char**argv){ glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH); glutCreateWindow("NURBS曲面"); glutReshapeFunc(ChangeSize); glutDisplayFunc(ReDraw); glutSpecialFunc(SpecialKeys); Initial(); glutMainLoop(); return0;}NURBS曲面和Bezier曲面NURBS曲面和Bezier曲面实验七在原来的基础上加的:#include<windows.h>#include<gl/glut.h>#include<math.h>GLUnurbsObj*pNurb=NULL;GLintnNumPoints=4;GLfloatKnots[8]={0.0f,0.0f,0.0f,0.0f,1.0f,1.0f,1.0f,1.0f};GLfloatControlP[4][4][3]={{{-1.5,-1.5,4.0},{-0.5,-1.5,2.0},{-0.5,-1.5,-1.0},{1.5,-1.5,2.0}},{{-1.5,-0.5,1.0},{-0.5,-0.5,3.0},{-0.5,-0.5,0.0},{1.5,-0.5,-1.0}},{{-1.5,0.5,4.0},{-0.5,0.5,0.0},{0.5,0.5,3.0},{1.5,0.5,4.0}},{{-1.5,1.5,-2.0},{-0.5,1.5,-2.0},{0.5,1.5,0.0},{1.5,1.5,-1.0}}};voidDrawPoints(void){ inti,j; glPointSize(5.0f); glColor3ub(255,0,0); glBegin(GL_POINTS); for(i=0;i<4;i++) for(j=0;j<4;j++) glVertex3fv(ControlP[i][j]); glEnd();}voidReDraw(void){ glColor3ub(0,0,220); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glMap2f(GL_MAP2_VERTEX_3,0.0,1.0,3,4,0.0,1.0,12,4,&ControlP[0][0][0]); glEnable(GL_MAP2_VERTEX_3); glColor3f(1.0,1.0,1.0); glMapGrid2f(40,0.0,1.0,40,0.0,1.0); glEvalMesh2(GL_FILL,0,40,0,40); DrawPoints(); glutSwapBuffers();}voidChangeSize(intw,inth){ if(h==0)h=1; glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f,(GLdouble)w/(GLdouble)h,1.0,40.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0f,0.0f,-20.0f);}intmain(intargc,char*argv[]){ glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH); glutCreateWindow("NURBS曲面"); glutReshapeFunc(ChangeSize); glutDisplayFunc(ReDraw); glutMainLoop(); return0;}两点光源在球体上的效果两点光源在球体上的效果实验八实验八两点光源在球体上的效果一、【实验目的】1.掌握漫反射光、镜面反射光和聚光源的含义。

2.掌握opengl中不同点光源的设置。二、【实验内容】1.设置两个光源,一个是漫反射的蓝色点光源,另一个是红色聚光光源,他们都照在一个球体上,产生亮斑。2.调用opengl中的函数指定当前设定的材质应用于物体表面的哪个面,从而使光照下产生特殊的效果。三、【测试数据及其结果】四、【实验源代码】#include<windows.h>#include<gl

温馨提示

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

评论

0/150

提交评论