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

📄 baiscobj.cpp

📁 opengl的飞机的源程序
💻 CPP
字号:
// baiscobj.cpp: implementation of the baiscobj class.
// 学程序编游戏系列丛书
// 唐明理 E_mail: cqtmL@163.com
//====================================================================
#include "stdafx.h"
#include "baiscobj.h"
GLfloat r=0,t=0;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
baiscobj::baiscobj()
{	g_eye[0]= MAP;//
	g_eye[2]=-MAP;//
	g_Angle=0;//方位角
	g_elev=0;//俯仰角
	g_text = gluNewQuadric();
LoadT8("sand0.bmp",	 g_cactus[0]);	//地面帖图

LoadT8("6bb.bmp",g_cactus[1]);
	LoadT8("4RBack.bmp",g_cactus[2]);	//天空贴图后
	LoadT8("4Front.bmp",g_cactus[3]);	//天空贴图前
	LoadT8("4Top.bmp",	 g_cactus[4]);	//天空贴图顶
	LoadT8("4Left.bmp", g_cactus[5]);	//天空贴图左
	LoadT8("4Right.bmp",g_cactus[6]);	//天空贴图右
	LoadT8("66.bmp",g_cactus[7]);
	LoadT8("77.bmp",g_cactus[8]);
	LoadT8("88.bmp",g_cactus[9]);
	
	glEnable(GL_TEXTURE_2D);
}
baiscobj::~baiscobj()
{

}
void baiscobj::light0()
{	GLfloat light_position[] = {10.0,25.0,1.0,0.2};
	glLightfv(GL_LIGHT0, GL_POSITION, light_position);
	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
	glEnable(GL_DEPTH_TEST);
	glEnable(GL_COLOR_MATERIAL);
}
BOOL baiscobj::DisplayScene()//摄像机
{ float speed=0.5f;							//步长
  if (KEY_DOWN(VK_SHIFT))  speed   =speed*4;//按SHIFT时的加速
  if (KEY_DOWN(VK_LEFT))   g_Angle-=speed*2;//左转
  if (KEY_DOWN(VK_RIGHT))  g_Angle+=speed*2;//右转
  rad_xz = float (3.13149* g_Angle/180.0f);	//计算左右旋转角度
  if (KEY_DOWN(33)) g_elev +=0.2f;	//Page UP  键
  if (KEY_DOWN(34)) g_elev -=0.2f;	//Page Down键
  if (g_elev<-100)	g_elev  =-100;	//仰俯角
  if (g_elev> 100)	g_elev  = 100;	//仰俯角
  if (KEY_DOWN(VK_UP))				//前进
  { g_eye[2]+=sin(rad_xz)*speed;
    g_eye[0]+=cos(rad_xz)*speed;
  }
  if (KEY_DOWN(VK_DOWN))			//后退
  { g_eye[2]-=sin(rad_xz)*speed;
    g_eye[0]-=cos(rad_xz)*speed;
  }
 //控制到摄像机不离开地面
/*  if(g_eye[0]<  MAP_SCALE*2)		 g_eye[0]=  MAP_SCALE*2;
  if(g_eye[0]> (MAP_W-3)*MAP_SCALE) g_eye[0]= (MAP_W-3)*MAP_SCALE;
  if(g_eye[2]<-(MAP_W-3)*MAP_SCALE) g_eye[2]=-(MAP_W-3)*MAP_SCALE;
  if(g_eye[2]> -MAP_SCALE*2)		 g_eye[2]= -MAP_SCALE*2;*/
  if (g_eye[0]<-(MAP*2-20))	g_eye[0]= -(MAP*2-20); //视点的X分量限制
  if (g_eye[0]> (MAP*2-20))	g_eye[0]=  (MAP*2-20);
  if (g_eye[2]<-(MAP*2-20))	g_eye[2]= -(MAP*2-20); //视点的Z分量限制
  if (g_eye[2]> (MAP*2-20))	g_eye[2]=  (MAP*2-20);
  g_eye[1] =-30.0;//设置摄像机对地位置高
  //摄像机的方向
  g_look[0] = float(g_eye[0] + 100*cos(rad_xz));
  g_look[2] = float(g_eye[2] + 100*sin(rad_xz));
  g_look[1] = g_eye[1];
  //建立modelview矩阵方向
  gluLookAt(g_eye[0],g_eye[1],g_eye[2],g_look[0],g_look[1]+g_elev,g_look[2],0.0,1.0,0.0);
  return TRUE;
}

