实验七 光照和材质_第1页
实验七 光照和材质_第2页
实验七 光照和材质_第3页
实验七 光照和材质_第4页
实验七 光照和材质_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

1、实验八 光照和材质一、实验目的1、进一步掌握3D编程概念: 2、了解和掌握三维场景中如何设置光照和材质效果二、实验内容1上机运行以下程序,并修改光照和材质的参数,观察对场景生成的影响。#include <glut.h>void display(void);void reshape(int, int);void lighting(void);int main(int argc, char* argv)glutInit(&argc, argv);glutInitWindowSize(400, 400);glutInitWindowPosition(0, 0);glutInitD

2、isplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);glutCreateWindow("Planet");glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoop();void lighting(void)GLfloat mat_diffuse = 1.0, 0.0, 0.0, 1.0;GLfloat mat_specular = 0.0, 0.0, 1.0, 1.0;GLfloat mat_ambient = 0.0, 1.0, 0.0, 1.0;GLfloa

3、t mat_shininess = 50.0;GLfloat light_specular = 1.0, 1.0, 1.0, 1.0;GLfloat light_diffuse = 1.0, 1.0, 1.0, 1.0;GLfloat light_ambient = 0.0, 0.0, 0.0, 1.0;GLfloat light_position = 5.0, 5.0, 10.0, 0.0;glClearColor(0.0, 0.0, 0.0, 0.0);glShadeModel(GL_SMOOTH);/ z buffer enableglEnable(GL_DEPTH_TEST);/ en

4、able lightingglEnable(GL_LIGHTING);/ set light propertyglEnable(GL_LIGHT0);glLightfv(GL_LIGHT0, GL_POSITION, light_position);glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);/ set material propertyglMate

5、rialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);void display(void)lighting();glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glutSolidSphere(0.8, 128, 12

6、8);glFlush();void reshape(int w, int h) glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity(); glOrtho (-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity();2 3D 旋转世界的光照和材质设置(选作)附属程序rotating torus-with light & material.cpp为一视点保持不变的3

7、D旋转程序,3D场景为一个圆环、一个小球和一个以四边形为基本单位的方块墙包围盒,且小球和圆环在“方块墙”的包围盒中。视点设在正前方观察物体,小球绕着环心某处不停旋转,并和圆环一起绕着环心不停旋转。并且场景实现了光照和材质效果,将程序仔细研读,运行查看光照效果,了解OpenGL光照材质程序代码编写。 图1 带光照和材质效果的3D场景1. 回答下列问题,程序用到几个光源?光源的性质?光源的位置相对于物体位置如何?2. 改变光源参数,如光源的位置、光的三个分量强度、光源的数量等参数,光照效果受到什么影响?3. 改变材质参数,材质分量、材质系数等,光照效果又会受到什么影响?4. 将3D圆环物体替换为一

8、个立方体,一个茶壶或其他3D物体查看效果。1. ) 小球的光照和材质设置附录中Material.cpp程序为场景光照不变,小球的材质不同,小球的显示效果各不相同,运行查看光照效果结果。修改程序,修改小球材质参数,观看效果。改变小球材质的参数,光照效果受到什么影响?记录和保存原始效果图及其参数和各种参数修改后的效果截图和具体光照参数,看能否得出一些结论。 图2 材质小球 图3 光照材质小球另一个程序light sphere.cpp只绘制了一个小球,包括有灯光和材质的设置,也可参考2. ) 光源位置控制程序运行附录程序lightcontrol.cpp, 鼠标单击后,小球(即光源)位置会发生变化,从

9、而光照效果发生变化。了解光照位置对光照效果的影响。 a)位置1 b) 位置2 c) 位置3图4 光照位置控制程序效果三、函数参考1) 光照设置函数void glLightif (GLenum light, GLenum pname,TYPE paramvalue); void glLightifv(GLenum light, GLenum pname,TYPE paramvalue);light: 光源名称,可以是GL_LIGHT0,GL_LIGHT1,GL_LIGHTi ,OpenGL至少支持8种独立光源 pname: 光源属性,如颜色、位置和方向等 paramvalue:pname参数的值

