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

📄 model.cpp

📁 导弹识别
💻 CPP
字号:
#include "stdafx.h"
#include "model.h"
#include <gl/glut.h>
GLfloat r=0;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
basisModel::basisModel()
{	g_eye[0]= MAP;//
	g_eye[2]=-MAP;//
	g_Angle=0;//方位角
	g_elev=0;//俯仰角
	g_text = gluNewQuadric();
	LoadT8("aa.BMP",g_cactus[0]);//飞机帖图
	LoadT8("bb.BMP",g_cactus[1]);//飞机帖图
}
basisModel::~basisModel()
{

}
void basisModel::light0()
{	GLfloat light_position[] = {1.0,10.0,-51.0,10.0};
	glLightfv(GL_LIGHT0, GL_POSITION, light_position);
	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
	glEnable(GL_DEPTH_TEST);
	glEnable(GL_COLOR_MATERIAL);
}
BOOL basisModel::DisplayScene()//摄像机
{ float speed=0.2f;							//步长
  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*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] =1.8;//设置摄像机对地位置高
  //摄像机的方向
  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 basisModel::DrawGround()//篮色网格地面线
{ glPushAttrib(GL_CURRENT_BIT);//保存现有颜色属实性
  glEnable(GL_BLEND);//使用纹理
  glPushMatrix();
  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, 0, -size0); glVertex3i(x, 0,  size0);}
	for (int z = -size0; z < size0;z+=4)
		{glVertex3i(-size0, 0, z); glVertex3i( size0, 0, z);}
  glEnd();
  glPopMatrix();
  glDisable(GL_BLEND);
  glPopAttrib();//恢复前一属性
}


/* 利用glu函数画圆柱面,并两边加盖,形成圆柱. */
void basisModel::myCylinder(GLUquadricObj * object, GLdouble innerRadius,
  GLdouble outerRadius, GLdouble lenght)
{
  glPushMatrix();
    gluCylinder(object, innerRadius, outerRadius, lenght, 20, 1);
    glPushMatrix();
      glRotatef(180, 0.0, 1.0, 0.0);
      gluDisk(object, 0, innerRadius, 20, 1);
    glPopMatrix();

    glTranslatef(0.0, 0.0, lenght);
    gluDisk(object, 0, outerRadius, 20, 1);
  glPopMatrix();
}

//==========================================================================
void basisModel::picter(float x,float y,float z)//组合图形
{
	GLUquadricObj *quadObj=gluNewQuadric (); 
	glPushAttrib(GL_CURRENT_BIT);//保存现有颜色属实性
	glPushMatrix();//平台==============================	
	glTranslatef(x,y+0.8f,z);		//平台的定位
	glRotatef(90,1.0,0.0,0.0);
	glColor3f(0.0f,1.0f,0.5f);		//绿色
	myCylinder(quadObj, 0.5, 1, 0.8);//圆台	
	glTranslatef(0.0f,0.0f,-0.8f);	//架的位置调整,上升0.8
	glColor3f(0.0f,0.0f,1.0f);		//蓝色
	//auxSolidBox(.2f,1.2f,.2f);		//长方架(宽、高、长)
	myCylinder(quadObj, 0.15, 0.15, 0.8);
	glColor3f(1.0f,0.0f,1.0f);		//红色
	glTranslatef(0.0f,0.0f,-0.08f);	//架的位置调整,上升0.08	
	auxSolidSphere(0.2f);			//球

	glPopMatrix();
	glPushMatrix();	
	
	//雷达==============================
	 glTranslatef(x,y+2.7f,z);		//雷达的定位1
	glRotatef(r-90,0.0,1.0,0.0);	//雷达旋转2
	//=======================================
	glColor3f(1.0f,1.0f,1.0f);		//白色
	glRotatef(45, 1.0, 0.0, 0.0);	//盘的角度调整,仰30度
	//auxWireCone(1.5,0.6f);			//线园锥盘(底半径、高)
	glutWireCone (2.0,0.8,20,20);
	//=======================================
	glRotatef(180, 1.0, 0.0, 0.0);	//杆的角度调整,反方向转
	glTranslatef(0.0f,0.0f,-0.7f);  //杆的位置调整,缩进一点
	auxWireCone(0.2f,2.0f);			//园锥杆(底半径、高)
	glColor3f(FRAND,0,0);			//随机红色
	glTranslatef(0.0f,0.0f,2.0f);	//杆的位置调整,缩进一点
	auxSolidSphere(0.1f);			//园(半径)
	glPopMatrix();

	glPushMatrix();//火箭=============================
	glTranslatef(x,y+10.0f,z);//火箭的定位
	glRotatef(r, 0.0, 1.0, 0.0);	//火箭的旋转
	glTranslatef(x/15,0,0);//火箭的定位
	//=============================================
	glColor3f(1.0f,0.0f,0.0f);		//红色
	glRotatef(180, 0.0, 1.0, 0.0);	//角度调整,与雷达平行,箭头朝前
	auxSolidCone(.2,0.6);			//园锥(底半径、高)
	//=============================================
	glColor3f(1.0f,1.0f,1.0f);		//白色
	glRotatef(90, 1.0, 0.0, 0.0);	//角度调整,与火箭头对接
	glTranslatef(0.0f,-1.0f,0);		//位置调整,与火箭头对接
	auxSolidCylinder(.2f,1);		//园柱(半径、高)
	glRotatef(-270, 1.0, 0.0, 0.0);
	glColor3f(FRAND+.6f,0.2f,0.0f);	//随机色
	glTranslatef(0.0f,-0.0f,-0.2f); //位置调整,缩进一点
	auxSolidCone(.2,1.5);			//园锥(底半径、高)
	glPopMatrix();
	glEnable(GL_TEXTURE_2D);

	glPopAttrib();//恢复前一属性
	r+=0.5f;if(r>360) r=0;

}

