OpenGL室内三维环境北邮计算机图形学作业Word文件下载.docx
- 文档编号:4347064
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:12
- 大小:98.78KB
OpenGL室内三维环境北邮计算机图形学作业Word文件下载.docx
《OpenGL室内三维环境北邮计算机图形学作业Word文件下载.docx》由会员分享,可在线阅读,更多相关《OpenGL室内三维环境北邮计算机图形学作业Word文件下载.docx(12页珍藏版)》请在冰点文库上搜索。
右键:
视角右移
三.效果展示
四.程序代码
#include<
>
#include"
"
#pragmacomment(lib,"
)
#definecheckImageWidth64
#definecheckImageHeight64
staticGLubytecheckImage[checkImageHeight][checkImageWidth][4];
staticGLuinttexName;
staticGLfloatxrot=0;
staticGLfloatyrot=0;
//函数功能:
绘制地面纹理图案
voidmakeCheckImage(void)
{
inti,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]=(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,,,;
//为色彩缓冲区指定用于清除的值
//设置表面材料的属性
GLfloatmat_ambient[]={,,,};
GLfloatmat_diffuse[]={,,,};
GLfloatmat_specular[]={,,,,};
GLfloatmat_shininess[]={};
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,,;
//将变换矩阵与当前矩阵相乘,使原点移动到(参数值坐标)
glScaled,,;
//将比例矩阵与当前矩阵相乘,将当前图形沿x,y,z轴分别放大为原来的(参数值)倍
glutSolidCube;
//size=的实心立方体
glPopMatrix();
//矩阵堆栈弹出
绘制立方柱体
voidDrawPillar(void)
glTranslated(0,,0);
绘制桌子
voidDrawTable(void)
//绘制桌面
glTranslated,0,;
DrawPillar();
//绘制桌腿
glTranslated(0,0,;
绘图
voidRenderScene(void)
GLfloatlight_position[]={,,,};
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
//指定0号光源的位置
glMatrixMode(GL_PROJECTION);
//对投影矩阵应用随后的矩阵操作
glLoadIdentity();
//将当前的用户坐标系的原点移到了屏幕中心
GLfloath=;
//窗口的一半高度
glOrtho(-h*64/,h*64/,-h,h,,;
//将当前的可视空间设置为正投影空间:
左,右,下,上,近,远。
glMatrixMode(GL_MODELVIEW);
//对模型视景矩阵堆栈应用随后的矩阵操作
gluLookAt(2,,2,0,,0,0,1,0);
//设置观察坐标系
//开始绘制
glRotatef(xrot,,,;
//旋转轴经过原点,方向为(1,0,0),旋转角度为xrot,方向满足右手定则
glRotatef(yrot,,,;
//旋转轴经过原点,方向为(0,1,0),旋转角度为yrot
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glRotated,,,;
DrawWall();
//绘制一面墙壁
//绘制另一面墙壁
DrawTable();
//绘制桌子
//绘制箱子
glRotated(-100,0,1,0);
glutSolidTeapot;
//绘制茶壶
glRotated(180,0,180,180);
glutSolidTorus,,25,50);
//绘制手镯【丝状花环】
glutSolidSphere,15,50);
//绘制球体
//绘制灯柱
glRotated(190,180,200,270);
glutSolidCone,,30,25);
//绘制圆锥型灯罩
//绘制纹理
glEnable(GL_TEXTURE_2D);
//开启纹理
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
//映射方式
glBegin(GL_QUADS);
//绘制地面
//绘制四边形并给出当前顶点所对应的纹理坐标
glTexCoord2f,;
glVertex3f,,;
glEnd();
glDisable(GL_TEXTURE_2D);
//关闭纹理
glFlush();
//绘图结果显示到屏幕上
处理按键交互信息
voidSpecialKeys(intkey,intx,inty)
switch(key){
caseGLUT_KEY_UP:
//上键
xrot+=;
break;
caseGLUT_KEY_DOWN:
//下键
xrot-=;
caseGLUT_KEY_LEFT:
//左键
yrot+=;
caseGLUT_KEY_RIGHT:
//右键
yrot-=;
default:
glutPostRedisplay();
//标记当前窗口需要重新绘制
改变窗口大小
voidChangeSize(intw,inth)
GLfloatlightPos[]={,,,};
GLfloatnRange=;
if(h==0)
h=1;
glViewport(0,0,w,h);
//重新设置屏幕上的窗口大小
//后继操作都在投影变换范围内
//设置当前矩阵为单位矩阵
//正交投影
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);
//选择模型观察矩阵
//设置当前矩阵为单位矩阵
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框架开始运行,处理交互事件
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OpenGL 室内 三维 环境 计算机 图形学 作业