10、 Value namemeaningDefault valueGL_AMBIENT环境光分量强度(0.0,0.0,0.0,1.0)GL_DIFFUSE漫反射光分量强度(1.0,1.0,1.0,1.0)GL_SPECULAR镜面光分量的强度(1.0,1.0,1.0,1.0)GL_POSITION光源的位置(0.0,0.0,1.0,0.0)GL_SPOT_DIRECTION聚光方向(0.0,0.0,-1.0)GL_SPOT_EXPONENT聚光指数0.0GL_SPOT_CUTOFF聚光的截止角180.0GL_CONSTANT_ATTENUATION常数衰减因子1.0GL_LINEAER_ATTEN

11、UATION线性衰减因子0.0GL_QUADRATIC_ATTENUATION二次衰减因子0.02)材质定义函数void glMaterialif (GLenum face,GLenum pname,TYPE param);void glMaterialifv (GLenum face,GLenum pname,TYPE param);指定光照计算中的物体材质属性face :GL_FRONT,GL_BACK,GL_FRONT_AND_BACK例多边形有正反面,每个面都可能有相同或不同的属性param: face的参数,指其漫反射、镜面反射和环境光反射的颜色特性,参数为4维,第4个分量设为1,假

12、定物体为不透明物体pnamedefaultmeaningGL_AMBIENT(0.2,0.2,0.2,1.0)材质的环境光颜色GL_DIFFUSE(0.8,0.8,0.8,1.0)材质的漫反射光颜色GL_AMBIENT_DIFFUSE 材质的环境光和漫反射光颜色GL_SPECULAR(0.0,0.0,0.0,1.0)材质的镜面反射光颜色GL_SHINENESS0.0镜面反射指数GL_EMISSION(0.0,0.0,0.0,1.0)材质的辐射光颜色GL_COLOR_INDEXS(0,1,1)材质的环境光、漫反射光和镜面反射光颜色的索引3)材质颜色相符函数glColorMaterial

13、(GLenum face,GLenum mode); 允许材质的颜色跟踪glColor设置的颜色 face: 指定材质属性的表面,同前。 mode:指哪种材质属性要更新与glColor设置的颜色保持一致,取值: GL_AMBIENT、GL_DIFFUSE、GL_AMBIENT_AND_DIFFUSE、GL_SPECULAR或GL_EMISSION 调用glColorMaterial()之前,还必须启用该功能,例如:glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);glColor3f(0.2,

14、0.5,0.8);drawtriangle();glDisable(GL_COLOR_MATERIAL);四、附属程序1. rotating torus-with light & material.cpp#include <math.h>#include <glut.h>#define PI 3.14159float theta=-90.0; /圆环旋转角float angle=10; /左右场景每次旋转角float sightangle=-90;float s=10; /前后直走步长float R=100; int inner=10,outer=80;floa

15、t eyex=0,eyey=0,eyez=outer+4*inner+50; /初始视点位置float atx=0,aty=0,atz=0; /初始目标点位置float atx1,atz1,eyex1,eyez1;float tt=0,tt2=0;/ void specialkeyboard(int key, int x, int y);void mykeyboard(unsigned char key, int x, int y);void Display(void);void Reshape(int w, int h);void myidle();void drawground();voi

16、d drawsphere();void drawwall();void init();/*/ Light and material DataGLfloat fLightPos4 = -100.0f, 100.0f, 50.0f, 1.0f ; / Point sourceGLfloat fNoLight = 0.0f, 0.0f, 0.0f, 0.0f ;GLfloat fLowLight = 0.25f, 0.25f, 0.25f, 1.0f ;GLfloat fBrightLight = 1.0f, 1.0f, 1.0f, 1.0f ;*/ int main(int argc, char*

17、 argv)glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE |GLUT_RGB|GLUT_DEPTH); glutInitWindowPosition(0,0);glutInitWindowSize(1000,760); /glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);glutCreateWindow("A Rotating Torus");init();glutDisplayFunc(Display); glutKeyboardFunc(mykeyboard);g