GLvoid baiscobj::DrawGround()//篮色网格地面线
{ glPushAttrib(GL_CURRENT_BIT);//保存现有颜色属实性
  //glEnable(GL_BLEND);//使用纹理
  
  glPushMatrix();
  glBindTexture(GL_TEXTURE_2D, g_cactus[0]);
  //glColor3f(0.5f, 0.7f, 1.0f);//设置蓝色
  glTranslatef(0,0.0f,0);		//平台的定位
  int size0=(int)(MAP*2);

  glBegin(GL_LINES);//划一界线
	for (int x = -size0; x < size0;x+=4)
		{glVertex3i(x, -5, -size0); glVertex3i(x, -5,  size0);}
	for (int z = -size0; z < size0;z+=4)
		{glVertex3i(-size0, -5, z); glVertex3i( size0, -5, z);}
  glEnd();
  glPopMatrix();
 // glDisable(GL_BLEND);
  glPopAttrib();//恢复前一属性
}
//==========================================================================
void baiscobj::ship(float x,float y,float z)
{
	glPushMatrix();//压入堆栈
	glTranslatef(x,y,z);
	
    glTranslatef(50,-30,0);		 

//======================================================

	glPushMatrix();
	texture(g_cactus[1]);
	
	glRotatef(60, 1.0, 0.0, 0.0); //灯罩
	glTranslatef(-1.5f,1.0f,-5.7f);	//	
	::gluQuadricTexture(g_text,GL_TRUE);
	gluCylinder(g_text,1.0,3.0,2.5,50,5);
	
    glPopMatrix();
	
//========================================================
	glPushMatrix();
   // glColor3f(1.0, 2.0, 0.0);//灯柱
	glTranslatef(-1.5f,-1.4f,-1.7f);	
	glRotatef(-90, 1.0, 0.0, 0.0);
	texture(g_cactus[9]);
	gluCylinder(g_text,0.2,0.2,5.5,20,5);
	//auxSolidCylinder(0.2f,5.5f);
	glPopMatrix();


//=============================================
	glPushMatrix();
	//glRotatef(60, 1.0, 0.0, 0.0); //灯台
	glRotatef(-90, 1.0, 0.0, 0.0); 
	glTranslatef(-1.5f,1.8f,-1.7f);	//
	gluCylinder(g_text,1.0,0.0,0.5,50,5);
	//auxSolidCone(1.0f,0.5f);
    glPopMatrix();
//=============================================
	glPushMatrix();
	glTranslatef(-1.5f,-2.0f,-1.7f);	
		Box(9.5f,0.1f,9.5f);//桌面
	glPopMatrix();

//==============================================
	glPushMatrix();
	glTranslatef(-1.5f,-17.0f,-1.7f);
	glRotatef(-90, 1.0, 0.0, 0.0); 
	texture(g_cactus[8]);
	::gluQuadricTexture(g_text,GL_TRUE);
	gluCylinder(g_text,0.8,0.8,14.5,10,5);
	//auxSolidCylinder(0.8f,15.5f);
	glPopMatrix();
	
//===============================================
	glPushMatrix();
	glTranslatef(-1.5f,-17.0f,-1.7f);	//	
	glRotatef(-90, 1.0, 0.0, 0.0); 
	gluCylinder(g_text,3.0,0.0,2.0,10,5);
   // auxSolidCone(3.0f,2.0f);
	glPopMatrix();
	glPopMatrix();
}


void baiscobj::Box(float x,float y,float z)
{ glPushMatrix();//压入堆栈
  glScalef(x,y,z);
  //glEnable(GL_TEXTURE_2D);		//使用纹理
  texture(g_cactus[7]);
	glBegin(GL_QUADS);
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);// 前
		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
		glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);// 后
		glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
		glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
		glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);// 上
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
		glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);// 下
		glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
		glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
		glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);// 左
		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
		glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
		glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);// 右
		glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
		glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
	glEnd();
