计算机图形学作业二.docx

上传人:b****6 文档编号:6712542 上传时间:2023-01-09 格式:DOCX 页数:8 大小:17.38KB
下载 相关 举报
计算机图形学作业二.docx_第1页
第1页 / 共8页
计算机图形学作业二.docx_第2页
第2页 / 共8页
计算机图形学作业二.docx_第3页
第3页 / 共8页
计算机图形学作业二.docx_第4页
第4页 / 共8页
计算机图形学作业二.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

计算机图形学作业二.docx

《计算机图形学作业二.docx》由会员分享,可在线阅读,更多相关《计算机图形学作业二.docx(8页珍藏版)》请在冰豆网上搜索。

计算机图形学作业二.docx

计算机图形学作业二

程序设计如下

1.实验要求

试设计一个室内三维环境,并利用OPENGL展示它的三维效果。

要求:

(1)包含基本的实体元素:

球,多面体,椎体,柱体,曲面等;

(2)有全局光照和纹理功能

(3)程序具有交互功能

2.程序设计代码

#include

#include

#include"glew.h"

#include"glut.h"

#include

#pragmacomment(lib,"glew32.lib")

#definecheckImageWidth64

#definecheckImageHeight64

staticGLubytecheckImage[checkImageHeight][checkImageWidth][4];

staticGLuinttexName;

staticGLfloatxrot=0;

staticGLfloatyrot=0;

//函数功能:

设计地面图案

voidmakeCheckImage(void)

{

inti,j,c;

for(i=0;i

for(j=0;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]=(GLubyte)c;

checkImage[i][j][3]=(GLubyte)255;

}

}

}

//函数功能:

初始化模块

voidSetupRC(void)

{

glEnable(GL_LIGHTING);//启用灯源

glEnable(GL_LIGHT0);//启用0号灯

glShadeModel(GL_SMOOTH);//设置光滑着色模式

glEnable(GL_DEPTH_TEST);//启用深度测试

glEnable(GL_NORMALIZE);//启用法向量

glClearColor(1.0f,1.0f,1.0f,0.0f);//为色彩缓冲区指定用于清除的值

//设置表面材料的属性

GLfloatmat_ambient[]={0.6f,0.6f,0.6f,1.0f};

GLfloatmat_diffuse[]={0.5f,0.5f,0.5f,1.0f};

GLfloatmat_specular[]={1.0f,1.0f,1.0f,1.0f,};

GLfloatmat_shininess[]={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_ALIGNMENT,1);//控制像素存储模式

glGenTextures(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_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);

}

//函数功能:

绘制墙壁

voidDrawWall(void)

{

glPushMatrix();//矩阵堆栈压入

glTranslated(1.2,0.01,1.2);//将变换矩阵与当前矩阵相乘,使原点移动到(参数值坐标)

glScaled(2.4,0.02,2.4);//将比例矩阵与当前矩阵相乘,将当前图形沿x,y,z轴分别放大为原来的(参数值)倍

glutSolidCube(1.0);//size=1.0的实心立方体

glPopMatrix();//矩阵堆栈弹出

}

//函数功能:

绘制立方柱体

voidDrawPillar(void)

{

glPushMatrix();

glTranslated(0,0.15,0);

glScaled(0.02,0.3,0.02);

glutSolidCube(1.0);

glPopMatrix();

}

//函数功能:

绘制桌子

voidDrawTable(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();//绘制桌腿

glTranslated(0,0,-0.45);

DrawPillar();//绘制桌腿

glTranslated(-0.45,0,0.45);

DrawPillar();//绘制桌腿

glTranslated(0,0,-0.45);

DrawPillar();//绘制桌腿

glPopMatrix();

}

//函数功能:

绘图

voidRenderScene(void)

{

GLfloatlight_position[]={2.0f,6.0f,3.0f,0.0f};

glLightfv(GL_LIGHT0,GL_POSITION,light_position);//指定0号光源的位置

glMatrixMode(GL_PROJECTION);//对投影矩阵应用随后的矩阵操作

glLoadIdentity();//将当前的用户坐标系的原点移到了屏幕中心

GLfloath=1.0;//窗口的一半高度

glOrtho(-h*64/48.0,h*64/48.0,-h,h,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

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();

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();

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,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,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();

glDisable(GL_TEXTURE_2D);//关闭纹理

glFlush();//绘图结果显示到屏幕上

}

//函数功能:

处理按键交互信息

voidSpecialKeys(intkey,intx,inty)

{

switch(key){

caseGLUT_KEY_UP:

//上键

xrot+=1.0;

break;

caseGLUT_KEY_DOWN:

//下键

xrot-=1.0;

break;

caseGLUT_KEY_LEFT:

//左键

yrot+=1.0;

break;

caseGLUT_KEY_RIGHT:

//右键

yrot-=1.0;

break;

default:

break;

}

glutPostRedisplay();//标记当前窗口需要重新绘制

glFlush();//绘图结果显示到屏幕上

}

//函数功能:

改变窗口大小

voidChangeSize(intw,inth)

{

GLfloatlightPos[]={-50.f,50.0f,100.0f,1.0f};

GLfloatnRange=1.9f;

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);

else

glOrtho(-nRange*w/h,nRange*w/h,-nRange,nRange,-nRange,nRange);

glMatrixMode(GL_MODELVIEW);//选择模型观察矩阵

glLoadIdentity();//设置当前矩阵为单位矩阵

glLightfv(GL_LIGHT0,GL_POSITION,lightPos);//重新定义光源

}

voidmain()

{

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);//双缓存

glutInitWindowSize(600,400);//窗口大小

glutInitWindowPosition(300,100);//窗口位置

glutCreateWindow("xdyroom");//创建窗口,名为xdyroom

SetupRC();//自定义的初始化函数

glutDisplayFunc(RenderScene);//显示回调函数,用于绘图

glutReshapeFunc(ChangeSize);//处理改变窗口大小

glutSpecialFunc(SpecialKeys);//处理按键交互信息

glutMainLoop();//让GLUT框架开始运行,处理交互事件

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

当前位置:首页 > 总结汇报

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

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