18、lutReshapeFunc(Reshape);glutIdleFunc(myidle); glutMainLoop();return 0;void init()glClearColor(1,1,1,1);/define light position1GLfloat light_position1=-outer,outer,outer+4*inner+50,0.0;/GLfloat light_position1=0,0,0,0.0;GLfloat light_position2=+outer,-outer,outer+inner,0.0;/GLfloat light color1GLfloa

19、t light_ambient1=1.0,1.0,1.0,1.0;GLfloat light_diffuse1=1.0,1.0,1.0,1.0;GLfloat light_specular1=1.0,1.0,1.0,1.0;/GLfloat light color2GLfloat light_ambient2=0.8,0.8,0.8,1.0;GLfloat light_diffuse2=0.8,0.8,0.8,1.0;GLfloat light_specular2=0.8,0.8,0.8,1.0; / light model- global lightGLfloat lmodel_ambien

20、t=0.8,0.2,0.2,1.0;glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_TRUE);/ set light source locationglLightfv(GL_LIGHT0,GL_POSITION,light_position1);glLightfv(GL_LIGHT1,GL_POSITION,light_position2);/ set light source color; glLightfv(GL_LIGHT0,GL_A

21、MBIENT,light_ambient1); glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse1);glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular1);/ set light source color; glLightfv(GL_LIGHT1,GL_AMBIENT,light_ambient2); glLightfv(GL_LIGHT1,GL_DIFFUSE,light_diffuse2);glLightfv(GL_LIGHT1,GL_SPECULAR,light_specular2); / set mat

22、erial let material fits color glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);/make light source enable;glEnable(GL_LIGHTING);glEnable(GL_LIGHT0); glEnable(GL_LIGHT1);/clear color/ glClearColor(0.0,0.0,0.0,0.0);/Color shade modeglShadeModel(GL_SMOOTH); / glShadeModel(GL_

23、FLAT); / polygon mode glPolygonMode(GL_FRONT,GL_FILL); GLfloat mat_specular1=1.0,1.0,1.0,1.0;GLfloat mat_shininess1=80.0;glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular1);glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess1); / depth detecting glEnable(GL_DEPTH_TEST);void Display(void) /glClear(GL_COLOR

24、_BUFFER_BIT);glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_MODELVIEW);glLoadIdentity(); gluLookAt(eyex,eyey,eyez,atx,aty,atz,0,1,0); glColor3f(0.0,0.0,1.0);drawwall();glColor3f(1.0,0,0);drawground(); drawsphere();glutSwapBuffers();/glFlush();void drawsphere() float tr;tr=(outer+3*

25、inner);glRotatef(theta,0,1,0); glPushMatrix();glPushMatrix(); glColor3f(1.0,0,0.0); glutSolidTorus(inner,outer,50,80); glPopMatrix(); glPushMatrix(); glTranslatef(outer,0,0);glRotatef(theta,0,1,0);glTranslatef(-outer,0,0);glPushMatrix(); glTranslatef(tr,0,0);glRotatef(-45,1,0,0);glColor3f(0.0,1.0,0)

26、;glutSolidSphere(inner,40,40);glPopMatrix();glPopMatrix(); glPopMatrix();void drawground() int colorflag=1; glNormal3f(0,1,0); for (int i=-outer-4*inner;i<outer+4*inner;i+=2*inner) /* if (colorflag>0) glColor3f(1.0,1.0,0.0);else glColor3f(1.0,1.0,1.0); */colorflag=-colorflag; glColor3f(1.0,1.0

27、,1.0); for (int j=-outer-4*inner;j<outer+4*inner;j+=2*inner) if (colorflag>0) glColor3f(1.0,1.0,0.0);else glColor3f(1.0,1.0,1.0);colorflag=-colorflag; glBegin(GL_QUADS); glVertex3d(j,-outer-4*inner,i); glVertex3d(j,-outer-4*inner,i+2*inner); glVertex3d(j+2*inner,-outer-4*inner,i+2*inner); glVe

