⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 skybox.cpp

📁 通过vc++编程实现3DS格式的模型载入
💻 CPP
字号:
//========================================================
/**
*  @file      SkyBox.cpp
*
*  项目描述: 3DS文件载入
*  文件描述:  天空盒类  
*  适用平台: Windows98/2000/NT/XP
*  
*  作者:     WWBOSS
*  电子邮件:  wwboss123@gmail.com
*  创建日期: 2006-12-06	
*  修改日期: 2006-12-10
*
*/     
//========================================================

#include "SkyBox.h"

	
CSkyBox::CSkyBox():length(750.0f),width(550.0f),height(400.0f),yRot(0.01f)
{	
}

CSkyBox::~CSkyBox()
{
	/** 删除纹理对象及其占用的内存 */
	for(int i =0 ;i< 5; i++)
	{
		m_texture[i].FreeImage();
		glDeleteTextures(1,&m_texture[i].ID);
	}
	
}


/** 天空盒初始化 */
bool CSkyBox::init()
{
	char filename[128] ;                                         /**< 用来保存文件名 */
	char *bmpName[] = { "back","front","top","left","right"};
	for(int i=0; i< 5; i++)
	{
		sprintf(filename,"data/%s",bmpName[i]);
		strcat(filename,".bmp");
		if(!m_texture[i].LoadBitmap(filename))                     /**< 载入位图文件 */
		{
			MessageBox(NULL,"装载位图文件失败!","错误",MB_OK);    /**< 如果载入失败则弹出对话框 */
			exit(0);
		}
		glGenTextures(1, &m_texture[i].ID);                        /**< 生成一个纹理对象名称 */
		 
		glBindTexture(GL_TEXTURE_2D, m_texture[i].ID);             /**< 创建纹理对象 */
		/** 控制滤波 */
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
		/** 创建纹理 */
		gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, m_texture[i].imageWidth,
						m_texture[i].imageHeight, GL_RGB, GL_UNSIGNED_BYTE,
					    m_texture[i].image);
	}
	return true;
	
}


void CSkyBox::render()
{
	/** 获得场景中光照状态 */
	GLboolean lp;
	glGetBooleanv(GL_LIGHTING,&lp);

	m_CameraPos = Camera::GetCamera()->getPosition();

	glDisable(GL_LIGHTING);            /**< 关闭光照 */
	glEnable(GL_TEXTURE_2D);

	/** 开始绘制 */
	glPushMatrix();
	glTranslatef(m_CameraPos.x,m_CameraPos.y,m_CameraPos.z);

	glRotatef(yRot,0.0f,1.0f,0.0f);
			
	/** 绘制背面 */
	glBindTexture(GL_TEXTURE_2D, m_texture[0].ID);
    glBegin(GL_QUADS);		
		
		/** 指定纹理坐标和顶点坐标 */
		glTexCoord2f(1.0f, 0.0f); glVertex3f(  width, -height, -length);
		glTexCoord2f(1.0f, 1.0f); glVertex3f(  width,  height, -length); 
		glTexCoord2f(0.0f, 1.0f); glVertex3f( -width,  height, -length);
		glTexCoord2f(0.0f, 0.0f); glVertex3f( -width, -height, -length);
		
	glEnd();



	/** 绘制前面 */
	glBindTexture(GL_TEXTURE_2D, m_texture[1].ID);
	glBegin(GL_QUADS);	
	
		/** 指定纹理坐标和顶点坐标 */
		glTexCoord2f(1.0f, 0.0f); glVertex3f( -width, -height, length);
		glTexCoord2f(1.0f, 1.0f); glVertex3f( -width,  height, length);
		glTexCoord2f(0.0f, 1.0f); glVertex3f(  width,  height, length); 
		glTexCoord2f(0.0f, 0.0f); glVertex3f(  width, -height, length);

	glEnd();

	

	/** 绘制顶面 */
	glBindTexture(GL_TEXTURE_2D,  m_texture[2].ID);
	glBegin(GL_QUADS);		
		
	    /** 指定纹理坐标和顶点坐标 */
		glTexCoord2f(0.0f, 1.0f); glVertex3f(  width, height, -length);
		glTexCoord2f(0.0f, 0.0f); glVertex3f(  width, height,  length); 
		glTexCoord2f(1.0f, 0.0f); glVertex3f( -width, height,  length);
	    glTexCoord2f(1.0f, 1.0f); glVertex3f( -width, height, -length);
		
	glEnd();


	
	/** 绘制左面 */
	glBindTexture(GL_TEXTURE_2D, m_texture[3].ID);
	glBegin(GL_QUADS);		
		
		/** 指定纹理坐标和顶点坐标 */
		glTexCoord2f(1.0f, 1.0f);  glVertex3f( -width,  height,	-length);		
		glTexCoord2f(0.0f, 1.0f);  glVertex3f( -width,  height,  length); 
		glTexCoord2f(0.0f, 0.0f);  glVertex3f( -width, -height,  length);
		glTexCoord2f(1.0f, 0.0f);  glVertex3f( -width, -height, -length);	
		
	glEnd();

	/** 绘制右面 */
	glBindTexture(GL_TEXTURE_2D, m_texture[4].ID);
	glBegin(GL_QUADS);		

		/** 指定纹理坐标和顶点坐标 */
		glTexCoord2f(0.0f, 0.0f); glVertex3f( width, -height, -length);
		glTexCoord2f(1.0f, 0.0f); glVertex3f( width, -height,  length);
		glTexCoord2f(1.0f, 1.0f); glVertex3f( width,  height,  length); 
		glTexCoord2f(0.0f, 1.0f); glVertex3f( width,  height, -length);
	glEnd();
	

    glPopMatrix();                 /** 绘制结束 */

	if(lp)                         /** 恢复光照状态 */  
		glEnable(GL_LIGHTING);

	glDisable(GL_TEXTURE_2D);

	 yRot += 0.01f;
	 if(yRot > 360.0f)
		 yRot = 0.0f;

	

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -