1、计算机图形学第二次作业
姓 名:
学 号:
学 院:
任课教师:
一. 设计要求
试设计一个室内三维环境,并利用OPEN GL展示它得三维效果。要求:
(1) 包含基本得实体元素:球,多面体,椎体,柱体,曲面等;
(2) 有全局光照与纹理功能
(3) 程序具有交互功能
二.交互说明
键盘得4个按键:
上键:视角上移
下键:视角下移
左键:视角左移
右键:视角右移
三. 效果展示
四. 程序代码
#include
2、stdio、h>
#include "glew、h"
#include "glut、h"
#include
3、/函数功能:绘制地面纹理图案 void makeCheckImage(void) { int i, j, c; for (i = 0; i < checkImageHeight; i++) { for (j = 0; j < checkImageWidth; j++) { c = ((((i&0x16)==0)^((j&0x16))==0))*255; checkImage[i][j][0] = (GLubyte) c; checkImage[i][j][1] = (GLubyte) c; checkImage[i][j][2] = (GLub
4、yte) c; checkImage[i][j][3] = (GLubyte) 255; } } } //函数功能:初始化 void SetupRC(void) { glEnable(GL_LIGHTING); //启用灯源 glEnable(GL_LIGHT0); //启用0号灯 glShadeModel(GL_SMOOTH); //设置光滑着色模式 glEnable(GL_DEPTH_TEST); //启用深度测试 glEnable(GL_NORMALIZE); //启用法向量 glClearColor(1、0f, 1、0f,
5、1、0f, 0、0f); //为色彩缓冲区指定用于清除得值 //设置表面材料得属性 GLfloat mat_ambient[] = {0、6f,0、6f,0、6f,1、0f}; GLfloat mat_diffuse[] = {0、5f,0、5f,0、5f,1、0f}; GLfloat mat_specular[] = {1、0f,1、0f,1、0f,1、0f,}; GLfloat mat_shininess[] = {40、0f}; glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); //指定环境泛光得强度
6、 glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); //漫反射得强度 glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); //镜面反射得强度 glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); //镜面反射光得会聚强度 //纹理 makeCheckImage; //绘制地面纹理图案 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); //控制像素存储模式 glGenTextures
7、1, &texName); //用来生成纹理得数量为1 glBindTexture(GL_TEXTURE_2D, texName); //绑定纹理 //纹理滤波,图象从纹理图象空间映射到帧缓冲图象空间 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAR
8、EST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth, checkImageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage); } //函数功能:绘制墙壁 void DrawWall(void) { glPushMatrix; //矩阵堆栈压入 glTranslated(1、2, 0、
9、01, 1、2); //将变换矩阵与当前矩阵相乘,使原点移动到(参数值坐标) glScaled(2、4, 0、02, 2、4); //将比例矩阵与当前矩阵相乘,将当前图形沿x,y,z轴分别放大为原来得(参数值)倍 glutSolidCube(1、0); //size=1、0得实心立方体 glPopMatrix; //矩阵堆栈弹出 } //函数功能:绘制立方柱体 void DrawPillar(void) { glPushMatrix; glTranslated(0, 0、15, 0); glSc
10、aled(0、02, 0、3, 0、02); glutSolidCube(1、0); glPopMatrix; } //函数功能:绘制桌子 void DrawTable(void) { glPushMatrix; glTranslated(0、05, 0、3, 0、05); glScaled(0、6, 0、02, 0、6); glutSolidCube(1、0); //绘制桌面 glPopMatrix; glPushMatrix; glTranslated(0、275, 0, 0、275); DrawPillar; //绘制桌腿 gl
11、Translated(0, 0, 0、45); DrawPillar; //绘制桌腿 glTranslated(0、45, 0, 0、45); DrawPillar; //绘制桌腿 glTranslated(0, 0, 0、45); DrawPillar; //绘制桌腿 glPopMatrix; } //函数功能:绘图 void RenderScene(void) { GLfloat light_position[]={2、0f, 6、0f, 3、0f, 0、0f}; glLightfv(GL_LIGHT0,GL_POSITION,light
12、position); //指定0号光源得位置 glMatrixMode(GL_PROJECTION); //对投影矩阵应用随后得矩阵操作 glLoadIdentity; //将当前得用户坐标系得原点移到了屏幕中心 GLfloat h = 1、0; //窗口得一半高度 glOrtho(h*64/48、0, h*64/48、0, h, h, 0、1, 100、0); //将当前得可视空间设置为正投影空间:左,右,下,上,近,远。
13、 glMatrixMode(GL_MODELVIEW); //对模型视景矩阵堆栈应用随后得矩阵操作 glLoadIdentity; gluLookAt(2, 1、6, 2, 0, 0、2, 0, 0, 1, 0); //设置观察坐标系 //开始绘制 glRotatef(xrot, 1、0f, 0、0f, 0、0f); //旋转轴经过原点,方向为(1,0,0),旋转角度为xrot,方向满足右手定则 glRotatef(yrot, 0、0f, 1、0f, 0、0f); //旋转轴经过原
14、点,方向为(0,1,0),旋转角度为yrot glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix; glRotated(90、0, 0、0, 0、0, 1、0); DrawWall; //绘制一面墙壁 glPopMatrix; glPushMatrix; glRotated(90、0, 1、0, 0、0, 0、0); DrawWall; //绘制另一面墙壁 glPopMatrix; glPushMatrix; glTranslated(0、4, 0,
15、 0、4); DrawTable; //绘制桌子 glPopMatrix; glPushMatrix; glTranslated(0、2, 0、1, 0、85); glScaled(0、8, 0、8, 1、0); glutSolidCube(0、2); //绘制箱子 glPopMatrix; glPushMatrix; glTranslated(0、6, 0、38, 0、6); glRotated(100, 0, 1, 0); glutSolidTeapot(0、1); //绘制茶壶 glPopMatrix; glPushMatrix
16、 glTranslated(0、3, 0、33, 0、5); glRotated(180, 0, 180, 180); glutSolidTorus(0、02f, 0、05, 25, 50);//绘制手镯 【丝状花环】 glPopMatrix; glPushMatrix; glTranslated(0、45, 0、42, 0、3); glutSolidSphere(0、1, 15, 50); //绘制球体 glPopMatrix; glPushMatrix; glTranslated(1、0, 0、35, 0、3); glScaled(0、03
17、 0、7, 0、03); glutSolidCube(1、0); //绘制灯柱 glPopMatrix; glPushMatrix; glTranslated(1、0, 0、7, 0、3); glRotated(190, 180, 200, 270); glutSolidCone(0、15, 0、25f, 30, 25); //绘制圆锥型灯罩 glPopMatrix; //绘制纹理 glEnable(GL_TEXTURE_2D); //开启纹理 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
18、GL_DECAL);//映射方式 glBegin(GL_QUADS); //绘制地面 //绘制四边形并给出当前顶点所对应得纹理坐标 glTexCoord2f(0、0, 0、0); glVertex3f(0、0, 0、0, 0、0); glTexCoord2f(0、0, 1、0); glVertex3f(0、0, 0、0, 2、4); glTexCoord2f(1、0, 1、0); glVertex3f(2、4, 0、0, 2、4); glTexCoord2f(1、0, 0、0); glVertex3f(2、4, 0、0, 0、0); glEnd; glDi
19、sable(GL_TEXTURE_2D); //关闭纹理 glFlush; //绘图结果显示到屏幕上 } //函数功能:处理按键交互信息 void SpecialKeys(int key, int x, int y) { switch (key) { case GLUT_KEY_UP: //上键 xrot += 1、0; break; case GLUT_KEY_DOWN: //下键 xrot = 1、0; break; case GLUT_KEY_LEFT: //左键 yrot += 1、0;
20、 break; case GLUT_KEY_RIGHT: //右键 yrot = 1、0; break; default: break; } glutPostRedisplay; //标记当前窗口需要重新绘制 glFlush; //绘图结果显示到屏幕上 } //函数功能:改变窗口大小 void ChangeSize(int w, int h) { GLfloat lightPos[] = {50、f, 50、0f, 100、0f, 1、0f}; GLfloat nRange = 1、9f; if (h == 0)
21、 h = 1; glViewport(0, 0, w, h); //重新设置屏幕上得窗口大小 glMatrixMode(GL_PROJECTION);//后继操作都在投影变换范围内 glLoadIdentity; //设置当前矩阵为单位矩阵 //正交投影 if (w <= h) glOrtho (nRange, nRange, nRange*h/w, nRange*h/w, nRange, nRange); else glOrtho (nRange*w/h, nRange*w/h, nRange, nRange, nRange, nRange
22、); glMatrixMode(GL_MODELVIEW); //选择模型观察矩阵 glLoadIdentity; //设置当前矩阵为单位矩阵 glLightfv(GL_LIGHT0, GL_POSITION, lightPos);//重新定义光源 } void main { glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); //双缓存 glutInitWindowSize(600, 400); //窗口大小 glutInitWindowPosition(300, 100); //窗口位置 glutCreateWindow("xdy room"); //创建窗口,名为xdy room SetupRC; //自定义得初始化函数 glutDisplayFunc(RenderScene); //显示回调函数,用于绘图 glutReshapeFunc(ChangeSize); //处理改变窗口大小 glutSpecialFunc(SpecialKeys); //处理按键交互信息 glutMainLoop; //让GLUT框架开始运行, 处理交互事件 }
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818