28、rtex3d(j+2*inner,-outer-4*inner,i); glEnd(); glNormal3f(0,-1,0); colorflag=1;for (int ii=-outer-4*inner;ii<outer+4*inner;ii+=2*inner) if (colorflag>0) glColor3f(1.0,1.0,0.0);else glColor3f(1.0,1.0,1.0);colorflag=-colorflag; for (int j=-outer-4*inner;j<outer+4*inner;j+=2*inner) if (colorflag

29、>0) glColor3f(1.0,1.0,0.0);else glColor3f(1.0,1.0,1.0);colorflag=-colorflag; glBegin(GL_QUADS); glVertex3d(j,outer+4*inner,ii); glVertex3d(j,outer+4*inner,ii+2*inner); glVertex3d(j+2*inner,outer+4*inner,ii+2*inner); glVertex3d(j+2*inner,outer+4*inner,ii); glEnd(); void drawwall() int i,j; glNorma

30、l3f(1,0,0); int colorflag=1; /left for (i=-outer-4*inner;i<outer+4*inner;i+=2*inner) if (colorflag>0) glColor3f(1.0,1.0,0.0);else glColor3f(1.0,1.0,1.0);colorflag=-colorflag; for (j=-outer-4*inner;j<outer+4*inner;j+=2*inner) if (colorflag>0) glColor3f(1.0,1.0,0.0);else glColor3f(1.0,1.0,

31、1.0);colorflag=-colorflag; glBegin(GL_QUADS); glVertex3d(-outer-4*inner,j,i); glVertex3d(-outer-4*inner,j+2*inner,i); glVertex3d(-outer-4*inner,j+2*inner,i+2*inner); glVertex3d(-outer-4*inner,j,i+2*inner); glEnd(); colorflag=1;glNormal3f(0,-1,0); /right for (i=-outer-4*inner;i<=outer+4*inner-2*in

32、ner;i+=2*inner) /for z if (colorflag>0) glColor3f(1.0,1.0,0.0);else glColor3f(1.0,1.0,1.0);colorflag=-colorflag; for (j=-outer-4*inner;j<=outer+4*inner-2*inner;j+=2*inner) /for y if (colorflag>0) glColor3f(1.0,1.0,0.0);else glColor3f(1.0,1.0,1.0);colorflag=-colorflag; glBegin(GL_QUADS); glV

33、ertex3f(outer+4*inner,j,i); glVertex3f(outer+4*inner,j+2*inner,i); glVertex3f(outer+4*inner,j+2*inner,i+2*inner); glVertex3f(outer+4*inner,j,i+2*inner); glEnd(); colorflag=1; glNormal3f(0,0,1); /front for (i=-outer-4*inner;i<=outer+4*inner-2*inner;i+=2*inner) /for z if (colorflag>0) glColor3f(

34、1.0,1.0,0.0);else glColor3f(1.0,1.0,1.0);colorflag=-colorflag; for (j=-outer-4*inner;j<=outer+4*inner-2*inner;j+=2*inner) /for y if (colorflag>0) glColor3f(1.0,1.0,0.0);else glColor3f(1.0,1.0,1.0);colorflag=-colorflag; glBegin(GL_QUADS); glVertex3f(j,i,-outer-4*inner); glVertex3f(j+2*inner,i,-

35、outer-4*inner); glVertex3f(j+2*inner,i+2*inner,-outer-4*inner); glVertex3f(j,i+2*inner,-outer-4*inner); glEnd(); void myidle()theta+=0.5;/if (theta>=360.0) theta-=360.0; glutPostRedisplay();void Reshape(GLsizei w,GLsizei h)glMatrixMode(GL_PROJECTION);glLoadIdentity();/ glOrtho(-outer-6*inner,oute

36、r+6*inner,-outer-4*inner,outer+4*inner,20,2*outer+8*inner+50); gluPerspective(90,w/h,10,2*outer+8*inner+250);glViewport(0,0,w,h);glMatrixMode(GL_MODELVIEW); void mykeyboard(unsigned char key, int x, int y) switch(key) case 'W': case 'w':/ 向前走 eyex1=eyex-s*sin(sightangle*2*PI/360-PI/2); eyez1=eyez-s*cos(sightangle*2*PI/360-PI/2); atx1=atx-s*sin(sightangle*2*PI/360-PI/2); atz1

温馨提示

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

评论

0/150

提交评论