ImageVerifierCode 换一换
格式:DOCX , 页数:10 ,大小:33.02KB ,
资源ID:8230053      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8230053.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(3D游戏图形学实验四.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

3D游戏图形学实验四.docx

1、3D游戏图形学实验四3D游戏图形学实验指导书指导老师:马文娟姓名:学号:浙江理工大学2013年 12月实验四 纹理映射实验实验项目性质:设计性实验所属课程名称:3D游戏图形学实验计划学时:3学时一、 实验目的和要求了解简单光照明模型的基本原理,利用VC+ OpenGL实现物体的光照和材质处理。二、 实验原理1. 光照模型当光照射到一个物体表面上时,会出现三种情形。首先,光可以通过物体表面向空间反射,产生反射光;其次,对于透明物体,光可以穿透该物体并从另一端射出,产生透射光;最后,部分光被物体表面吸收而转换成热。在上述三部分光中,仅仅是透射光和反射光能够进入人眼产生视觉效果。此外,物体本身还有可

2、能发光,比如发光的灯泡。这里我们暂时不考虑透明物体,这样场景中可能存在以下几种类型的光,即环境光、散射光、镜面光和辐射光。1)环境光(Ambient Light)环境光有光源,但是由于被周围的环境,如地面、天空、墙壁等多次反射,变得无法确定其方向。环境光均匀地从周围环境入射至景物表面并等量地向各个方向反射出去。一般说来,房间里的环境光成分要多些,户外的相反要少得多,因为大部分光按相同的方向照射,而在户外很少有其他物体反射的光。2)漫射光(Diffuse Light)漫射光来自某个方向,它垂直于物体时比倾斜时更明亮。一旦它照射到物体上,则在各个方向上均匀地发散出去。于是,无论视点在哪里它都一样亮

3、。来自特定位置和特定方向的任何光,都可能有散射成分。3)镜面光(Specular Light)镜面光也具有方向性,但被物体强烈地反射到另一个特定的方向。如一个点光源照射一个金属球时会在球面上形成一块特别亮的区域,呈现所谓“高光(Highlight)”,它是光源在金属球面上产生的镜面反射光。对于较光滑物体,其镜面反射光的高光区域小而亮;相反,粗糙表面的镜面反射光呈发散状态,其高光区域大而不亮。4)辐射光辐射光是最简单的一种光,它直接从物体发出并且不受任何光源影响。在OpenGL 中,任何一种光源都由三种光照成分组成:环境光、散射光和镜面光,当然光源本身还有可能发出辐射光。由于我们知道光是一种波,

4、而颜色仅仅是我们可以看见的一种光波,所以每种光照成分都是由RGBA 值定义的。2. 材质属性当我们使用光照来描述多边形,总是说它由具有某些反射属性的材质组成,而不说它具有特殊的颜色。这样我们指定物体的颜色,就必须指定物体材质对环境光、漫射光和镜面光源的反射属性。通常,我们用材质对光的红、绿、蓝三原色的反射率来近似定义材质属性。象光源一样,材质颜色也分成环境、漫反射和镜面反射成分,它们决定了材质对环境光、漫反射光和镜面反射光的反射程度。在进行光照计算时,物体的最终颜色是由其材质属性的RGB 值 和光照属性的RGB 值共同决定的。例如,如果当前的环境光源的RGB 值为(0.5,1.0,0.5),而

5、物体的材质的环境反射成分的RGB 值为(0.5,0.5,0.5),那么物体最终的颜色为:(0.50.5,1.00.5,0.50.5)=(0.25,0.5,0.25)即将每个环境光源的成分与材质的环境反射率相乘。这样,物体表面的颜色为三项RGB值的叠加:材质对环境光的反射率与环境光结合的RGB 值;材质对漫反射光的反射率与漫反射光结合的RGB 值;材质对镜面光的反射率与镜面反射光结合的RGB 值。注意,当叠加的RGB 中任何一个颜色分量的值大于1.0,那么就用1.0 计算。三、 实验内容1. 利用OpenGL函数实现一个简单的光照模型,显示一个具有灰色光影的球。调整球的材质属性,使其呈现不同的颜

