电子科大实验3_三维图形程序的设计说明_第1页
电子科大实验3_三维图形程序的设计说明_第2页
电子科大实验3_三维图形程序的设计说明_第3页
电子科大实验3_三维图形程序的设计说明_第4页
电子科大实验3_三维图形程序的设计说明_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

1、课程名称:三维图形设计学院:计算机科学与工程专业:计算机科学与技术指导教师:周川学生姓名:学 号:实验成绩:日 期: 2014 年 5月 19日电子科技大学计算机学院实验中心电子科技大学实验报告一、实验三:Ope nGL光照与材质编程实验二、实验室名称: 主楼 A2-412实验时间: 2014年 5月 19日三、实验目的:1、 理解OpenGL光照模型的相关原理,掌握与光照参数和对象材质设置相关的OpenGL API 函数的用法,熟悉光照与材质参数设置的基本技巧;2、理解OpenGL昆合(融合)的基本原理,掌握与混合相关的 OpenGIAPI函数的用法。四、实验原理:1. openGL 图形编

2、程技术原理2. 选择与拾取、光照与材质、混合与透明、纹理贴图、菜单。五、实验内容:(一)编程任务 1绘制一个具有光照的房间1、建立光照场景并为场景中的几何对象设置材质属性void CreateWorld()a. 四面墙壁 void CreateWall()b. 屋顶 void CreateCeiling()c. 地板 void CreateGround()d. 一个圆锥体和一个球体void CreateFurnishings()e. 在房间中创建并放置两个光源 void CreateLightAndProxy(void)a) 一个是点光源b) 一个是聚光灯;c) 为光源创建代理几何体(Prox

3、y),可以通过鼠标拖动光源代理来交互式的移动光源;2、绘制场景void DrawWorld(void)a. 绘制四面墙壁void DrawWall()b. 绘制屋顶 void DrawCeiling()c. 绘制地板 void DrawGround()d. 绘制屋内物品 void DrawFurnishings()e. 绘制光源代理 voidDrawLightProxy()其它要求:1、可交互式移动光源;2、可用右键菜单交互式的开启或关闭场景光照;3、可利用键盘快捷键调整球的材质属性,如辉度系数( GL_SHININES)S 等。分析材质是 如何影响几何对象的光照效果的。(二)编程任务 2绘制

4、一个具有地板反光效果的房间利用OpenGL昆合功能可以模拟地板反光效果,这需要将地板和场景中其它物体分开处 理,其基本思路如下:1、首先以上下颠倒的方式来绘制出地板镜像场景 ( 即沿着地板面将光源和场景进行镜 像);2、接者利用昆合在上述镜像场景之上绘制出半透明的地板;3、最后以正常的光源和场景位置来绘制场景。参考代码如下:.下载可编辑.void Ren derSce ne(void)glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glPushMatrix();/ 光源镜像移动到地板下,以照射这个“镜像”场景glLightfv(GL_LIG

5、HTO, GL_POSITION, fLightPosMirror); glPushMatrix();/场景被镜像,同时交换正反面glFro ntFace(GL_CW);glScalef(1.0f, -1.0f, 1.0f);DrawWorldExGrou nd();glFro ntFace(GL_CCW);glPopMatrix();/ 在镜像场景上绘制一个半透明的地板glDisable(GL_LIGHTING);glE nable(GL_BLEND);glBle ndFu nc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);DrawGro un d();glD

6、isable(GL_BLEND);glE nable(GL_LIGHTING);/恢复正常的光照,并正确绘制场景glLightfv(GL_LIGHT0, GL_POSITION, fLightPos);DrawWorldExGrou nd();glPopMatrix();glutSwapBuffers();六、实验器材(设备、元器件):电脑型号 戴尔System In spiron N4110笔记本电脑操作系统 Windows 8 专业版64位(DirectX 11 )软件环境 Microsoft Visual Studio Express 2012 for Win dows DesktopO