void basisModel::airplane(float x,float y,float z)//组合飞机
{ 
	glPushMatrix();//压入堆栈
	glTranslatef(x,y,z);//飞机的定位
	glRotatef(-r, 0.0, 1.0, 0.0);//飞机的旋转
	glTranslatef(30,0,0);		 //飞机的旋转半径
	glRotatef(30, 0.0, 0.0, 1.0);//飞机的倾斜
	//=============================================
	glPushMatrix();//
	glRotatef(-r*30, 0.0, 0.0, 1.0);//飞机的旋转
	glColor3f(0.0, 0.0, 1.0);
	Box(1.0f,0.1f,0.02f);		//方,螺旋浆	
	glPopMatrix();
	glColor3f(1.0, 1.0, 1.0);		//白色
	glEnable(GL_TEXTURE_2D);		//使用纹理
	glBindTexture(GL_TEXTURE_2D, g_cactus[1]);//
	glTranslatef(0.0f,0.0f,-0.5f);	//后移
	gluSphere(g_text, 0.4f, 8, 8);  //机头园(半径)
	//=============================================
	glTranslatef(0.0f,-0.0f,-2);	//位置调整,与机头对接
	gluCylinder(g_text,0.4,0.4,2.0,8,4);//机身,园柱(半径、高)
	//=====================================================
	glRotatef(-180, 1.0, 0.0, 0.0); //角度调整
	glTranslatef(0.0f,-0.0f,0.0f);	//位置调整,缩进一点		
	gluCylinder(g_text,0.4,0.1,1.5,8,4);//机尾,园锥(底半径、高)
	//======================================================
	glBindTexture(GL_TEXTURE_2D, g_cactus[0]);//
	glTranslatef(0.0f,-0.8f,1.2f);	//位置调整
	Box(1.0,0.05f,0.3f);				//后翼
	glTranslatef(0.0f,0.1f,0.0f);	//位置调整
	Box(0.05f,0.6f,0.30f);			//后垂翼
	//======================================================
	glTranslatef(0.0f,0.7f,-1.9f);	//位置调整
	Box(3,0.05f,0.5f);				//前翼
	//======================================================
	glDisable(GL_TEXTURE_2D);
 glPopMatrix();
}

void basisModel::Box(float x,float y,float z)
{ glPushMatrix();//压入堆栈
  glScalef(x,y,z);
  glEnable(GL_TEXTURE_2D);		//使用纹理
	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();
}

bool basisModel::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 + -