📄 baiscobj.cpp
字号:
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 + -