7、pe nGL Glut3.7七、实验步骤:1. 做出具有两个光照的房间2. 利用拾取做出交互的光照代理3. 做出其他相关附加需求如菜单4. 利用透明与变换做出反光地板八、实验数据及结果分析:(一)交互光照房间1. 代码:#inelude |#include #define W500/ 窗口宽#define H 500 窗口高#define D 50.0 /因为鼠标移动数据太大,而世界坐标设定得太小,所以用D各鼠标移动增量进行缩小映射int hits,hitx,hity; / 命中次数、坐标GLint viewport4;GLuint selectBuf512;/材质属性结构定义typedef

8、struct matattr GLfloat ambient4;GLfloat diffuse4;GLfloat specular4;GLfloat shininess; matattr ;/各种材质数据设置matattr ball=020.3,0.3,1.0,0.3,0.3,0.85,1.0,0.5,0.5,0.81,1.0, 50.0;matattr cone=0.3,0.0,0.0,1.0,0.6,0.0,0.0,1.0,0.8,0.6,0.6,1.0, 50.0;matattr wall= |020.5,0.5,1.0,020.5,0.5,1.0,0.9,0.9,0.9,1.0,100

9、.0;matattr ceiling=0.5,0.5,0.7,1.0,0.5,0.5,0.9,1.0,0.9,0.9,0.9,1.0,100.0;matattr ground=0.9,0.0,0.4,1.0,0.9,0.0,0.4,1.0,0.9,0.9,0.9,1.0,100.0;matattr light=1.0,1.0,0.1,1.0,1.0,1.0,0.1,1.0,0.8,0.8,021.0,50.0;0光照(点光源)属性GLfloat position0=-2.0,3.0,8.0,1.0;GLfloat ambient0=0.1,0.1,0.1,1.0;GLfloat diffuse

10、0=1.0,1.0,0.8,1.0;GLfloat specular0=1.0,1.0,1.0,1.0;1光照(聚光灯)属性GLfloat position1=-2.0,-2.0,8.0,1.0;GLfloat ambient1=0.1,0.1,0.1,1.0;GLfloat diffuse1=1.0,1.0,0.8,1.0;GLfloat specular1=1.0,1.0,1.0,1.0;GLfloat direction1=0.0,0.0,-1.0;/法向量GLfloatno rmals3=1.0,0.0,0.0,0.0,1.0,0.0,0.0,-1.0,0.0,0.0,-1.0,0.0