6、色。源代码:#include #include / 初始化z缓冲区,投影矩阵,光源和光照模型void init(void) GLfloat ambient = 0.0, 0.0, 0.0, 1.0 ; GLfloat diffuse = 1.0, 1.0, 1.0, 1.0 ; GLfloat specular = 1.0, 1.0, 1.0, 1.0 ; GLfloat position = 0.0, 3.0, 2.0, 0.0 ; GLfloat lmodel_ambient = 0.4, 0.4, 0.4, 1.0 ; GLfloat local_view = 0.0 ; glClear

7、Color(0.0, 0.1, 0.1, 0.0); glEnable(GL_DEPTH_TEST); glShadeModel(GL_SMOOTH); glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); glLightfv(GL_LIGHT0, GL_POSITION, position); glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); glLightModelfv(GL_LIGHT_MODEL_LOCAL_

8、VIEWER, local_view); /设置光照属性 glEnable(GL_LIGHTING);/开启光照计算 glEnable(GL_LIGHT0); /设置光源GL_LIGHT0void display(void) GLfloat position=0.0,0.0,1.5,1.0; GLfloat no_mat = 0.0, 0.0, 0.0, 1.0 ; GLfloat mat_ambient = 0.7, 0.7, 0.7, 1.0 ; GLfloat mat_ambient_color = 0.8, 0.8, 0.2, 1.0 ; GLfloat mat_diffuse = 0

9、.5, 0.5, 0.5, 1.0 ; GLfloat mat_specular = 1.0, 1.0, 1.0, 1.0 ; GLfloat no_shininess = 0.0 ; GLfloat low_shininess = 5.0 ; GLfloat high_shininess = 100.0 ; GLfloat mat_emission = 0.2, 0.2, 0.2, 0.0; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLightfv(GL_LIGHT0,GL_POSITION,position); glPush

10、Matrix(); glTranslatef (0.0, 0.0, 0.0); glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat); /环境光 glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); /漫反射光 glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat); /镜面光 glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess); /反射 glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);

11、 /自发光 glutSolidSphere(1.0, 16, 16); glPopMatrix(); glFlush();void reshape(int w, int h) glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w = (h * 2) glOrtho (-6.0, 6.0, -3.0*(GLfloat)h*2)/(GLfloat)w, 3.0*(GLfloat)h*2)/(GLfloat)w, -10.0, 10.0); else glOrtho (-6.0*(GLfloat)w/

12、(GLfloat)h*2), 6.0*(GLfloat)w/(GLfloat)h*2), -3.0, 3.0, -10.0, 10.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity();void keyboard(unsigned char key, int x, int y) switch (key) case 27: exit(0); break; int main(int argc, char* argv) glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB |

13、GLUT_DEPTH); glutInitWindowSize (600, 450); glutCreateWindow(argv0); init(); glutReshapeFunc(reshape); glutDisplayFunc(display); glutKeyboardFunc (keyboard); glutMainLoop(); return 0; 运行结果:2. 绘制一个会移动的光源,要求光源用一个球来表示,使其围绕一个三维圆环旋转,呈现在不同位置照射圆环的效果。绘制三维圆环的函数glutSolidTorus(GLdouble innerRadius, GLdouble ou

14、terRadius, GLint nsides, GLint rings);glutWireTorus(GLdouble innerRadius,GLdouble outerRadius, GLint nsides, GLint rings);innerRadius Inner radius of the torus. outerRadius Outer radius of the torus. nsides Number of sides for each radial section. rings Number of radial divisions for the torus.例:glu

15、tSolidTorus (0.275, 0.85, 50, 50);源代码:#include #include void init(void) GLfloat ambient = 0.0, 0.0, 0.0, 1.0 ; GLfloat diffuse = 1.0, 1.0, 1.0, 1.0 ; GLfloat specular = 1.0, 1.0, 1.0, 1.0 ; GLfloat position = 0.0, 3.0, 2.0, 0.0 ; GLfloat lmodel_ambient = 0.4, 0.4, 0.4, 1.0 ; GLfloat local_view = 0.0

