这是我结合两个程序修改的版本, 其中, 教室出自
地球仪出自
http://download.youkuaiyun.com/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:
bool loadTex(const wstring& texName,const wstring& fileName);
uint getTex( const wstring& texName);
bool delTex( const wstring& texName);
public:
bool clear();
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 )
{
GLuint newElem;
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));
delete rec->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.5
glTranslatef(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);
}
// 文件装入失败,返回NULL
return 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 detect
glEnable(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三个库。