opengl 教室 地球仪 模型

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


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:
	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三个库。



  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
matlab编程,太阳地球月亮公转自转,球体贴图,基于matlab的仿真,实现了太阳的自转以及地球月球的自转公转。 k=6; n = 2^k-1; [x,y,z]=sphere(n ); A = imread('taiyang.png'); patches0=surf2patch(x,y,z,A); k=6; n = 2^k-1; [x,y,z]=sphere(n ); AA = imread('diqiu00.png'); patches1=surf2patch(x,y,z,AA); k=6; n = 2^k-1; [x,y,z]=sphere(n ); AAA = imread('yueqiu.png'); patches2=surf2patch(x,y,z,AAA); %set(patches,'edgecolor','none') % 设计太阳月亮地球的相对大小 Ssun=1; Searth=0.4; Smoon=0.2; % 设置太阳与地球间的距离 Res=4; % 设置地球与月亮之间的距离 Rme=1; alpha=0; beta=0; theta=0; % 设置旋转速度 step_a=0.1; %a的步长 step_b=0.2; %b的步长 step_t=0.05; %c的步长 % 设置太阳的位置 Csun=[0,0,0]; % 计时器 time=0; h=figure; % 取消坐标轴之类的属性 set(h,'toolbar','none','menubar','none','numbertitle','off') % 进入大循环 while 1==1 clf % 设置地球的位置 Cx=4*cos(alpha); Cy=4*sin(alpha); Cz=0; Cearth=[Cx,Cy,Cz]; Cmoon=[Cx+cos(2*alpha);Cy+sin(2*alpha);0;1]; patches_sun=patches0; % 绕z轴旋转坐标公式 Rz=[cos(5*theta) -sin(5*theta) 0;sin(5*theta) cos(5*theta) 0;0 0 1]; [len]=64*64; for i=1:len P=Rz*[patches0.vertices(i,1);patches0.vertices(i,2);patches0.vertices(i,3)]; patches_sun.vertices(i,1)=P(1); patches_sun.vertices(i,2)=P(2); patches_sun.vertices(i,3)=P(3); end patch(patches_sun),shading flat,hold on patches_moon=patches2; [len,t]=size(patches2.vertices); for i=1:len P=Rz*[patches2.vertices(i,1)*Smoon;patches2.vertices(i,2)*Smoon;patches2.vertices(i,3)*Smoon]+[Cmoon(1);Cmoon(2);Cmoon(3)]; patches_moon.vertices(i,1)=P(1); patches_moon.vertices(i,2)=P(2); patches_moon.vertices(i,3)=P(3); end patch(patches_moon),shading flat % 与改变太阳顶点值一致,改变地球的顶点值 patches_earth=patches1; [len,t]=size(patches1.vertices); for i=1:len P=Rz*[patches1.vertices(i,1)*Searth;patches1.vertices(i,2)*Searth;patches1.vertices(i,3)*Searth]+[Cx;Cy;Cz]; patches_earth.vertices(i,1)=P(1); patches_earth.vertices(i,2)=P(2); patches_earth.vertices(i,3)=P(3); end patch(patches_earth),shading flat daspect([1,1,1]); campos([7,7,2]),camtarget([0,0,0]),camup([0,0,1]),camva(30), % 关闭所有的坐标轴标签、刻度、背景 axis off %set(patches,'edgecolor','none') % 暂停0.1秒 pause(0.1) % 记时+1 time=time+1; % 太阳地球月亮一次改变的数值 beta=beta+step_b; alpha=alpha+step_a; theta=theta+step_t; end

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值