1、OpenGL室内三维环境北邮计算机图形学作业 计算机图形学第二次作业 姓 名: 学号: 学 院: 任课教师: 一 设计要求试设计一个室内三维环境,并利用OPEN GL展示它的三维效果。要求:(1) 包含基本的实体元素:球,多面体,椎体,柱体,曲面等;(2) 有全局光照和纹理功能(3) 程序具有交互功能二交互说明键盘的4个按键:上键:视角上移下键:视角下移左键:视角左移右键:视角右移三 效果展示四 程序代码#include #include #include #include #include #pragma comment (lib, )#define checkImageWidth 64#d
2、efine checkImageHeight 64static GLubyte checkImagecheckImageHeightcheckImageWidth4;static GLuint texName;static GLfloat xrot=0;static GLfloat yrot=0;/函数功能:绘制地面纹理图案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)*
3、255; checkImageij0 = (GLubyte) c; checkImageij1 = (GLubyte) c; checkImageij2 = (GLubyte) c; checkImageij3 = (GLubyte) 255; /函数功能:初始化void SetupRC(void) glEnable(GL_LIGHTING); /启用灯源 glEnable(GL_LIGHT0); /启用0号灯 glShadeModel(GL_SMOOTH); /设置光滑着色模式 glEnable(GL_DEPTH_TEST); /启用深度测试 glEnable(GL_NORMALIZE);
4、/启用法向量 glClearColor, , , ; /为色彩缓冲区指定用于清除的值 /设置表面材料的属性 GLfloat mat_ambient = ,; GLfloat mat_diffuse = ,; GLfloat mat_specular = ,; GLfloat mat_shininess = ; glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); /指定环境泛光的强度 glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); /漫反射的强度 glMaterialfv(GL_FRONT, GL_S
5、PECULAR, mat_specular); /镜面反射的强度 glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); /镜面反射光的会聚强度 /纹理 makeCheckImage(); /绘制地面纹理图案 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); /控制像素存储模式 glGenTextures(1, &texName); /用来生成纹理的数量为1 glBindTexture(GL_TEXTURE_2D, texName); /绑定纹理 /纹理滤波,图象从纹理图象空间映射到帧缓冲图象空间 glTexPara
6、meteri(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_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageW
7、idth, checkImageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);/函数功能:绘制墙壁void DrawWall(void) glPushMatrix(); /矩阵堆栈压入 glTranslated, , ; /将变换矩阵与当前矩阵相乘,使原点移动到(参数值坐标) glScaled, , ; /将比例矩阵与当前矩阵相乘,将当前图形沿x,y,z轴分别放大为原来的(参数值)倍 glutSolidCube; /size=的实心立方体 glPopMatrix(); /矩阵堆栈弹出/函数功能:绘制立方柱体void DrawPillar(v
8、oid) glPushMatrix(); glTranslated(0, , 0); glScaled, , ; glutSolidCube; glPopMatrix();/函数功能:绘制桌子void DrawTable(void) glPushMatrix(); glTranslated, , ; glScaled, , ; glutSolidCube; /绘制桌面 glPopMatrix(); glPushMatrix(); glTranslated, 0, ; DrawPillar(); /绘制桌腿 glTranslated(0, 0, ; DrawPillar(); /绘制桌腿 glT
9、ranslated, 0, ; DrawPillar(); /绘制桌腿 glTranslated(0, 0, ; DrawPillar(); /绘制桌腿 glPopMatrix();/函数功能:绘图void RenderScene(void) GLfloat light_position=, , , ; glLightfv(GL_LIGHT0,GL_POSITION,light_position); /指定0号光源的位置 glMatrixMode(GL_PROJECTION); /对投影矩阵应用随后的矩阵操作 glLoadIdentity(); /将当前的用户坐标系的原点移到了屏幕中心 GLf
10、loat h = ; /窗口的一半高度 glOrtho(-h*64/, h*64/, -h, h, , ; /将当前的可视空间设置为正投影空间:左,右,下,上,近,远。 glMatrixMode(GL_MODELVIEW); /对模型视景矩阵堆栈应用随后的矩阵操作 glLoadIdentity(); gluLookAt(2, , 2, 0, , 0, 0, 1, 0); /设置观察坐标系 /开始绘制 glRotatef(xrot, , , ; /旋转轴经过原点,方向为(1,0,0),旋转角度为xrot,方向满足右手定则 glRotatef(yrot, , , ; /旋转轴经过原点,方向为(0,
11、1,0),旋转角度为yrot glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glRotated, , , ; DrawWall(); /绘制一面墙壁 glPopMatrix(); glPushMatrix(); glRotated, , , ; DrawWall(); /绘制另一面墙壁 glPopMatrix(); glPushMatrix(); glTranslated, 0, ; DrawTable(); /绘制桌子 glPopMatrix(); glPushMatrix(); glTranslate
12、d, , ; glScaled, , ; glutSolidCube; /绘制箱子 glPopMatrix(); glPushMatrix(); glTranslated, , ; glRotated(-100, 0, 1, 0); glutSolidTeapot; /绘制茶壶 glPopMatrix(); glPushMatrix(); glTranslated, , ; glRotated(180, 0, 180, 180); glutSolidTorus, , 25, 50);/绘制手镯 【丝状花环】 glPopMatrix(); glPushMatrix(); glTranslated
13、, , ; glutSolidSphere, 15, 50); /绘制球体 glPopMatrix(); glPushMatrix(); glTranslated, , ; glScaled, , ; glutSolidCube; /绘制灯柱 glPopMatrix(); glPushMatrix(); glTranslated, , ; glRotated(190, 180, 200, 270); glutSolidCone, , 30, 25); /绘制圆锥型灯罩 glPopMatrix(); /绘制纹理 glEnable(GL_TEXTURE_2D); /开启纹理 glTexEnvf(G
14、L_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);/映射方式 glBegin(GL_QUADS); /绘制地面 /绘制四边形并给出当前顶点所对应的纹理坐标 glTexCoord2f, ; glVertex3f, , ; glTexCoord2f, ; glVertex3f, , ; glTexCoord2f, ; glVertex3f, , ; glTexCoord2f, ; glVertex3f, , ; glEnd(); glDisable(GL_TEXTURE_2D); /关闭纹理 glFlush(); /绘图结果显示到屏幕上/函数功能:处理按键
15、交互信息void SpecialKeys(int key, int x, int y) switch (key) case GLUT_KEY_UP: /上键 xrot += ; break; case GLUT_KEY_DOWN: /下键 xrot -= ; break; case GLUT_KEY_LEFT: /左键 yrot += ; break; case GLUT_KEY_RIGHT: /右键 yrot -= ; break; default: break; glutPostRedisplay(); /标记当前窗口需要重新绘制 glFlush(); /绘图结果显示到屏幕上/函数功能:改
16、变窗口大小void ChangeSize(int w, int h) GLfloat lightPos = , , , ; GLfloat nRange = ; if (h = 0) 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); els
17、e glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange); 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框架开始运行, 处理交互事件
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1