16、 ; glClearColor(0.0, 0.1, 0.1, 0.0); glEnable(GL_DEPTH_TEST); glShadeModel(GL_SMOOTH); glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); glLightfv(GL_LIGHT0, GL_POSITION, position); glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); glLightModelfv(GL_LIGHT_MO

17、DEL_LOCAL_VIEWER, local_view); /设置光照属性 glEnable(GL_LIGHTING);/开启光照计算 glEnable(GL_LIGHT0); /设置光源GL_LIGHT0void Initial() glEnable(GL_DEPTH_TEST); / 启用深度测试 glClearColor(0.0f, 0.0f, 0.0f, 1.0f ); /背景为白色void ChangeSize(int w, int h) if(h = 0) h = 1; glViewport(0, 0, w, h); / 设置视区尺寸 glMatrixMode(GL_PROJEC

18、TION); / 指定当前操作投影矩阵堆栈 glLoadIdentity(); / 重置投影矩阵 GLfloat fAspect; fAspect = (float)w/(float)h; / 计算视区的宽高比 gluPerspective(45.0, fAspect, 1.0, 500.0); / 指定透视投影的观察空间 glMatrixMode(GL_MODELVIEW); glLoadIdentity();void Display(void) static float fElect1 = 0.0f; / 绕原子旋转的角度 GLfloat position=0.0,0.0,1.5,1.0;

19、 GLfloat no_mat = 0.0, 0.0, 0.0, 1.0 ; GLfloat mat_ambient = 0.7, 0.7, 0.7, 1.0 ; GLfloat mat_ambient_color = 0.8, 0.8, 0.2, 1.0 ; GLfloat mat_diffuse = 0.1, 0.5, 0.8, 1.0 ; GLfloat mat_specular = 1.0, 1.0, 1.0, 1.0 ; GLfloat no_shininess = 0.0 ; GLfloat low_shininess = 5.0 ; GLfloat high_shininess

20、= 100.0 ; GLfloat mat_emission = 0.3, 0.2, 0.2, 0.0; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /清除颜色和深度缓冲区 glMatrixMode(GL_MODELVIEW); / 指定当前操作模型视图矩阵堆栈 glLoadIdentity(); / 重置模型视图矩阵 glTranslatef(0.0f, 0.0f, -250.0f); /将图形沿z轴负向移动 glLightfv(GL_LIGHT0,GL_POSITION,position);/ 绘制圆环 glPushMatrix(

21、); glTranslatef (-3.75, 3.0, 0.0); glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess); glMaterialfv(GL_FRONT, GL_EMISSION, no_mat); glutSolidTorus (5, 30,

22、50, 50); glPopMatrix(); / 恢复模型视图矩阵 / 画出旋转球 glPushMatrix(); / 保存当前的模型视图矩阵 glRotatef(-45.0f,0.0f, 0.0f, 1.0f); /绕z轴旋转-45 glRotatef(fElect1, 0.0f, 1.0f, 0.0f); glTranslatef(0.0f, 0.0f, 60.0f); glTranslatef (3.75, -3.0, 0.0); glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color); glMaterialfv(GL_FRONT,

23、GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat); glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess); glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission); glutSolidSphere(6.0f, 15, 15); glPopMatrix(); glEnable(GL_LIGHTING);/开启 fElect1 += 10.0f; / 增加旋转步长,产生动画效果 if(fElect1 360.0f) f

24、Elect1 = 10.0f; glutSwapBuffers(); glFlush();void TimerFunc(int value) glutPostRedisplay(); glutTimerFunc(100, TimerFunc, 1);int main(int argc, char* argv) glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutCreateWindow(test2); glutReshapeFunc(ChangeSize); glutDisplayFunc(Display); glutTimerFunc(500, TimerFunc, 1); /指定定时器回调函数 init(); Initial(); glutMainLoop(); return 0;运行结果:

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1