#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <gl/Gl.h>
#include <gl/Glu.h>
#include <gl/glut.h>
#define checkImageWidth 64
#define checkImageHeight 64
static GLubyte checkImage[checkImageHeight][checkImageWidth][4];
static GLuint texName;
static GLfloat xrot=0;
static GLfloat yrot=0;
//函数功能:绘制墙壁
void DrawWall(void)
{
glPushMatrix();
glTranslated(1.0, 0.01, 1.0);
glScaled(2.0, 0.02, 2.0);
glutSolidCube(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)
{
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();
}
//函数功能:绘图
void display(void)
{
glEnable(GL_LIGHTING); //启动光源
glEnable(GL_LIGHT0); //第一个光源
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST); //删除隐藏的表面
glEnable(GL_NORMALIZE); //将阴影向量正则化
glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
//设置表面材料的属性
GLfloat mat_ambient[] = {0.5f,0.5f,0.5f,1.0f};
GLfloat mat_diffuse[] = {0.7f,0.7f,0.7f,1.0f};
GLfloat mat_specular[] = {1.0f,1.0f,1.0f,1.0f,};
GLfloat mat_shininess[] = {70.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); //镜面反射光的会聚强度
//绘制地面纹理图案
int i, j, c;
for (i = 0; i < checkImageHeight; i++) {
for (j = 0; j < checkImageWidth; j++) {
c = ((((i&0x5)==0)^((j&0x5))==0))*225;
checkImage[i][j][0] = (GLubyte) c;
checkImage[i][j][1] = (GLubyte) c;
checkImage[i][j][2] = (GLubyte) c;
checkImage[i][j][3] = (GLubyte) 255;
}
}
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);
//设置光源属性
GLfloat light_position[]={2.0f, 6.0f, 3.0f, 0.0f}; //光源位置
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
glMatrixMode(GL_PROJECTION);//后继操作都在投影变换范围内
glLoadIdentity(); //设置当前矩阵为单位矩阵
GLfloat h = 1.0; //窗口的一半高度
glOrtho(-h*64/48.0, h*64/48.0, -h, h, 0.1, 100.0);
glMatrixMode(GL_MODELVIEW); //选择模型观察矩阵
glLoadIdentity();
gluLookAt(1, 1.6, 2, 0, 0.2, 0, 0, 1, 0); //设置观察坐标系
//开始绘制
glRotatef(xrot, 1.0f, 0.0f, 0.0f);
glRotatef(yrot, 0.0f, 1.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotated(-90.0, 0.0, 1.0, 0.0);
glBegin(GL_QUADS); //绘制墙面
//绘制四边形并给出当前顶点所对应的纹理坐标
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(0.0, 2.0, 0.0);
glVertex3f(2.0, 2.0, 0.0);
glVertex3f(2.0, 0.0, 0.0);
glEnd();
//DrawWall(); //绘制一面墙壁
glPopMatrix();
glPushMatrix();
glRotated(-90.0, 1.0, 0.0, 0.0);
DrawWall(); //绘制另一面墙壁
glPopMatrix();
glPushMatrix();
glTranslated(0.8, 0, 0.8);
DrawTable(); //绘制桌子
glPopMatrix();
glPushMatrix();
glTranslated(1.4, 0.1, 1.0);
glScaled(0.8, 0.8, 1.0);
glutSolidCube(0.2); //绘制箱子
glPopMatrix();
glPushMatrix();
glTranslated(0.9, 0.38, 0.9);
glRotated(90, 0, 1, 0);
glutSolidTeapot(0.1); //绘制茶壶
glPopMatrix();
glPushMatrix();
glTranslated(0.7, 0.1, 1.6);
glutSolidSphere(0.1, 30, 50); //绘制球体
glPopMatrix();
/*glPushMatrix();
glTranslated(1.0, 0.35, 0.3);
glScaled(0.03, 0.7, 0.03);
glutSolidCube(1.0); //绘制灯柱
glPopMatrix();*/
glPushMatrix();
glTranslated(0.2, 0.65, 0.2);
glRotated(-90, 1.0, 0.0, 0.0);
glutSolidCone(0.20, 0.35f, 30, 50); //绘制圆锥型灯罩
glPopMatrix();
glPushMatrix();
glTranslated(1.75, 0.1, 0.2);
glScaled(2.5, 0.8, 1.9);
glutSolidCube(0.2); //绘制底座
glPopMatrix();
glPushMatrix();
glTranslated(1.75, 0.2, 0.2);
glRotated(-90, 1.0, 0.0, 0.0);
glutSolidCone(0.15, 0.3f, 30, 50); //绘制圆锥型装饰
glPopMatrix();
glPushMatrix();
glTranslated(0.65, 0.075, 0.2);
glScaled(1.0, 0.15, 0.4);
glutSolidCube(1.0); //绘制床身
glPopMatrix();
glPushMatrix();
glTranslated(0.15, 0.18, 0.2);
glScaled(0.05, 0.36, 0.4);
glutSolidCube(1.0); //绘制床头
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.0);
glTexCoord2f(1.0, 1.0); glVertex3f(2.0, 0.0, 2.0);
glTexCoord2f(1.0, 0.0); glVertex3f(2.0, 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 += 5.0;
break;
case GLUT_KEY_DOWN: //下键
xrot -= 5.0;
break;
case GLUT_KEY_LEFT: //左键
yrot += 5.0;
break;
case GLUT_KEY_RIGHT: //右键
yrot -= 5.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, 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);//重新定义光源
}
void main ()
{
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); //双缓存
glutInitWindowSize(700, 500); //窗口大小
glutInitWindowPosition(200, 100); //窗口位置
glutCreateWindow("Distance"); //创建窗口,名为My Indoor
glutDisplayFunc(display); //显示回调函数,用于绘图
glutReshapeFunc(ChangeSize); //处理改变窗口大小
glutSpecialFunc(SpecialKeys); //处理按键交互信息
glutMainLoop(); //让GLUT框架开始运行, 处理交互事件
}

songsiqi2006
- 粉丝: 6
最新资源
- 单片机智能稳压电源的设计方案.doc
- 山西公务员热点大数据时代个人信息安全危机.doc
- 城乡规划中的测绘地理大数据应用探析.docx
- 中国-东盟网络安全合作与发展研究报告.pdf
- 软件开发模型.docx
- 大数据时代下-公共图书馆读者服务模式的发展研究.docx
- 华东交大软件学院6周软件工程实训总结报告-学号-姓名.doc
- 浅析计算机制图在工程测绘中的应用.docx
- 一.百万公众网络学习工程试题及标准答案(满分100分)docx.docx
- 河北大学MATLAB习题答案.doc
- 企业信息安全规划与技术实现-软件技术.doc
- 电气自动化李存义自动化应用方案设计书.doc
- 医院信息系统建设中虚拟化技术的运用.docx
- 物联网技术节水灌溉控制.doc
- 信息办公平台网络优化设计.docx
- 前端工程师项目实训金牌就业班版(Word).doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



- 1
- 2
- 3
- 4
- 5
- 6
前往页