已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
wp.h#include / Windows的头文件#include / 包含OpenGL实用库#include / 标准输入/输出库的头文件#include / GLaux库的头文件#include#include #include #include /.定义变量区./.用于场景漫游有关变量./GLfloat xrot=0.0f;/ X 旋转量GLfloat yrot=0.0f;/ Y 旋转量GLfloat x=0.0f; / X 平移量GLfloat y=0.0f; / Y 平移量GLfloat z=-40.0f; / 深入屏幕的距离/.用于键盘操作有关变量./BOOL light=TRUE; / 光源的开/关BOOL lp; / L键按下了么?BOOL fp; / F键按下了么?BOOL TurnOn=FALSE; / 开灯GLUquadricObj *qobj; int fantheta=0; / 风扇转过角度HGLRC hRC=NULL; / 窗口着色描述表句柄HDC hDC=NULL; / OpenGL渲染描述表句柄HWND hWnd=NULL; / 保存我们的窗口句柄HINSTANCE hInstance; / 保存程序的实例bool keys256; / 保存键盘按键的数组bool active=TRUE; / 窗口的活动标志,缺省为TRUEbool fullscreen=TRUE; / 全屏标志缺省,缺省设定成全屏模式/.光照材质有关变量./GLfloat light_Ambient= 0.1f, 0.1f, 0.1f, 1.0f ; / 环境光参数GLfloat light_Diffuse= 1.0f, 1.0f, 0.45f, 1.0f ;/ 漫射光参数GLfloat light_position=0.0,29.9,0.0,1.0; / 光源位置GLfloat light_position1=20.0,29.9,0.0,1.0;GLfloat mat_ambient=0.05f,0.05f,0.05f,1.0f; / 材质环境光参数GLfloat mat_specular=0.8,1.0,1.0,1.0; / 材质镜面光参数GLfloat mat_shininess=5.0; GLfloat white_light=1.0,1.0,1.0,1.0; / 光GLfloat no_mat= 0.0f, 0.0f, 0.0f, 1.0f; / 无材质色GLfloat no_shininess= 0.0f; / 无反光GLfloat mat_diffuse= 1.0f, 1.0f, 1.0f, 1.0f; / 漫反射GLfloat diffusion=0.521f,0.121f,0.0547f,1.0;/.纹理./GLuint texture6; / 7种纹理的储存空间/.时钟有关变量./GLfloat cx=35.0,cy=15.0,cz=-79.9,radius=5.0;GLfloat hradius=2.0,mradius=3.0,sradius=4.0;GLfloat sangle,mangle,hangle;GLuint second,miniter,hour;char timebuffer9;LRESULTCALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); / WndProc的定义wp.cpp#includewp.h/.创建纹理./AUX_RGBImageRec *LoadBMP(char *Filename) / 载入位图图象FILE *File=NULL; / 文件句柄if (!Filename) / 确保文件名已提供 return NULL; / 如果没提供,返回 NULLFile=fopen(Filename,r); / 尝试打开文件if (File) / 文件存在么? fclose(File); / 关闭句柄 return auxDIBImageLoad(Filename); / 载入位图并返回指针return NULL; / 如果载入失败,返回 NULLint LoadGLTextures() / 载入位图并转换成纹理int Status=FALSE; / 状态指示器AUX_RGBImageRec *TextureImage6; / 创建纹理的存储空间memset(TextureImage,0,sizeof(void *)*1); / 将指针设为 NULL / 载入位图,检查有无错误,如果位图没找到则退出Status=TRUE; / 将 Status 设为 TRUE /.创建第一个纹理,地板./ if (TextureImage0=LoadBMP(floor.bmp) glGenTextures(1, &texture0);/ 创建纹理 glBindTexture(GL_TEXTURE_2D, texture0); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);/远处采用线性滤波glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);/近处采用MipMapped滤波 gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage0-sizeX, TextureImage0-sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage0-data);/绑定纹理 if (TextureImage0)/纹理是否存在if (TextureImage0-data)/纹理图像是否存在free(TextureImage0-data);/释放纹理图像占用的内存free(TextureImage0);/释放图像结构 /.创建第二个纹理,墙./ if (TextureImage1=LoadBMP(wall.bmp) glGenTextures(1, &texture1); /创建纹理 glBindTexture(GL_TEXTURE_2D, texture1); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);/远处采用线性滤波glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);/近处采用MipMapped滤波 gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage1-sizeX, TextureImage1-sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage1-data);/绑定纹理 if (TextureImage1)/纹理是否存在 if (TextureImage1-data)/纹理图像是否存在 free(TextureImage1-data);/释放纹理图像占用的内存 free(TextureImage1);/释放图像结构 /.创建第三个纹理,窗户./ if (TextureImage2=LoadBMP(glass.bmp) glGenTextures(1, &texture2);/创建纹理 glBindTexture(GL_TEXTURE_2D, texture2);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);/远处采用线性滤波glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);/近处采用MipMapped滤波gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage2-sizeX, TextureImage2-sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage2-data);/绑定纹理 if (TextureImage2)/纹理是否存在if (TextureImage2-data)/纹理图像是否存在free(TextureImage2-data);/释放纹理图像占用的内存free(TextureImage2);/释放图像结构 /.创建第四个纹理,门./if (TextureImage3=LoadBMP(door.bmp) glGenTextures(1, &texture3);/创建纹理glBindTexture(GL_TEXTURE_2D, texture3);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);/远处采用线性滤波glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);/近处采用MipMapped滤波 gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage3-sizeX, TextureImage3-sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage3-data);/绑定纹理 if (TextureImage3)/纹理是否存在if (TextureImage3-data)/纹理图像是否存在free(TextureImage3-data);/释放纹理图像占用的内存free(TextureImage3);/释放图像结构 /.创建第五个纹理,灯./if (TextureImage4=LoadBMP(lamp.bmp)Status=TRUE; glGenTextures(1, &texture4);/创建纹理glBindTexture(GL_TEXTURE_2D, texture4);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);/远处采用线性滤波glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);/近处采用MipMapped滤波 gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage4-sizeX, TextureImage4-sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage4-data);/绑定纹理 if (TextureImage4)/纹理是否存在if (TextureImage4-data)/纹理图像是否存在free(TextureImage4-data);/释放纹理图像占用的内存free(TextureImage4);/释放图像结构 /.创建第六个纹理,黑板./if (TextureImage5=LoadBMP(blackwall.bmp) glGenTextures(1, &texture5);/创建纹理glBindTexture(GL_TEXTURE_2D, texture5);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);/远处采用线性滤波glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);/近处采用MipMapped滤波 gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage5-sizeX, TextureImage5-sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage5-data);/绑定纹理 if (TextureImage5)/纹理是否存在if (TextureImage5-data)/纹理图像是否存在free(TextureImage5-data);/释放纹理图像占用的内存free(TextureImage5);/释放图像结构 return Status;/.重置OpenGL窗口大小./GLvoid ReSizeGLScene(GLsizei width, GLsizei height)/ 重置OpenGL窗口大小if (height=0) / 防止被零除height=1; / 将Height设为1glViewport(0, 0, width, height); / 重置当前的视口 glMatrixMode(GL_PROJECTION); / 选择投影矩阵glLoadIdentity(); / 重置投影矩阵 / 设置视口的大小 gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,1000.0f);glMatrixMode(GL_MODELVIEW); / 选择模型观察矩阵glLoadIdentity(); / 重置模型观察矩阵 /.初始化操作./int InitGL(GLvoid) / 此处开始对OpenGL进行所有设置if (!LoadGLTextures() / 调用纹理载入子例程return FALSE; / 如果未能载入,返回FALSEglEnable(GL_TEXTURE_2D); / 启用纹理映射glShadeModel(GL_SMOOTH); / 启用阴影平滑 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); / 黑色背景 glClearDepth(1.0f); / 设置深度缓存glEnable(GL_DEPTH_TEST); / 启用深度测试glDepthFunc(GL_LEQUAL); / 所作深度测试的类型 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);/ 告诉系统对透视进行修正glLightModelfv(GL_LIGHT_MODEL_AMBIENT,mat_ambient);glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_TRUE);glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);glLightfv(GL_LIGHT1,GL_POSITION,light_position); / 设置光源位置glLightfv(GL_LIGHT1,GL_AMBIENT,light_Ambient); / 设置环境光glLightfv(GL_LIGHT1,GL_DIFFUSE,white_light); / 设置漫射光glLightfv(GL_LIGHT1,GL_SPECULAR,white_light);glEnable(GL_LIGHTING); glEnable(GL_LIGHT1); / 启用一号光源glEnable(GL_COLOR_MATERIAL);glPixelStorei(GL_UNPACK_ALIGNMENT,1); /对齐像素字节函数return TRUE; / 初始化 OK/.开始绘制./int DrawGLScene(GLvoid) / 从这里开始进行所有的绘制glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); / 清除屏幕和深度缓存glLoadIdentity(); / 重置当前的模型观察矩阵glTranslatef(x,y,z); /沿X,Y,Z轴移动 glRotatef(xrot,1.0f,0.0f,0.0f); / 绕X轴旋转glRotatef(yrot,0.0f,1.0f,0.0f); / 绕Y轴旋转 glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat); /选择材质光照glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);/.房间./ /.地板./ glBindTexture(GL_TEXTURE_2D, texture0);/ 选择纹理glBegin(GL_QUADS); /开始绘制四边形 glColor3f(1.0f, 1.0f, 1.0f); glNormal3f(0.0,1.0,0.0); /glNormal3f用于定义点的法向量 glTexCoord2f(1.0f, 1.0f);glVertex3f(-50.0f, -21.0f, -80.0f);/右上glTexCoord2f(1.0f, 0.0f);glVertex3f(-50.0f, -21.0f, 40.0f);/右下glTexCoord2f(0.0f, 0.0f);glVertex3f( 50.0f, -21.0f, 40.0f);/左下glTexCoord2f(0.0f, 1.0f);glVertex3f( 50.0f, -21.0f, -80.0f);/左上glEnd(); /.天花板./ glBindTexture(GL_TEXTURE_2D, texture1);/ 选择纹理glBegin(GL_QUADS);/开始绘制四边形 glColor3f(1.0f, 1.0f, 1.0f);glNormal3f(0.0f, -1.0f, 0.0f);/glNormal3f用于定义点的法向量glTexCoord2f(0.0f, 0.0f);glVertex3f(-50.0f, 30.0f, 40.0f);/左下glTexCoord2f(0.0f, 1.0f);glVertex3f(-50.0f, 30.0f, -80.0f);/左上glTexCoord2f(1.0f, 1.0f);glVertex3f( 50.0f, 30.0f, -80.0f);/右上glTexCoord2f(1.0f, 0.0f);glVertex3f( 50.0f, 30.0f, 40.0f);/右下glEnd();/.后墙面./glBegin(GL_QUADS);/开始绘制四边形glColor3f(1.0f, 1.0f, 1.0f);glNormal3f(0.0f, 0.0f, 1.0f);/glNormal3f用于定义点的法向量glTexCoord2f(1.0f, 1.0f);glVertex3f(-50.0f, 30.0f, -80.0f);/右上glTexCoord2f(1.0f, 0.0f);glVertex3f(-50.0f, -21.0f, -80.0f);/右下glTexCoord2f(0.0f, 0.0f);glVertex3f( 50.0f, -21.0f, -80.0f);/左下glTexCoord2f(0.0f, 1.0f);glVertex3f( 50.0f, 30.0f, -80.0f);/左上/.前墙面./glNormal3f(0.0f, 0.0f, -1.0f);/glNormal3f用于定义点的法向量glTexCoord2f(1.0f, 1.0f);glVertex3f( 50.0f, 30.0f, 40.0f);/右上glTexCoord2f(1.0f, 0.0f);glVertex3f( 50.0f, -21.0f, 40.0f);/右下glTexCoord2f(0.0f, 0.0f);glVertex3f(-50.0f, -21.0f, 40.0f);/左下glTexCoord2f(0.0f, 1.0f);glVertex3f(-50.0f, 30.0f, 40.0f);/左上/.左墙面./glNormal3f( 1.0f, 0.0f, 0.0f);/glNormal3f用于定义点的法向量glTexCoord2f(1.0f, 1.0f);glVertex3f(-50.0f, 30.0f, 40.0f);/右上glTexCoord2f(1.0f, 0.0f);glVertex3f(-50.0f, -21.0f, 40.0f);/右下glTexCoord2f(0.0f, 0.0f);glVertex3f(-50.0f, -21.0f, -80.0f);/左下glTexCoord2f(0.0f, 1.0f);glVertex3f(-50.0f, 30.0f, -80.0f);/左上/.右墙面./glNormal3f(-1.0f, 0.0f, 0.0f);/glNormal3f用于定义点的法向量glTexCoord2f(1.0f, 1.0f);glVertex3f( 50.0f, 30.0f, -80.0f);/右上glTexCoord2f(1.0f, 0.0f);glVertex3f( 50.0f, -21.0f, -80.0f);/右下glTexCoord2f(0.0f, 0.0f);glVertex3f( 50.0f, -21.0f, 40.0f);/左下glTexCoord2f(0.0f, 1.0f);glVertex3f( 50.0f, 30.0f, 40.0f);/左上glEnd();/.桌椅./GLuint i=0;for(;i5;i+)/一共五排桌椅/.第一张桌椅./ /.桌子的上面./glPushMatrix();/因为下面要对坐标进行变换,所以先将信息入栈保护,使整个工程的坐标不发生改变glColor3f(1.0,1.0,0.45);glTranslatef(30.0f,-10.0f,-30.0+i*9);/平移变换glScalef(13.0f,0.3f,5.0f);/缩放变换glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);/定义材质光照glutSolidCube(1.0);/绘制立方体glPopMatrix();/弹出堆栈 /.桌子的下面./glPushMatrix();/压入堆栈glColor3f(1.0,1.0,0.45);glTranslatef(30.0f,-13.0f,-30.0+i*9);/平移变换glScalef(11.0f,0.3f,5.0f);/缩放变换glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);/定义材质光照glutSolidCube(1.0);/绘制立方体glPopMatrix();/弹出堆栈 /.桌子的后面./glPushMatrix();/压入堆栈glColor3f(0.2,0.8,0.8);glTranslatef(30.0f,-12.0f,-32.5f+i*9);/平移变换glScalef(11.0f,3.6f,0.3f);/缩放变换 glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);/定义材质光照glutSolidCube(1.0);/绘制立方体glPopMatrix();/弹出堆栈 /.桌子的左边桌腿./glPushMatrix();/压入堆栈glColor3f(0.0,0.0,0.0);glTranslatef(25.0f,-17.0f,-32.5f+i*9);/平移变换glScalef(0.5f,8.0f,0.3f);/缩放变换glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);/定义材质光照glutSolidCube(1.0);/绘制立方体glPopMatrix();/弹出堆栈 /.桌子的右边桌腿./ glPushMatrix();/压入堆栈glColor3f(0.0,0.0,0.0);glTranslatef(35.0f,-17.0f,-32.5f+i*9);/平移变换glScalef(0.5f,8.0f,0.3f);/缩放变换glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);/定义材质光照glutSolidCube(1.0);/绘制立方体glPopMatrix();/弹出堆栈 /.椅子./glPushMatrix();/压入堆栈glColor3f(0.2,0.8,0.8);glTranslatef(30.0f,-15.0f,-25.0+i*9);/平移变换glScalef(11.3f,0.3f,3.5f);/缩放变换glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);/定义材质光照glutSolidCube(1.0);/绘制立方体glPopMatrix();/弹出堆栈/.第二张桌椅./.桌子的上面./glPushMatrix();glColor3f(1.0,1.0,0.45);glTranslatef(0.0f,-10.0f,-30.0+i*9);glScalef(26.0f,0.3f,5.0f);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);glutSolidCube(1.0);glPopMatrix(); /.桌子的下面./glPushMatrix();glColor3f(1.0,1.0,0.45);glTranslatef(0.0f,-13.0f,-30.0+i*9);glScalef(24.0f,0.3f,5.0f);glMaterialf
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 船舶建造工艺优化研究
- 屈光不正患者的干眼症护理
- 磷酸哌嗪新剂型开发
- 急诊护理中的患者脉搏监护与风险防范
- 急诊常见护理风险及应对措施
- 数据隐秘管理与应用承诺书范文4篇
- 海外旅游攻略与注意事项手册
- 2026年客户投诉处理结果确认函7篇
- 智能语音助手研发及应用解决方案
- 智能制造车间设备操作安全规范手册
- 2026版公司安全生产管理制度及文件汇编
- 2026年中国铁路各局集团招聘试题及答案解析
- 15D503利用建筑物金属体做防雷及接地装置安装图集
- 工厂质量管理奖惩制度模板
- 含蜡原油管道蜡沉积与清管
- 【超星尔雅学习通】商法的思维网课章节答案
- 磁悬浮离心冷水机组、螺杆式水冷冷水机组、离心式水冷冷机组及多联机组方案比较
- JJF 1319-2011傅立叶变换红外光谱仪校准规范
- 高数下册试题及答案
- 蓄热步进式加热炉设计说明书
- 质量保证体系架构图
评论
0/150
提交评论