//glDisable(GL_TEXTURE_2D);
 glPopMatrix();
}
void baiscobj::CreateSkyBox(int a,int wi,int he,int le)//显示天空
{	float width =MAP*wi;		// 天空盒宽
	float height=MAP*he;		// 天空盒高
	float length=MAP*le;		// 天空盒长
	float x = MAP  -width /2;	// 天空的位置x
	float y = MAP/a-height/2;	// 天空的位置y
	float z = -MAP -length/2;	// 天空的位置z
///////////////////////////////////////////////////////////////////////////////
	texture(g_cactus[0]);
glBegin(GL_QUADS);			// 多组独立填充四边形	
		glTexCoord2f(1.0f, 1.0f); glVertex3f(x+width,y,z+length);// 下
		glTexCoord2f(0.0f, 1.0f); glVertex3f( x+width,y,z);
		glTexCoord2f(0.0f, 0.0f); glVertex3f(x,		y,		 z);
		glTexCoord2f(1.0f, 0.0f); glVertex3f(x,     y,		 z+length);
	glEnd();
	texture(g_cactus[2]);		// 设置BACK贴图左
	glBegin(GL_QUADS);			// 多组独立填充四边形	
		glTexCoord2f(1.0f,0.0f); glVertex3f(x+width,y,		 z);
		glTexCoord2f(1.0f,1.0f); glVertex3f(x+width,y+height,z); 
		glTexCoord2f(0.0f,1.0f); glVertex3f(x,		y+height,z);
		glTexCoord2f(0.0f,0.0f); glVertex3f(x,		y,		 z);
	glEnd();
	texture(g_cactus[3]);		// 设置FRONT贴图右
	glBegin(GL_QUADS);			// 多组独立填充四边形
		glTexCoord2f(1.0f,0.0f); glVertex3f(x,		y,		 z+length);
		glTexCoord2f(1.0f,1.0f); glVertex3f(x,		y+height,z+length);
		glTexCoord2f(0.0f,1.0f); glVertex3f(x+width,y+height,z+length); 
		glTexCoord2f(0.0f,0.0f); glVertex3f(x+width,y,		 z+length);
	glEnd();

	texture(g_cactus[4]);		// 设置TOP贴图顶
	glBegin(GL_QUADS);			// 多组独立填充四边形		
		glTexCoord2f(0.0f,1.0f); glVertex3f(x+width,y+height,z);
		glTexCoord2f(0.0f,0.0f); glVertex3f(x+width,y+height,z+length); 
		glTexCoord2f(1.0f,0.0f); glVertex3f(x,		y+height,z+length);
		glTexCoord2f(1.0f,1.0f); glVertex3f(x,		y+height,z);
	glEnd();
	texture(g_cactus[5]);		// 设置LEFT贴图前
	glBegin(GL_QUADS);			// 多组独立填充四边形
		glTexCoord2f(1.0f,1.0f); glVertex3f(x,		y+height,z);	
		glTexCoord2f(0.0f,1.0f); glVertex3f(x,		y+height,z+length); 
		glTexCoord2f(0.0f,0.0f); glVertex3f(x,		y,		 z+length);
		glTexCoord2f(1.0f,0.0f); glVertex3f(x,		y,		 z);		
	glEnd();
	texture(g_cactus[6]);		// 设置RIGHT贴图后
	glBegin(GL_QUADS);			// 多组独立填充四边形		
		glTexCoord2f(0.0f,0.0f); glVertex3f(x+width,y,		 z);
		glTexCoord2f(1.0f,0.0f); glVertex3f(x+width,y,		 z+length);
		glTexCoord2f(1.0f,1.0f); glVertex3f(x+width,y+height,z+length); 
		glTexCoord2f(0.0f,1.0f); glVertex3f(x+width,y+height,z);
	glEnd();
	//glDisable(GL_TEXTURE_2D);
}
void baiscobj::texture(UINT textur)//设置贴图滤波
{	glBindTexture  (GL_TEXTURE_2D, textur);// 设置贴图
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
//	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR); //缩小采用线性滤波
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);//放大采用线性滤波
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
}
bool baiscobj::LoadT8(char *filename, GLuint &texture)//调8位贴图
{	AUX_RGBImageRec *pImage = NULL;
	pImage = auxDIBImageLoad(filename);			// 装入位图			
	if(pImage == NULL)		return false;		// 确保位图数据已经装入
	glGenTextures(1, &texture);					// 生成纹理
	glBindTexture    (GL_TEXTURE_2D,texture);	// 捆绑纹理
	gluBuild2DMipmaps(GL_TEXTURE_2D,4, pImage->sizeX, 
					  pImage->sizeY,GL_RGB, GL_UNSIGNED_BYTE,pImage->data);
	free(pImage->data);	//释放位图占据的内存资源
	free(pImage);	
	return true;// 返回true
}

⌨️ 快捷键说明

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