收藏 分享(赏)

电子科大实验3-三维图形程序设计.doc

上传人:cjc2202537 文档编号:375112 上传时间:2018-04-02 格式:DOC 页数:33 大小:831KB
下载 相关 举报
电子科大实验3-三维图形程序设计.doc_第1页
第1页 / 共33页
电子科大实验3-三维图形程序设计.doc_第2页
第2页 / 共33页
电子科大实验3-三维图形程序设计.doc_第3页
第3页 / 共33页
电子科大实验3-三维图形程序设计.doc_第4页
第4页 / 共33页
电子科大实验3-三维图形程序设计.doc_第5页
第5页 / 共33页
点击查看更多>>
资源描述

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

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

3、 一个是聚光灯;c) 为光源创建代理几何体(Proxy) ,可以通过鼠标拖动光源代理来交互式的移动光源;2、绘制场景void DrawWorld(void)a. 绘制四面墙壁 void DrawWall()b. 绘制屋顶 void DrawCeiling()c. 绘制地板 void DrawGround()d. 绘制屋内物品 void DrawFurnishings()e. 绘制光源代理 voidDrawLightProxy()其它要求:1、可交互式移动光源;2、可用右键菜单交互式的开启或关闭场景光照;3、可利用键盘快捷键调整球的材质属性,如辉度系数(GL_SHININESS)等。分析材质是如

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

5、Lightfv(GL_LIGHT0, GL_POSITION, fLightPosMirror);glPushMatrix();/场景被镜像,同时交换正反面glFrontFace(GL_CW);glScalef(1.0f, -1.0f, 1.0f);DrawWorldExGround();glFrontFace(GL_CCW);glPopMatrix();/ 在镜像场景上绘制一个半透明的地板glDisable(GL_LIGHTING);glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);DrawGround(

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

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

8、uct matattrGLfloat ambient4;GLfloat diffuse4;GLfloat specular4;GLfloat shininess;matattr;/各种材质数据设置matattr ball=0.2,0.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=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;m

9、atattr 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,0.2,1.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 diffuse0

10、=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;/法向量GLfloat normals3=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_BACK,GL_AMBIENT,mat-ambient);glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat-diffuse);glMaterialfv(GL_FRONT_AND_BACK,G

12、L_SPECULAR,mat-specular);glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,mat-shininess);/创建房间void CreateWall()evmat(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);glEnd();glNormal3fv(normals1);glBegin(GL

13、_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);glEnd();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);glEnd();glNormal3fv(normals3);

14、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);glEnd();void CreateCeiling()evmat(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.

15、0);glEnd();void CreateGround()evmat(glNormal3fv(normals5);glBegin(GL_POLYGON);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);glVertex3f(-5.0,5.0,0.0);glEnd();void CreateFurnishings

16、()evmat(glPushMatrix();glTranslatef(-4.0,-2.0,0.0);glutSolidCone(1.0,2.0,80,50);evmat(glTranslatef(1.0,2.0,1.0);gluSphere(p,1.0,80,50);glPopMatrix();void CreateLightAndProxy(GLenum mode)glLightfv(GL_LIGHT0,GL_POSITION,position0);glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse0);glLightfv(GL_LIGHT0,GL_SPECULA

17、R,specular0);glLightfv(GL_LIGHT0,GL_AMBIENT,ambient0);glLightfv(GL_LIGHT1,GL_POSITION,position1);glLightfv(GL_LIGHT1,GL_DIFFUSE,diffuse1);glLightfv(GL_LIGHT1,GL_SPECULAR,specular1);glLightfv(GL_LIGHT1,GL_AMBIENT,ambient1);glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION,direction1);glLightf(GL_LIGHT1,GL_SPOT_C

18、UTOFF,30);glLightf(GL_LIGHT1,GL_SPOT_EXPONENT,1.0);evmat(if(mode = GL_SELECT) glLoadName(1);/1是矩形,点光源glPushMatrix();glTranslatef(position00,position01,position02);glBegin(GL_POLYGON);glVertex3f(0,-0.25,-0.25);glVertex3f(0,-0.25,0.25);glVertex3f(0,0.25,0.25);glVertex3f(0,0.25,-0.25);glEnd();glPopMatr

19、ix();if(mode = GL_SELECT) glLoadName(2);/2是三角形,聚光灯glPushMatrix();glTranslatef(position10,position11,position12);glBegin(GL_TRIANGLES);glVertex3f(0,-0.25,-0.25);glVertex3f(0,0.0,0.5);glVertex3f(0,0.25,-0.25);glEnd();glPopMatrix();void CreateWorld()CreateLightAndProxy(GL_RENDER);CreateWall();CreateCei

20、ling();CreateGround();CreateFurnishings();/主display函数void display()glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(80.0,1.0,1.0,100.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(4.5,0.0,5.0, 0.0,0.0,5.0, 0.0,0.0,1.0);CreateWorld();

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 教育学

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报