




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、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=TRU
2、E; / 光源的开/关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 fullscr
3、een=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
4、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
5、; / 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(
6、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; /
7、状态指示器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
8、(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)
9、/纹理是否存在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);/远处采用线性滤
10、波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(TextureIma
11、ge1-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,
12、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);/释放图像结构 /.创建第四
13、个纹理,门./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(
14、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; glGen
15、Textures(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, TextureIm
16、age4-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_2
17、D, 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-da
18、ta);/绑定纹理 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
19、); / 重置当前的视口 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() / 调用纹理载入子例程
20、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);/ 告诉系统对透视进行
21、修正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_Ambi
22、ent); / 设置环境光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) / 从这里开始进行所
23、有的绘制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_d
24、iffuse);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用
25、于定义点的法向量 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
26、_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,
27、-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.
28、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
29、, -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
30、.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);glVertex
31、3f( 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);glTransl
32、atef(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
33、,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_AMBIEN
34、T_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.
35、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();/
36、压入堆栈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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025届贵州省黔东南州天柱二中高一物理第二学期期末学业质量监测试题含解析
- 2025届湖南省怀化三中高二物理第二学期期末达标测试试题含解析
- 黄石市重点中学2025届物理高一第二学期期末教学质量检测模拟试题含解析
- 2025年云南省玉溪市高二物理第二学期期末质量检测试题含解析
- 二零二五年度文化创意产业项目投资合作协议
- 二零二五年度不锈钢货架设计与安装工程合同范本
- 二零二五年度办公室租赁合同租赁保证金退还流程
- 二零二五年度OEM贴牌家具生产委托服务协议
- 二零二五年度智能家居安防系统安装服务合同
- 二零二五年度5G通信技术研发与应用合作协议合同范本
- 财务共享公司建设方案
- 小学数学-二年级升三年级暑假数学作业-口算 +竖式计算
- 2025至2030内燃机市场发展趋势分析与未来投资战略咨询研究报告
- 汽车散热器安装施工方案与技术措施
- 2025年陕西延长石油招聘笔试备考题库(带答案详解)
- 山西省烟草专卖局(公司)笔试试题2024
- 江苏扬州经济技术开发区区属国有企业招聘笔试真题2024
- Alport综合征基因诊断
- 搜身带离技术课件
- 光伏电站设备移交生产验收标准
- DB31/ 890-2015公共游泳场所卫生管理规范
评论
0/150
提交评论