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

📄 baiscobj.cpp

📁 代码实现物体的运动、键盘控制视角、3D图形的组合
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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();
}
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);
}
//组合图形=================================================================
void baiscobj::picter(float x,float y,float z)//组合图形
{y=GetHeight(x,z);
 glPushAttrib(GL_CURRENT_BIT);//保存现有颜色属实性
 glDisable(GL_TEXTURE_2D);
 glPushMatrix();//平台==============================
	glTranslatef(x,y+0.5f,z);		//平台的定位
	glColor3f(0.0f,1.0f,0.2f);		//绿色
	auxSolidCube(1);				//方台(边长)
	glTranslatef(0.0f,0.8f,0.0f);	//架的位置调整,上升0.8
	glColor3f(0.0f,0.0f,1.0f);		//蓝色
	auxSolidBox(.2f,1.3f,.2f);		//长方架(宽、高、长)
 glPopMatrix();
 glPushMatrix();//雷达==============================
	glTranslatef(x,y+2.5f,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);			//线园锥盘(底半径、高)
	//=======================================
	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();//glPopMatrix();
	glTranslatef(x,y+30.0f,z);//火箭的定位
	glRotatef(r, 0.0, 1.0, 0.0);	//火箭的旋转
	glTranslatef(x/5,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+=1.0f;if(r>360) r=0;
}
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;                         // 返回成功
}
void baiscobj::LoadT16(char *filename, GLuint &texture)//调帖图
{ glGenTextures(1, &texture);            //获取1个未使用的贴图名称
  glBindTexture(GL_TEXTURE_2D, texture); //选择要绑定的贴图(纹理)
  BITMAPINFOHEADER bitHeader;			 //定义位图结构
  unsigned char *buffer;                 //定义位图指针
  buffer=LoadBitmapFileWithAlpha(filename,&bitHeader); //调入位图
  gluBuild2DMipmaps	( GL_TEXTURE_2D,     // 创建一个 2D贴图(纹理)
					  4,                 // 使用3种颜色(RGB)+ 颜色深度
					  bitHeader.biWidth, // 图像宽
					  bitHeader.biHeight,// 图像高
					  GL_RGBA,           // 红绿蓝顺序
					  GL_UNSIGNED_BYTE,  // 图像的数据类型是字节
					  buffer             // 指定贴图(纹理)数据
					);                   // 创建贴图(纹理)
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  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);
  free(buffer);                                // 释放位图数据
}
unsigned char * baiscobj::LoadBit(char *filename, BITMAPINFOHEADER *bitmap)
{ FILE *filePtr;                        // 定义文件句柄
  BITMAPFILEHEADER  Header;   // 定义位图指针
  unsigned char    *Image;        // 位图数据区
  unsigned int      imageIdx = 0;       // 图形索引
  unsigned char     tempRGB;            // 交换变量
  filePtr = fopen(filename, "rb");// 读文件
  if (filePtr == NULL)    return NULL;// 读文件出错返回
  fread(&Header, sizeof(BITMAPFILEHEADER), 1, filePtr);
  if (Header.bfType != BITMAP_ID)
  { fclose(filePtr);
    return NULL;
  }
  fread(bitmap, sizeof(BITMAPINFOHEADER), 1, filePtr);
  fseek(filePtr, Header.bfOffBits, SEEK_SET);
  Image = (unsigned char*)malloc(bitmap->biSizeImage);
  if (!Image)
  { free(Image);
    fclose(filePtr);
    return NULL;
  }
  fread(Image, 1, bitmap->biSizeImage, filePtr);//将图形数据读入
  if (Image == NULL)
  { fclose(filePtr);
    return NULL;
  }
  for (imageIdx = 0; imageIdx < bitmap->biSizeImage; imageIdx+=3)
  { tempRGB = Image[imageIdx];
    Image[imageIdx] = Image[imageIdx + 2];
    Image[imageIdx + 2] = tempRGB;
  }
  fclose(filePtr);
  return Image;
}
/////////////////////////////////////////////////////////////////////////////
void baiscobj::ShowTree(float x,float z,float h,float s,int cactus)//树
{ glEnable(GL_BLEND);
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  glEnable(GL_ALPHA_TEST);
  glAlphaFunc(GL_GREATER, 0);
  float mat[16];// get the modelview matrix
  glGetFloatv(GL_MODELVIEW_MATRIX, mat);
  vector3_t X(mat[0], mat[4], mat[8]);// get the right and up vectors
  vector3_t Z(mat[1], mat[5], mat[9]); 
  glBindTexture(GL_TEXTURE_2D, g_cactus[cactus]);//选择树
  vector3_t pos(x,0.0,-z);//树的位置 
  pos.y = GetHeight(x, -z) + h + s;//树根深浅
  glBegin(GL_QUADS);//显示全部树
	 glTexCoord2f(0.0,0.0);glVertex3fv((pos+(X+Z)*-h).v);//左下点
	 glTexCoord2f(1.0,0.0);glVertex3fv((pos+(X-Z)* h).v);//右下点
	 glTexCoord2f(1.0,1.0);glVertex3fv((pos+(X+Z)* h).v);//右上点
	 glTexCoord2f(0.0,1.0);glVertex3fv((pos+(Z-X)* h).v);//左上点
  glEnd();
  glDisable(GL_ALPHA);
  glDisable(GL_BLEND);
}
void baiscobj::ShowTree0(float x,float z,float h,float s,int cactus)//树
{//普通平面做的树。
  glPushMatrix();//
  float y = GetHeight(x,-z) + h + s;//树根深浅
  glTranslatef(x,y, -z);//位置
  glRotatef(180, 1.0, 0.0, 0.0);
  glEnable(GL_BLEND);
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  glEnable(GL_ALPHA_TEST);
  glAlphaFunc(GL_GREATER, 0);
	glBindTexture(GL_TEXTURE_2D, g_cactus[cactus]);//选择树
//	glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);//
	glBegin(GL_QUADS);// 开始绘制		
		glTexCoord2f(1.0f, 0.0f); glVertex3f(-h, h, 0.0f);		// 右上点
		glTexCoord2f(0.0f, 0.0f); glVertex3f( h, h, 0.0f);		// 右上点
		glTexCoord2f(0.0f, 1.0f); glVertex3f( h,-h, 0.0f);		// 右下点
		glTexCoord2f(1.0f, 1.0f); glVertex3f(-h,-h, 0.0f);		// 左下点
	glEnd();
  glDisable(GL_ALPHA);
  glDisable(GL_BLEND);
  glPopMatrix();
}
////////////////////////////////////////////////////////////////////
void baiscobj::load3dobj(char* dir,char* cn,int a)
{	char	appdir[256];
	GetCurrentDirectory(256,appdir);
	SetCurrentDirectory(dir);
	m_3ds->Init(cn,a);
	SetCurrentDirectory(appdir);

}
void baiscobj::Scene(int obj,float x,float h,float z,float r,int re,float size)//显示对象
{	               //序号obj,位置  x,高度  h,位置  z,半径  r,角度re,大小  size
	 glPushMatrix();//glPopMatrix();
	 int y=GetHeight(x,z)+h;
	 glTranslatef(x,y,z);	//飞机定位
	 glRotatef(re, 0.0, 1.0, 0.0);	//飞机的旋转
	 if(obj>0) glRotatef(-20, 1.0, 0.0, 0.0);	//飞机的斜角
	 m_3ds->show3ds(obj,0,0.0f,r,size);//显示3ds模型飞机运行半径的定位
	 glPopMatrix();
}

⌨️ 快捷键说明

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