OpenGL室内三维环境北邮计算机图形学作业_第1页
OpenGL室内三维环境北邮计算机图形学作业_第2页
OpenGL室内三维环境北邮计算机图形学作业_第3页
OpenGL室内三维环境北邮计算机图形学作业_第4页
OpenGL室内三维环境北邮计算机图形学作业_第5页
已阅读5页,还剩5页未读, 继续免费阅读

下载本文档

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

kok电子竞技:文档简介

1、 计算机图形学第二次作业 姓 名: 学号: 学 院: 任课教师: 一 设计要求试设计一个室内三维环境,并利用OPEN GL展示它的三维效果。要求:(1) 包含基本的实体元素:球,多面体,椎体,柱体,曲面等;(2) 有全局光照和纹理功能(3) 程序具有交互功能二交互说明键盘的4个按键:上键:视角上移下键:视角下移左键:视角左移右键:视角右移三 效果展示四 程序代码#include <stdlib.h>#include <stdio.h>#include "glew.h"#include "glut.h"#include <wi

2、ndows.h>#pragma comment (lib, "glew32.lib")#define checkImageWidth 64#define 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 &l

3、t; checkImageHeight; i+) for (j = 0; j < checkImageWidth; j+) c = (i&0x16)=0)(j&0x16)=0)*255;checkImageij0 = (GLubyte) c;checkImageij1 = (GLubyte) c;checkImageij2 = (GLubyte) c;checkImageij3 = (GLubyte) 255;/函数功能:初始化void SetupRC(void)glEnable(GL_LIGHTING);/启用灯源glEnable(GL_LIGHT0);/启用0号灯gl

4、ShadeModel(GL_SMOOTH); /设置光滑着色模式glEnable(GL_DEPTH_TEST);/启用深度测试glEnable(GL_NORMALIZE);/启用法向量glClearColor(1.0f, 1.0f, 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_shini

5、ness = 40.0f;glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);/指定环境泛光的强度 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

6、_ALIGNMENT, 1);/控制像素存储模式glGenTextures(1, &texName);/用来生成纹理的数量为1glBindTexture(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_M

7、AG_FILTER, GL_NEAREST);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.01, 1.2); /将变换矩阵与当前矩阵相乘

8、,使原点移动到(参数值坐标) 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);glScaled(0.02, 0.3, 0.02);glutSolidCube(1.0);glPopMatrix();/函数功能:绘制桌子void DrawTable(void)

9、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();/绘制桌腿glTranslated(0, 0, -0.45);DrawPillar();/绘制桌腿glTranslated(-0.45, 0, 0.45);DrawPillar();/绘制桌腿glTranslated(0, 0, -0.45);DrawPillar()

10、;/绘制桌腿glPopMatrix();/函数功能:绘图void RenderScene(void)GLfloat light_position=2.0f, 6.0f, 3.0f, 0.0f;glLightfv(GL_LIGHT0,GL_POSITION,light_position); /指定0号光源的位置glMatrixMode(GL_PROJECTION); /对投影矩阵应用随后的矩阵操作glLoadIdentity(); /将当前的用户坐标系的原点移到了屏幕中心 GLfloat h = 1.0; /窗口的一半高度glOrtho(-h*64/48.0, h*64/48.0, -h, h,

11、 0.1, 100.0); /将当前的可视空间设置为正投影空间:左,右,下,上,近,远。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); /旋转轴经过原点,方向为(0,1,0),旋转角度为yrot

12、 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, 0.4);DrawTable();/绘制桌子glPopMatrix();glPushMatrix();gl

13、Translated(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();glTranslated(0.3, 0.33, 0.5);glRotated(180, 0, 180, 180);glutSolidTorus(0.02f, 0.05, 25

14、, 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, 0.7, 0.03);glutSolidCube(1.0);/绘制灯柱glPopMatrix();glPushMatrix();glTranslated(1.0, 0.7, 0.3);glRotated(190, 180, 200,

15、 270);glutSolidCone(0.15, 0.25f, 30, 25);/绘制圆锥型灯罩glPopMatrix();/绘制纹理glEnable(GL_TEXTURE_2D);/开启纹理glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, 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.

16、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();glDisable(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;

17、break;case GLUT_KEY_LEFT:/左键yrot += 1.0;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)h = 1;glViewport(0, 0, w,

18、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);glMatrixMode(GL_MODELVIEW);/选择模型观察矩阵glLoadIdentity()

19、;/设置当前矩阵为单位矩阵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 roomSetupRC();/自定义的初始化函数glutDisplayFunc(RenderScene);/显示回调函数,用于绘图glutReshapeFunc(ChangeSize);/处理改变窗口大小glutSpecialFunc(SpecialKeys);/处理按键交互信息glutMainLoop();/让GLUT框架开始运行, 处理交互事件

温馨提示

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

评论

0/150

提交评论