opengl 教室 地球仪 模型

来源:互联网 发布:杀人者的记忆法 知乎 编辑:程序博客网 时间:2024/05/17 02:07

这是我结合两个程序修改的版本, 其中, 教室出自


http://wenku.baidu.com/link?url=T4WNTvbp4IeCklDiGDSYG5Db6TGD1PJbXjS9xgR-Szk1Rxzs6hcPGFdaPc0Lz-QdtqR2ABXW9xZzj4T25EGBHtHfjXBsapZFlJmwlm-1r-K,


地球仪出自


http://download.csdn.net/download/gaoduyanjiu/2611117,


我结合了两个程序, 修改成了一个教室里面有一个转动的地球仪。


h文件

#pragma once#include <string>#include <map>#include <gl/GLAux.h>#pragma comment(lib, "glaux.lib")using namespace std;enum TexMgrErrCode{INVALD_TEXTURE=0};typedef unsigned int uint;class MyTexMgr{public:MyTexMgr(void);virtual ~MyTexMgr(void);public:boolloadTex(const wstring& texName,const wstring& fileName);uintgetTex( const wstring& texName);booldelTex( const wstring& texName);public:boolclear();protected:AUX_RGBImageRec*loadBMP(const wchar_t* fileName);map<wstring,uint>m_textures;};

cpp文件1

#include "MyTexMgr.h"#include <fstream>#include <gl/GL.h>#include <gl/GLU.h>MyTexMgr::MyTexMgr(void){}MyTexMgr::~MyTexMgr(void){if (m_textures.empty()){return;}map<wstring,uint>::iterator it;for (it=m_textures.begin();it!=m_textures.end();++it){glDeleteTextures(1,&it->second);}}bool MyTexMgr::loadTex( const wstring& texName,const wstring& fileName ){GLuintnewElem;glGenTextures(1,&newElem);AUX_RGBImageRec*rec=loadBMP(fileName.c_str());if (!rec){glDeleteTextures(1,&newElem);return false;}glBindTexture(GL_TEXTURE_2D,newElem);glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,rec->sizeX,rec->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,rec->data);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);if (getTex(texName)!=INVALD_TEXTURE){delTex(texName);}m_textures.insert(make_pair(texName,newElem));deleterec->data;free(rec);return true;}uint MyTexMgr::getTex( const wstring& texName ){map<wstring,uint>::iterator it;it=m_textures.find(texName);if (it!=m_textures.end()){return it->second;}else{return INVALD_TEXTURE;}}bool MyTexMgr::delTex( const wstring& texName ){map<wstring,uint>::iterator it;it=m_textures.find(texName);if (it!=m_textures.end()){glDeleteTextures(1,&it->second);m_textures.erase(it);}return true;}AUX_RGBImageRec* MyTexMgr::loadBMP( const wchar_t* fileName ){wifstream infile(fileName);if (infile.is_open()){return auxDIBImageLoadW(fileName);} else{return NULL;}}bool MyTexMgr::clear(){if (m_textures.empty()){return true;}map<wstring,uint>::iterator it;for (it=m_textures.begin();it!=m_textures.end();++it){glDeleteTextures(1,&it->second);}m_textures.clear();return true;}

cpp文件2, 比较长