11、,0.0,0.0,-1.0,0.0,0.0,1.0;/全局光照参数设置(不使用默认的全局光)GLfloat global_ambient=0.5,0.5,0.5,1.0;/图片贴图数组GLubyte image443;GLUquadric *p;/=/=/赋予材质函数void evmat( matattr * mat)glMaterialfv(GL_FRONT_AND_BAGK_AMBIENTnat-ambie nt);glMaterialfv( GL_FRONT_AND_BAGL_DIFFUSEmat-diffuse);glMaterialfv( GL_FRONT_AND_BAGL_SPEC

12、ULAmat-specular);glMaterialf( GL_FRONT_AND_BAGK_SHININESSmat-shi nin ess);/创建房间void CreateWall()evmat(&wall);glNormal3fv( normals0);glBegin( GL_POLYGON/ 前面glVertex3f(-5.0,-5.0,0.0);glVertex3f(-5.0,5.0,0.0);glVertex3f(-5.0,5.0,10.0);glVertex3f(-5.0,-5.0,10.0);glE nd();glNormal3fv( normals1);glBegin(

13、GL_POLYGON/ 左边glVertex3f(5.0,-5.0,0.0);glVertex3f(5.0,-5.0,10.0);glVertex3f(-5.0,-5.0,10.0);glVertex3f(-5.0,-5.0,0.0);glE nd();glNormal3fv( normals2);glBegin( GL_POLYGON/ 右边glVertex3f(5.0,5.0,0.0);glVertex3f(-5.0,5.0,0.0);glVertex3f(-5.0,5.0,10.0);glVertex3f(5.0,5.0,10.0);glE nd();glNormal3fv( norma

14、ls3);glBegin( GL_POLYGON/ 后面glVertex3f(5.0,-5.0,0.0);glVertex3f(5.0,5.0,0.0);glVertex3f(5.0,5.0,10.0);glVertex3f(5.0,-5.0,10.0);glEn d();void CreateCeiling()evmat (&ceili ng); glNormal3fv( no rmals4);glBegin( GL_POLYGQN glVertex3f(-5.0,-5.0,10.0); glVertex3f(5.0,-5.0,10.0); glVertex3f(5.0,5.0,10.0);

15、 glVertex3f(-5.0,5.0,10.0);glE nd();void CreateGround()evmat (&grou nd); glNormal3fv( no rmals5);glBegin( GL_POLYGQN glTexCoord2f(0.0,0.0); glVertex3f(-5.0,-5.0,0.0); glTexCoord2f(0.0,15.0); glVertex3f(5.0,-5.0,0.0); glTexCoord2f(15.0,15.0); glVertex3f(5.0,5.0,0.0); glTexCoord2f(0.0,15.0); glVertex3

16、f(-5.0,5.0,0.0);glE nd();void CreateFurnishings()evmat (&con e); glPushMatrix();glTra nslatef(-4.0,-2.0,0.0); glutSolidC on e(1.0,2.0,80,50); evmat(&ball);glTra nslatef(1.0,2.0,1.0); gluSphere(p,1.0,80,50); glPopMatrix();void CreateLightAndProxy( GLenummodglLightfv( GL_LIGHT0GL_POSITIO,positio nO);g

17、lLightfv( GL_LIGHT0GL_DIFFUS|SiffuseO);glLightfv(glLightfv(GL_LIGHT0GL_SPECULARecular0);GL_LIGHT0GL_AMBIENTmbie nt0);glLightfv( glLightfv(GL_LIGHT, GL_PQSITIQN)osition1);GL_LIGHT, GL_DIFFUSEiffuse1);glLightfv( GL_LIGHT, GL_SPECULARecular1);glLightfv( GL_LIGHT, GL_AMBIEN|Tmbient1);glLightfv( GL_LIGHT

18、, GL_SPOT_DIRECTIOINection1);glLightf(GL_LIGHT, GL_SPOT_CUTQF0);glLightf(GL_LIGHT, GL_SPQT_EXPQNENT;evmat(&light);if (mode= GL_SELECglLoadName(1); 1 是矩形,点光源 glPushMatrix();glTra nslatef(positio n00,positio n01,positio n0 2);glBegin( GL_PQLYGQNglVertex3f(0,-0.25,-0.25);glVertex3f(0,-0.25,0.25);glVert

19、ex3f(0,0.25,0.25);glVertex3f(0,0.25,-0.25);glE nd();glPopMatrix();if (mode= GL_SELECglLoadName(2); 2 是三角形,聚光灯 glPushMatrix();glTra nslatef(positio n10,positio n11,positio n12);glBegin( GL_TRIANGLESglVertex3f(0,-0.25,-0.25);glVertex3f(0,0.0,0.5);glVertex3f(0,0.25,-0.25);glE nd();glPopMatrix();void Cr

20、eateWorld()CreateLightA ndProxy( GL_RENDERCreateWall();CreateCeili ng();CreateGrou nd();CreateFur ni shi ngs();/主display函数void display()glClear( GL_CQLQR_BUFFER_|BGL_DEPTH_BUFFER_BIT glMatrixMode( GL_PRQJECTIQ;NglLoadIde ntity();gluPerspective(80.0,1.0,1.0,100.0);glMatrixMode( GL_MODELVIEWglLoadlde

21、ntity();gluLookAt(4.5,0.0,5.0, 0.0,0.0,5.0, 0.0,0.0,1.0);CreateWorld();glutSwapBuffers();/鼠标移动回调void Motion( int x, int y)if (hits=1)if (selectBuf3=1) / 矩形positio n01+=(x-hitx)/ Dposition02+=(hity-y)/ D注意y是相反的,屏幕坐标和世界坐标原点位置不同else /三角形positio n11+=(x-hitx)/ Dposition12+=(hity-y)/ Delse if (hits=2)pos

22、itio n01+=(x-hitx)/Dposition02+=(hity-y)/ Dpositio n11+=(x-hitx)/Dposition12+=(hity-y)/ Dhitx= x; /拖动后新点作为击中点hity= y;glutPostRedisplay();/鼠标操作回调void mouse( int butt on , int state , int x, int y)if ( button = GLUT_LEFT_BUTTO& state = GLUT_DOW/N/ 选择模式设置,3像素精度hitx= x;hity= y;glGet In tegerv ( GL_VIEWP

23、O|RTewport);glSelectBuffer (512, selectBuf);glRe nderMode( GL_SELECTgll nitNames();glPushName(O);glMatrixMode ( GL_PROJECTIONglPushMatrix ();/利用流水线投影变换,取得鼠标点击形成的小视锥里面的图元glLoadIde ntity ();|gluPickMatrix ( GLdouble) x, ( GLdouble) (viewport3 -y), 3.0, 3.0,viewport);gluPerspective(80.0,1.0,1.0,100.0);

24、glMatrixMode( GL_MODELVIEWglLoadIde ntity();gluLookAt(4.5,0.0,5.0, 0.0,0.0,5.0, 0.0,0.0,1.0);CreateLightA ndProxy( GL_SELECTglMatrixMode ( GL_PROJECTIONglPopMatrix ();glutSwapBuffers(); |hits = glRe nderMode (GL_RENDE;RglutPostRedisplay();/键盘回调,设置材质球参数void mykey ( unsigned char key, int x, int y)swi

25、tch (key)case w :ball.shininess=(ball.shininess90)?100:(ball.shininess+10);break ;case a :ball.ambient0=(ball.ambient00.95)?1:(ball.ambient0+0.05);ball.ambie nt1=(ball.ambie nt10.95)?1:(ball.ambie nt1+0.05);ball.ambie nt2=(ball.ambie nt20.95)?1:(ball.ambie nt2+0.05);break;case s :ball.specular0=(bal

26、l.specular00.95)?1:(ball.specular0+0.05); ball.specular1=(ball.specular10.95)?1:(ball.specular1+0.05);ball.specular2=(ball.specular20.95)?1:(ball.specular2+0.05);break;case d :ball.diffuse0=(ball.diffuse00.95)?1:(ball.diffuse0+0.05);ball.diffuse1=(ball.diffuse10.95)?1:(ball.diffuse1+0.05); ball.diff

27、use2=(ball.diffuse20.95)?1:(ball.diffuse2+0.05);break;glutPostRedisplay();/菜单void mainmenu(int id)Jswitch (id)case 1:glDisable(GL_LIGHT0; break;case 2:glEnable( GL_LIGHT0 break;case 3:glDisable( GL_LIGHT); break ;case 4:glEnable( GL_LIGHT); break;/复原case 5:glE nable( GL_LIGHT0glE nable( GL_LIGHT);po

28、sitio n00=-2.0;positio n01=3.0;positio nO 2=8.0;positio n10=-2.0;positi on 11=-2.0;positio n12=8.0;ball.ambie nt0=0.2;ball.ambie nt1=0.3;ball.ambie nt2=0.3;ball.diffuse0=0.3;ball.diffuse1=0.3;ball.diffuse2=0.85;ball.specular0=0.5;ball.specular1=0.5;ball.specular2=0.81;ball.shi nin ess=50;glutPostRed

29、isplay();/初始化函数void init()int i,j,t;glEnable( GL_DEPTH_TEST/选0号,1号光照glEnable( GL_LIGHTINglEnable( GL_LIGHT0glEnable( GL_LIGHT);p=gluNewQuadric();gluQuadricDrawStyle(p, GLU_FILL);/计算贴图数组for (i=0;i4;i+)for (j=0;j4;j+)t=0;if (i2 &j=2 &j=2)t=255;imageij0=(GLubyte)t;imageij1=(GLubyte)t;imageij2=(GLubyte)

30、t;/贴图参数设置glEnable( GL TEXTUREDglTexlmage2D(GL_TEXTURE_2D GL_RGB,4,0, GL_RG,BGL_UNSIGNED_BYTEage);glTexParameterf(GL_TEXTURE_2DL_TEXTURE_WRAP3S_REPE/)TglTexParameterf( GL_TEXTURE_2GL_TEXTURE_WRAP_L_REPEATglTexParameterf( GL_TEXTURE_2GL_TEXTURE_MAG_FILTGR_NEARE$TglTexParameterf( GL_TEXTURE_2GL_TEXTURE

31、_MIN_FILTJERL_NEARE$T/ 可以给绘制每个图元时用 glTexEnvf(GL_TEXTURE_2D,GL_TEXTURE_ENV_M0DE,GL_M0DULATE);/设置相应的纹理环境,这里使用默认的纹理环境:调制glLightModelfv( GL_LIGHT_MODEL_AMBIENbal_ambie nt);/创建菜单glutCreateMe nu(mai nmen u);glutAddMenuEntry(关闭点光源,1);glutAddMenuEntry(开启点光源,2);glutAddMenuEntry(关闭聚光灯,3);glutAddMenuEntry(开启聚光

32、灯,4);glutAddMenuEntry(复位,5);glutAttachMenu( GLUT_RIGHT_BUTTONvoid main( int argc, char * argv)glutInit(&argc, argv);glutI ni tDisplayMode(GLUT_DOUBLGLUT_RGBGLUT_DEPT;HglutI nitWin dowSize(500,500);glutI nitWin dowPositio n(100,100);glutCreateWindow( 201206007 );glutDisplayFu nc(display);glutMouseFu

33、nc (mouse);glutMotio nFun c(Motio n);glutKeyboardFu nc(mykey);in it();glutMai nLoop();2. 结果:初始效果图移动点光源移动聚光灯只开聚光灯只开点光源关闭所有光源菜单展示按a增加材质球的ambient环境光参数复原,按d增加材质球的diffuse漫反射参数按w增加材质球的辉度参数(镜面反射集中)仅使用环境光,按 a设置环境光参数后,球有明显变化仅使用环境光,按 d设置漫反射参数后,球没有明显变化3. 分析:完成了要求;可以看出聚光灯只在锥形区域发射光线;ambient和diffuse 的改变对物体的颜色反应有明

34、显作用;specular对镜面反射有作用;shiness对物体光泽度调整有作用;只有环境光时diffuse对物体颜色没有作用;(二)绘制一个具有地板反光效果的房间1.代码:#inelude #include #defi ne W500#defi ne H 500/材质结构typedef struct matattr GLfloat ambient4;|GLfloat diffuse4;GLfloat specular4; |GLfloat shininess; matattr ;/材质参数设置matattr ball=020.3,0.3,1.0,0.3,0.3,0.85,1.0,0.5,0.5

35、,0.81,1.0,50.0;matattr cone=0.3,0.0,0.0,1.0,0.6,0.0,0.0,1.0,0.8,0.6,0.6,1.0,50.0;matattr wall=0.2,0.5,0.5,1.0,0.2,0.5,0.5,1.0,0.9,0.9,0.9,1.0,100.0;matattr ceiling=0.5,0.5,0.7,1.0,0.5,0.5,0.9,1.0,0.9,0.9,0.9,1.0,100.0;matattr grou nd=1.0,1.0,1.0,0.5,/ 半透明1.0,1.0,1.0,0.5,1.0,1.0,1.0,0.5,50.0;GLUquadr

36、ic *p;/0光照属性GLfloat position0=-2.0,3.0,8.0,1.0;GLfloat position1=-2.0,3.0,-8.0,1.0;GLfloat ambient0=0.1,0.1,0.1,1.0;GLfloat diffuse0=1.0,1.0,0.8,1.0;GLfloat specular0=1.0,1.0,1.0,1.0;/法向GLfloatno rmals3=1.0,0.0,0.0,0.0,1.0,0.0,0.0,-1.0,0.0,0.0,-1.0,0.0,0.0,0.0,-1.0,0.0,0.0,1.0;/=/=/赋材质函数void evmat(

37、matattr * mat)glMaterialfv(GL_FRONT_AND_BAGK_AMBIENThat-ambie nt);glMaterialfv( GL_FRONT_AND_BAGK_DIFFUSEmat-diffuse); glMaterialfv( GL_FRONT_AND_BAGK_SPECULAmat-specular); glMaterialf(GL_FRONT_AND_BAGK_SHININES,Smat-shi nin ess);/创建房间void CreateWall()evmat(&wall);glNormal3fv( normals0);glBegin( GL_

38、POLYGQN/ 前面glVertex3f(-5.0,-5.0,0.0);glVertex3f(-5.0,5.0,0.0);glVertex3f(-5.0,5.0,10.0);glVertex3f(-5.0,-5.0,10.0);glE nd();glNormal3fv( normals1);glBegin( GL_POLYGQN/ 左边glVertex3f(5.0,-5.0,0.0);glVertex3f(5.0,-5.0,10.0);glVertex3f(-5.0,-5.0,10.0);glVertex3f(-5.0,-5.0,0.0);glE nd();glNormal3fv( norm

39、als2);glBegin( GL POLYGON/ 右边glVertex3f(5.0,5.0,0.0);glVertex3f(-5.0,5.0,0.0);glVertex3f(-5.0,5.0,10.0);glVertex3f(5.0,5.0,10.0);glE nd();glNormal3fv( normals3);glBegin( GL_POLYGON/ 后面glVertex3f(5.0,-5.0,0.0);glVertex3f(5.0,5.0,0.0); glVertex3f(5.0,5.0,10.0); glVertex3f(5.0,-5.0,10.0); glE nd();void

40、 CreateCeiling()evmat (&ceili ng); glNormal3fv( normals4); glBegin( GL_POLYGON glVertex3f(-5.0,-5.0,10.0); glVertex3f(5.0,-5.0,10.0); glVertex3f(5.0,5.0,10.0); glVertex3f(-5.0,5.0,10.0); glE nd();void CreateGround()evmat (&grou nd); glNormal3fv( normals5); glBegin( GL_POLYGON glVertex3f(-5.0,-5.0,0.

41、0); glVertex3f(5.0,-5.0,0.0); glVertex3f(5.0,5.0,0.0); glVertex3f(-5.0,5.0,0.0); glE nd();void CreateFurnishings()evmat (&con e); glPushMatrix();glTra nslatef(-4.0,-2.0,0.0); glutSolidC on e(1.0,2.0,80,50); evmat(&ball);glTra nslatef(1.0,2.0,1.0); gluSphere(p,1.0,80,50); glPopMatrix();void CreateWor

42、ld()CreateWall();CreateCeili ng();CreateFur ni shi ngs();void RenderScene()glPushMatrix();glLightfv(GL_LIGHT0 GL_POSITION position1);/光源镜像移动到地板下,以照射这个“镜像”场景|glPushMatrix();glScalef(1.0f, 1.0f, -1.0f);CreateWorld();glPopMatrix();/由于最后绘制的是在正常光照下地板的反光效果,所以应先恢复光照,地板采取正常法向glLightfv(GL_LIGHT0 GL_POSITIONpositionO);/绘制一个半透明的地板glE nable( GL_BLEN)DglBle ndFu nc( GL_SRC_ALPHAGL_ONE_MINUS_SRC_ALPHAglDepthMask( GL_FALSE /关闭深度缓存写,保证混合效果CreateGrou nd();glDepthMask( GL_TRU)E / 恢复深度缓存写glDisable( GL_BLENDCreateWorld(); glPopMatrix();void display()glClear( GL_COLOR_BUFFERBG:_DEPTH_BUFFER_BIT

温馨提示

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

最新文档

评论

0/150

提交评论