#include <Windows.h>#include <gl/glut.h>#include <gl/GLAux.h>#include<stdlib.h>#include <stdio.h>#include "MyTexMgr.h"// 地球仪static GLUquadric*_earth;static MyTexMgr_texLoader;float _angle = 0.0f;bool isMoved = true;// gl parameters// Rotation amounts  GLfloat xRot = 0.0f;  GLfloat yRot = 0.0f; int oldmy=-1,oldmx=-1;GLfloat zoom = 1.0;// #define  GLUT_WHEEL_UP 3           //定义滚轮操作  // #define  GLUT_WHEEL_DOWN 4  GLfloat xTrans = 0.0f;  GLfloat yTrans = 0.0f; // 纹理GLuint texture[4];void DrawRoom(){GLfloat no_mat[] = {0.0f, 0.0f, 0.0f, 1.0f}; //无材质色GLfloat mat_diffuse1[] = {0.1f, 0.5f, 0.8f, 1.0f}; //漫反射GLfloat mat_diffuse2[] = {0.0f, 0.0f, 0.0f, 1.0f}; //漫反射GLfloat no_shininess[] = {0.0f}; //无反光glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse1);glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);//----------------开始绘制房间---------------------------------------------------------glEnable(GL_TEXTURE_2D);//启用二维纹理glBindTexture(GL_TEXTURE_2D,texture[3]);glColor3f(0.8f, 1.0f, 0.8f);glBegin(GL_QUADS);                             //glNormal3f用于定义点的法向量 glNormal3f(0.0f, 1.0f, 0.0f);     //绘制地板glTexCoord2f(0,1);glVertex3f(-50.0f, -30.0f, -80.0f);glTexCoord2f(1,1);glVertex3f(-50.0f, -30.0f,  20.0f);glTexCoord2f(1,0);glVertex3f( 50.0f, -30.0f,  20.0f);glTexCoord2f(0,0);glVertex3f( 50.0f, -30.0f, -80.0f);glEnd();glDisable(GL_TEXTURE_2D);glBegin(GL_QUADS); glColor3f(0.3,0.3,0.3);glNormal3f(0.0f, -1.0f, 0.0f);     //绘制天花板glVertex3f(-50.0f,  30.0f,  20.0f);glVertex3f(-50.0f,  30.0f, -80.0f);glVertex3f( 50.0f,  30.0f, -80.0f);glVertex3f( 50.0f,  30.0f,  20.0f);glEnd();glColor3f(0.8f,0.8f, 0.8f);glBegin(GL_QUADS);glNormal3f(0.0f, 0.0f, 1.0f);     //绘制后墙面glVertex3f(-50.0f,  30.0f, -80.0f);glVertex3f(-50.0f, -30.0f, -80.0f);glVertex3f( 50.0f, -30.0f, -80.0f);glVertex3f( 50.0f,  30.0f, -80.0f);glEnd();glBegin(GL_QUADS);glNormal3f(0.0f, 0.0f, -1.0f);     //绘制前墙面glVertex3f( 50.0f,  30.0f,  20.0f);glVertex3f( 50.0f, -30.0f,  20.0f);glVertex3f(-50.0f, -30.0f,  20.0f);glVertex3f(-50.0f,  30.0f,  20.0f);glEnd();glEnable(GL_TEXTURE_2D);//启用二维纹理glBindTexture(GL_TEXTURE_2D,texture[2]);glBegin(GL_QUADS);glNormal3f(0.0f, 0.0f, -1.0f);     //绘制前墙面海报glTexCoord2f(0,1);glVertex3f( 25.0f,  15.0f,  19.99f);glTexCoord2f(0,0);glVertex3f( 25.0f, -15.0f,  19.99f);glTexCoord2f(1,0);glVertex3f(-25.0f, -15.0f,  19.99f);glTexCoord2f(1,1);glVertex3f(-25.0f,  15.0f,  19.99f);glEnd();glDisable(GL_TEXTURE_2D);glBegin(GL_QUADS);glNormal3f( 1.0f, 0.0f, 0.0f);     //绘制左墙面glVertex3f(-50.0f,  30.0f,  20.0f);glVertex3f(-50.0f, -30.0f,  20.0f);glVertex3f(-50.0f, -30.0f, -80.0f);glVertex3f(-50.0f,  30.0f, -80.0f);glEnd();glBegin(GL_QUADS);glNormal3f(-1.0f, 0.0f, 0.0f);     //绘制右墙面glVertex3f( 50.0f,  30.0f, -80.0f);glVertex3f( 50.0f, -30.0f, -80.0f);glVertex3f( 50.0f, -30.0f,  20.0f);glVertex3f( 50.0f, 30.0f,  20.0f);glEnd();//------------------------------绘制房间结束------------------------------------------------////------------------------------开始绘制房间两侧石柱-----------------------------------------//int j=0;for(;j<2;j++)            //绘制教室右侧的石柱{glBegin(GL_QUADS);glNormal3f(0.0f, 0.0f, -1.0f);     //石柱后面glVertex3f( 50.0f,  30.0f, -40.0f+j*30);glVertex3f( 47.0f, 30.0f, -40.0f+j*30);glVertex3f( 47.0f, -30.0f,  -40.0f+j*30);glVertex3f( 50.0f, -30.0f,  -40.0f+j*30);glEnd();glBegin(GL_QUADS);glNormal3f(-1.0f, 0.0f, 0.0f);     //石柱左面glVertex3f( 47.0f,  30.0f, -40.0f+j*30);glVertex3f( 47.0f, 30.0f, -36.0f+j*30);glVertex3f( 47.0f, -30.0f,  -36.0f+j*30);glVertex3f( 47.0f, -30.0f,  -40.0f+j*30);glEnd();glBegin(GL_QUADS);glNormal3f(0.0f, 0.0f, 1.0f);     //石柱前面glVertex3f( 50.0f,  30.0f, -36.0f+j*30);glVertex3f( 47.0f, 30.0f, -36.0f+j*30);glVertex3f( 47.0f, -30.0f,  -36.0f+j*30);glVertex3f( 50.0f, -30.0f,  -36.0f+j*30);glEnd();}for( j=0;j<3;j++)           //绘制教室左侧石柱{glBegin(GL_QUADS);glNormal3f(0.0f, 0.0f, -1.0f);     //石柱后面glVertex3f( -50.0f,  30.0f, -40.0f+j*28);glVertex3f( -47.0f, 30.0f, -40.0f+j*28);glVertex3f( -47.0f, -30.0f,  -40.0f+j*28);glVertex3f( -50.0f, -30.0f,  -40.0f+j*28);glEnd();glBegin(GL_QUADS);glNormal3f(1.0f, 0.0f, 0.0f);     //石柱右面glVertex3f( -47.0f,  30.0f, -40.0f+j*28);glVertex3f( -47.0f, 30.0f, -36.0f+j*28);glVertex3f( -47.0f, -30.0f,  -36.0f+j*28);glVertex3f( -47.0f, -30.0f,  -40.0f+j*28);glEnd();glBegin(GL_QUADS);glNormal3f(0.0f, 0.0f, 1.0f);     //石柱前面glVertex3f( -50.0f,  30.0f, -36.0f+j*28);glVertex3f( -47.0f, 30.0f, -36.0f+j*28);glVertex3f( -47.0f, -30.0f,  -36.0f+j*28);glVertex3f( -50.0f, -30.0f,  -36.0f+j*28);glEnd();//------------------------------结束绘制房间两侧石柱-----------------------------------------//}  }void DrawDesk(){GLfloat mat_amb_diff1[]={1,1,0.45,1.0};glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1);GLuint i=0;for(;i<3;i++){glPushMatrix();//-----------------------no.1------------------------------------glColor3f(1,1,0.45);//桌子上面glTranslatef(15.0f,-10.0f,-30.0+i*17);//glScalef(13.0f,0.3f,5.0f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//桌子下面glTranslatef(15.0f,-13.0f,-30.0+i*17);//glScalef(11.0f,0.3f,5.0f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//桌子后面glTranslatef(15.0f,-12.0f,-32.5f+i*17);//从原点平移glScalef(11.0f,3.0f,0.3f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//桌子左面glTranslatef(9.5f,-11.5f,-30.0f+i*17);//从原点平移glScalef(0.3f,3.0f,5.0f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//桌子右面glTranslatef(20.5f,-11.5f,-30.0f+i*17);//从原点平移glScalef(0.3f,3.0f,5.0f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//桌腿一号glTranslatef(10.0f,-17.0f,-32.5f+i*17);//从原点平移glScalef(0.5f,8.0f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//桌腿二号glTranslatef(10.0f,-17.0f,-28.5f+i*17);//从原点平移glScalef(0.5f,8.0f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//桌腿三号glTranslatef(20.0f,-17.0f,-32.5f+i*17);//从原点平移glScalef(0.5f,8.0f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//桌腿四号glTranslatef(20.0f,-17.0f,-28.5f+i*17);//从原点平移glScalef(0.5f,8.0f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//板凳上面glTranslatef(15.0f,-15.0f,-25.0+i*17);//从原点平移glScalef(9.5f,0.3f,3.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//板凳腿一号glTranslatef(11.0f,-18.0f,-26.0f+i*17);//从原点平移glScalef(0.5f,6.0f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//板凳腿二号glTranslatef(11.0f,-18.0f,-24.0f+i*17);//从原点平移glScalef(0.5f,6.0f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//板凳腿三号glTranslatef(19.0f,-18.0f,-26.0f+i*17);//从原点平移glScalef(0.5f,6.0f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//板凳腿四号glTranslatef(19.0f,-18.0f,-24.0f+i*17);//从原点平移glScalef(0.5f,6.0f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();//------------------------no.2----------------------------------glColor3f(1,1,0.45);//桌子上面glTranslatef(0.0f,-10.0f,-30.0+i*17);//从原点平移glScalef(13.0f,0.3f,5.0f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//桌子下面glTranslatef(0.0f,-13.0f,-30.0+i*17);//从原点平移glScalef(11.0f,0.3f,5.0f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//桌子后面-32.5glTranslatef(0.0f,-12.0f,-32.5f+i*17);//从原点平移glScalef(11.0f,3.0f,0.3f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//桌子左面glTranslatef(-5.4f,-11.5f,-30.0f+i*17);//从原点平移glScalef(0.3f,3.0f,5.0f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//桌子右面glTranslatef(5.4f,-11.5f,-30.0f+i*17);//从原点平移glScalef(0.3f,3.0f,5.0f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//桌腿一号glTranslatef(-5.4f,-17.0f,-32.5f+i*17);//从原点平移glScalef(0.5f,8.0f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//桌腿二号glTranslatef(-5.4f,-17.0f,-28.5f+i*17);//从原点平移glScalef(0.5f,8.0f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//桌腿三号glTranslatef(5.4f,-17.0f,-32.5f+i*17);//从原点平移glScalef(0.5f,8.0f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//桌腿四号glTranslatef(5.4f,-17.0f,-28.5f+i*17);//从原点平移glScalef(0.5f,8.0f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//板凳上面glTranslatef(0.0f,-15.0f,-25.0+i*17);//从原点平移glScalef(9.5f,0.3f,3.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//板凳腿一号glTranslatef(-4.3f,-18.0f,-26.0f+i*17);//从原点平移glScalef(0.5f,6.0f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//板凳腿二号glTranslatef(-4.3f,-18.0f,-24.0f+i*17);//从原点平移glScalef(0.5f,6.0f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//板凳腿三号glTranslatef(4.3f,-18.0f,-26.0f+i*17);//从原点平移glScalef(0.5f,6.0f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//板凳腿四号glTranslatef(4.3f,-18.0f,-24.0f+i*17);//从原点平移glScalef(0.5f,6.0f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();//--------------------no.3------------------------------------glColor3f(1,1,0.45);//桌子上面glTranslatef(-15.0f,-10.0f,-30.0+i*17);//从原点平移glScalef(13.0f,0.3f,5.0f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//桌子下面glTranslatef(-15.0f,-13.0f,-30.0+i*17);//从原点平移glScalef(11.0f,0.3f,5.0f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//桌子后面glTranslatef(-15.0f,-12.0f,-32.5f+i*17);//从原点平移glScalef(11.0f,3.0f,0.3f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//桌子左面glTranslatef(-9.5f,-11.5f,-30.0f+i*17);//从原点平移glScalef(0.3f,3.0f,5.0f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//桌子右面glTranslatef(-20.5f,-11.5f,-30.0f+i*17);//从原点平移glScalef(0.3f,3.0f,5.0f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//桌腿一号glTranslatef(-10.0f,-17.0f,-32.5f+i*17);//从原点平移glScalef(0.5f,8.0f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//桌腿二号glTranslatef(-10.0f,-17.0f,-28.5f+i*17);//从原点平移glScalef(0.5f,8.0f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//桌腿三号glTranslatef(-20.0f,-17.0f,-32.5f+i*17);//从原点平移glScalef(0.5f,8.0f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//桌腿四号glTranslatef(-20.0f,-17.0f,-28.5f+i*17);//从原点平移glScalef(0.5f,8.0f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//板凳上面glTranslatef(-15.0f,-15.0f,-25.0+i*17);//从原点平移glScalef(9.5f,0.3f,3.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//板凳腿一号glTranslatef(-11.0f,-18.0f,-26.0f+i*17);//从原点平移glScalef(0.5f,6.0f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//板凳腿二号glTranslatef(-11.0f,-18.0f,-24.0f+i*17);//从原点平移glScalef(0.5f,6.0f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//板凳腿三号glTranslatef(-19.0f,-18.0f,-26.0f+i*17);//从原点平移glScalef(0.5f,6.0f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(1,1,0.45);//板凳腿四号glTranslatef(-19.0f,-18.0f,-24.0f+i*17);//从原点平移glScalef(0.5f,6.0f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();}}void DrawBlackboard(){GLfloat mat_amb_diff5[]={0.0f,0.0f,0.0f,1.0};GLfloat mat_amb_diff3[]={0.0664,0.2578,0.1211,1.0};//glBindTexture(GL_TEXTURE_2D,texture[0]);glNormal3f(-1.0f, 0.0f, 0.0f);glPushMatrix();glColor3f(0,0,0);// 黑板左边框glTranslatef(-35.7f,6.8f,-79.9f);//glScalef(1.0f,34.0f,0.5f);//将立方体变成长方体glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff5);glutSolidCube(1.0);glPopMatrix();glPushMatrix();// 黑板右边框glTranslatef(35.7f,6.8f,-79.9f);//glScalef(1.0f,34.0f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();// 黑板中一边框glTranslatef(11.7f,6.8f,-79.9f);//glScalef(1.0f,34.0f,1.1f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();// 黑板中二边框glTranslatef(-11.7f,6.8f,-79.9f);//glScalef(1.0f,34.0f,1.1f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();//黑板下边框glTranslatef(0.0f,-10.0f,-79.9f);//glScalef(71.3f,0.5f,0.8f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();//黑板上边框glTranslatef(0.0f,23.8f,-79.9f);//glScalef(71.3f,0.5f,0.8f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();GLfloat blackboard1_y=0,blackboard2_y=0,blackboard3_y=0;//---------------------最左边一组黑板---------------------glPushMatrix();//黑板1号下边框glTranslatef(-23.5f,6.9f+blackboard1_y,-79.9f);//glScalef(24.0f,0.5f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();//黑板2号下边框glTranslatef(-23.5f,-9.8f-blackboard1_y,-79.5f);//glScalef(24.0f,0.5f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();//黑板1号上边框glTranslatef(-23.5f,23.7f+blackboard1_y,-79.9f);//glScalef(24.0f,0.5f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();//黑板2号上边框glTranslatef(-23.5f,6.8f-blackboard1_y,-79.5f);//glScalef(24.0f,0.5f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(0.0664,0.2578,0.1211);// 黑板1号glTranslatef(-23.5f,15.3f+blackboard1_y,-79.9f);//glScalef(24.0f,16.5f,0.3f);//将立方体变成长方体glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff3);glutSolidCube(1.0);glPopMatrix();glPushMatrix();     // 黑板2号glTranslatef(-23.5f,-1.3f-blackboard1_y,-79.5f);//glScalef(24.0f,16.5f,0.3f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();//---------------------最右边一组黑板---------------------glColor3f(0,0,0);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff5);glPushMatrix();//黑板1号下边框glTranslatef(0.0f,6.9f+blackboard2_y,-79.9f);//glScalef(24.0f,0.5f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();//黑板2号下边框glTranslatef(0.0f,-9.8f-blackboard2_y,-79.5f);//glScalef(24.0f,0.5f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();//黑板1号上边框glTranslatef(0.0f,23.7f+blackboard2_y,-79.9f);//glScalef(24.0f,0.5f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();//黑板2号上边框glTranslatef(0.0f,6.8f-blackboard2_y,-79.5f);//glScalef(24.0f,0.5f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(0.0664,0.2578,0.1211);// 黑板1号glTranslatef(0.0f,15.3f+blackboard2_y,-79.9f);//glScalef(24.0f,16.5f,0.3f);//将立方体变成长方体glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff3);glutSolidCube(1.0);glPopMatrix();glPushMatrix();     // 黑板2号glTranslatef(0.0f,-1.3f-blackboard2_y,-79.5f);//glScalef(24.0f,16.5f,0.3f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();//---------------------中间一组黑板---------------------glColor3f(0,0,0);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff5);glPushMatrix();//黑板1号下边框glTranslatef(23.5f,6.9f+blackboard3_y,-79.9f);//glScalef(24.0f,0.5f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();//黑板2号下边框glTranslatef(23.5f,-9.8f-blackboard3_y,-79.5f);//glScalef(24.0f,0.5f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();//黑板1号上边框glTranslatef(23.5f,23.7f+blackboard3_y,-79.9f);//glScalef(24.0f,0.5f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();//黑板2号上边框glTranslatef(23.5f,6.8f-blackboard3_y,-79.5f);//glScalef(24.0f,0.5f,0.5f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(0.0664,0.2578,0.1211);// 黑板1号glTranslatef(23.5f,15.3f+blackboard3_y,-79.9f);//glScalef(24.0f,16.5f,0.3f);//将立方体变成长方体glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff3);glutSolidCube(1.0);glPopMatrix();glPushMatrix();     // 黑板2号glTranslatef(23.5f,-1.3f-blackboard3_y,-79.5f);//glScalef(24.0f,16.5f,0.3f);//将立方体变成长方体glutSolidCube(1.0);glPopMatrix();}void DrawOtherThings(){glColor3f(0.521f,0.121f,0.0547f);GLfloat diffusion2[]={0.521f,0.121f,0.0547f,1.0};glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,diffusion2);glEnable(GL_TEXTURE_2D);//启用二维纹理glBindTexture(GL_TEXTURE_2D,texture[1]);glBegin(GL_QUADS);glNormal3f(-1.0f, 0.0f, 0.0f);     //绘制门glTexCoord2f(0,1);glVertex3f( 49.9f,  20.0f, -69.9f);glTexCoord2f(1,1);glVertex3f( 49.9f, 20.0f, -45.0f);glTexCoord2f(1,0);glVertex3f( 49.9f, -30.0f,  -45.0f);glTexCoord2f(0,0);glVertex3f( 49.9f, -30.0f,  -69.9f);glEnd();glBindTexture(GL_TEXTURE_2D,texture[0]); GLint x=0,y=0;for(;x<3;x++){glBegin(GL_QUADS);    glColor3f(0.521f,0.121f,0.0547f);   //绘制右窗户glTexCoord2f(0,1);glVertex3f( 49.9f,  20.0f, -30.9f+x*30);glTexCoord2f(1,1);glVertex3f( 49.9f, 20.0f, -13.9f+x*30);glTexCoord2f(1,0);glVertex3f( 49.9f, 0.0f,  -13.9f+x*30);glTexCoord2f(0,0);glVertex3f( 49.9f, 0.0f,  -30.9f+x*30);glEnd();glBegin(GL_QUADS);//glNormal3f(-1.0f, 0.0f, 0.0f);     //绘制窗户glTexCoord2f(0,1);glVertex3f( -49.9f, 20.0f, -60.9f+x*28);glTexCoord2f(1,1);glVertex3f( -49.9f, 20.0f, -43.9f+x*28);glTexCoord2f(1,0);glVertex3f( -49.9f, 0.0f,  -43.9f+x*28);glTexCoord2f(0,0);glVertex3f( -49.9f, 0.0f,  -60.9f+x*28);glEnd();}glDisable(GL_TEXTURE_2D);GLuint i=0,j=0;//画天花板上的灯glColor3f(1,1,1);for(;i<5;i++){for (;j<6;j++){glBegin(GL_QUADS);glNormal3f(0.0f, -1.0f, 0.0f);glVertex3f( -40.0f+i*18,  29.9f, -75.0f+j*20);glVertex3f( -40.0f+i*18,  29.9f, -70.0f+j*20);glVertex3f(-35.0f+i*18,  29.9f, -70.0f+j*20);glVertex3f( -35.0f+i*18,  29.9f, -75.0f+j*20);glEnd();}j=0;}GLfloat mat_amb_diff1[]={1,1,0.45,1.0};glPushMatrix();//黑板前一块高地glColor3f(0.8f,1.0f,0.8f);glTranslatef(0.0f,-29.0f,-70.0f);//glScalef(65.0f,3.0f,10.0f);//将立方体变成长方体glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1);glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(0.521f,0.121f,0.0547f);//讲台glTranslatef(-0.0f,-17.5f,-65.0f);//glScalef(20.0f,25.0f,6.0f);//将立方体变成长方体glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1);glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(0.521f,0.121f,0.0547f);//讲台glTranslatef(0.0f,-5.0f,-60.0f);//glScalef(30.0f,2.0f,8.0f);//将立方体变成长方体glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1);glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(0.521f,0.121f,0.0547f);//底座glTranslatef(0.0f,-5.0f,-60.0f);//glScalef(10.0f,3.0f,3.0f);//将立方体变成长方体glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1);glutSolidCube(1.0);glPopMatrix();glPushMatrix();glColor3f(0.521f,0.121f,0.0547f);//支架glTranslatef(0.0f,-5.0f,-60.0f);//glScalef(1.0f,10.0f,1.0f);//将立方体变成长方体glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1);glutSolidCube(1.0);glPopMatrix();}void drawEarth(){static bool loaded=false;glBindTexture(GL_TEXTURE_2D,_texLoader.getTex(L"earth"));if (!loaded){glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP);glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP);gluQuadricDrawStyle(_earth,GL_FILL);gluQuadricNormals(_earth,GLU_SMOOTH);gluQuadricTexture(_earth,GL_TRUE);}glPushMatrix();{glEnable(GL_TEXTURE_2D);glRotatef(-90,1,0,0);gluSphere(_earth,5,100,100);glDisable(GL_TEXTURE_2D);}glPopMatrix();}AUX_RGBImageRec *ReadBitMap(char *Filename){// 声明一个文件句柄用于打开文件FILE *File=NULL;         // 文件名不能空if (!Filename)         {return NULL;         }// 以只读方式打开文件测试文件是否能够打开File=fopen(Filename,"r");      // 文件是否存在if (File)             {// 存在,则关闭文件fclose(File);          // 装入测试过已存在的文件return auxDIBImageLoad(Filename);}// 文件装入失败,返回NULLreturn NULL;          }void SetupTexture(){// 纹理glEnable(GL_TEXTURE_2D);glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);// 窗户AUX_RGBImageRec *TextureImage=0;     glGenTextures(3, texture);     if (TextureImage=ReadBitMap("1.bmp")){       glBindTexture(GL_TEXTURE_2D, texture[0]);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, TextureImage->sizeX, TextureImage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage->data);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); if (TextureImage) // 释放资源        {if (TextureImage->data)       {free (TextureImage->data);     }free(TextureImage);        }}// 门// AUX_RGBImageRec *TextureImage=0;        if (TextureImage=ReadBitMap("2.bmp")){       glBindTexture(GL_TEXTURE_2D, texture[1]);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, TextureImage->sizeX, TextureImage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage->data);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); if (TextureImage) // 释放资源        {if (TextureImage->data)       {free (TextureImage->data);     }free(TextureImage);        }}// 海报// AUX_RGBImageRec *TextureImage=0;        if (TextureImage=ReadBitMap("3.bmp")){       glBindTexture(GL_TEXTURE_2D, texture[2]);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, TextureImage->sizeX, TextureImage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage->data);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); if (TextureImage) // 释放资源        {if (TextureImage->data)       {free (TextureImage->data);     }free(TextureImage);        }}// 地板// AUX_RGBImageRec *TextureImage=0;        if (TextureImage=ReadBitMap("4.bmp")){       glBindTexture(GL_TEXTURE_2D, texture[3]);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, TextureImage->sizeX, TextureImage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage->data);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); if (TextureImage) // 释放资源        {if (TextureImage->data)       {free (TextureImage->data);     }free(TextureImage);        }}_earth=gluNewQuadric();_texLoader.loadTex(L"earth", L"earth.bmp");}// glut functions// Called to draw scene  void RenderScene(void)  {  // Clear the window with current clearing color  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  glEnable(GL_NORMALIZE);// Save the matrix state and do the rotations  glPushMatrix();glScalef(zoom, zoom, zoom);glRotatef(xRot, 1.0f, 0.0f, 0.0f);  glRotatef(yRot, 0.0f, 1.0f, 0.0f); glTranslatef(xTrans, yTrans, 0);//模型   DrawRoom();glPushMatrix();glTranslatef(0.0f,-9.0f,0.0f);//DrawDesk();glPopMatrix();// DrawDesk();DrawBlackboard(); DrawOtherThings();glPushMatrix(); glTranslatef(-0.0f,2.0f,-60.0f);// glRotatef(_angle,0,1,0); drawEarth();  glPopMatrix();// Restore the matrix state  glPopMatrix();  // Display the results  glutSwapBuffers();  }  // This function does any needed initialization on the rendering  // context.   void SetupRC()  {  // Black background  glClearColor(0.0f, 0.0f, 0.0f, 1.0f );  glEnable(GL_NORMALIZE);SetupTexture();// Depth detectglEnable(GL_DEPTH_TEST);// 环境光 GLfloat model_ambient[]={0.05f,0.05f,0.05f,1.0f};//GLfloat model_ambient[]={0.8f,0.8f,0.8f,1.0f};GLfloat mat_ambient[]={0.1,0.1,0.1,1};// 镜面光GLfloat mat_specular[]={0.8,1.0,1.0,1.0};// GLfloat mat_specular[]={0.08,0.10,0.10,1.0};GLfloat mat_shininess[]={5.0};// GLfloat mat_shininess[]={1.0};// 白光// 漫反射光// GLfloat white_light[]={1.0,1.0,1.0,1.0};GLfloat white_light[]={0.5,0.5,0.51,1.0};// 位置GLfloat light_position0[]={40,19.9,-60,1.0};// 背面GLfloat light_position6[]={-40,19.9,80,1.0};// 颜色glLightModelfv(GL_LIGHT_MODEL_AMBIENT, model_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_LIGHT0,GL_POSITION,light_position0);/*glLightfv(GL_LIGHT0,GL_AMBIENT,mat_ambient);glLightfv(GL_LIGHT0,GL_DIFFUSE,white_light);glLightfv(GL_LIGHT0,GL_SPECULAR,white_light);*/glLightfv(GL_LIGHT0,GL_AMBIENT,model_ambient);glLightfv(GL_LIGHT0,GL_DIFFUSE,mat_specular);glLightfv(GL_LIGHT0,GL_SPECULAR,mat_shininess);glLightfv(GL_LIGHT6,GL_POSITION,light_position6);glLightfv(GL_LIGHT6,GL_AMBIENT,mat_ambient);glLightfv(GL_LIGHT6,GL_DIFFUSE,white_light);glLightfv(GL_LIGHT6,GL_SPECULAR,white_light);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0); glEnable(GL_LIGHT6); glEnable(GL_COLOR_MATERIAL); // 平滑着色glShadeModel(GL_SMOOTH); glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); //指定材料着色的面glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); //指定材料对镜面光的反射// 抗锯齿glEnable(GL_POINT_SMOOTH);  glEnable(GL_LINE_SMOOTH);  glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); // Make round points, not square points  glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);  // Antialias the lines  glEnable(GL_BLEND);  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);  }  /////////////////////////////////////////////////////  // Handle arrow keys  void SpecialKeys(int key, int x, int y)  {  if(key == GLUT_KEY_UP)  {  // xRot-= 5.0f; yTrans += 1.0f;}  if(key == GLUT_KEY_DOWN)  {  // xRot += 5.0f; yTrans -= 1.0f;}  if(key == GLUT_KEY_LEFT)  {// yRot -= 5.0f;  xTrans += 1.0f;}if(key == GLUT_KEY_RIGHT)  {// yRot += 5.0f;  xTrans -= 1.0f;}if(key == GLUT_KEY_F1)  {// yRot -= 5.0f;  isMoved = true;}if(key == GLUT_KEY_F2)  {// yRot += 5.0f;  isMoved = false;}if(key == GLUT_KEY_F3)  {// yRot -= 5.0f;  // isMoved = true;zoom += 0.03; }if(key == GLUT_KEY_F4)  {// yRot += 5.0f;  // isMoved = false;zoom -= 0.03; }if(key > 356.0f)  xRot = 0.0f;  if(key < -1.0f)  xRot = 355.0f;  if(key > 356.0f)  yRot = 0.0f;  if(key < -1.0f)  yRot = 355.0f;  // Refresh the Window  glutPostRedisplay();  }  void Mouse(int button, int state, int x, int y) //处理鼠标点击  {  if(state==GLUT_DOWN) //第一次鼠标按下时,记录鼠标在窗口中的初始坐标  oldmx=x,oldmy=y;  }  void onMouseMove(int x,int y) //处理鼠标拖动  {  //printf("%d\n",du);  yRot +=(x-oldmx)/3.0; //鼠标在窗口x轴方向上的增量加到视点绕y轴的角度上,这样就左右转了  xRot +=(y-oldmy)/3.0; //鼠标在窗口y轴方向上的改变加到视点的y坐标上,就上下转了  oldmx=x,oldmy=y; //把此时的鼠标坐标作为旧值,为下一次计算增量做准备  glutPostRedisplay(); }  // Reset projection  void ChangeSize(int w, int h)  {  // Prevent a divide by zero  if(h == 0)  h = 1;  // Set Viewport to window dimensions  glViewport(0, 0, w, h);  // Reset coordinate system  glMatrixMode(GL_PROJECTION);  glLoadIdentity();  GLfloat fAspect = (GLfloat) w / (GLfloat) h;  gluPerspective(75.0f, fAspect, 1.0f, 1200.0f);   gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0);// glOrtho(-10, 10, -10, 10, -10, 10);  glMatrixMode(GL_MODELVIEW);  glLoadIdentity();  }  GLvoid OnIdle(int value){if (isMoved){_angle += 2.0f;if (_angle > 360) {_angle -= 360;}}glutPostRedisplay();glutTimerFunc(100, OnIdle, 0);}int main(int argc, char *argv[]){glutInit(&argc, argv);  glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);  glutInitWindowSize(800,600);  glutCreateWindow("gl");SetupRC(); glutReshapeFunc(ChangeSize);  glutSpecialFunc(SpecialKeys);  glutDisplayFunc(RenderScene); glutMouseFunc(Mouse);  glutMotionFunc(onMouseMove);// glutIdleFunc(OnIdle);glutTimerFunc(100, OnIdle, 0); //Add a timer glutMainLoop();   gluDeleteQuadric(_earth);return 0;}

其中,我用了opengl, glut, glaux三个库。



0 0
原创粉丝点击