关于3D贴图的总结
第一步:封装一个打开位图的函数,返回AUX_RGBImageRec类型的一个指针
AUX_RGBImageRec *LoadBMP(char *Filename)
{
FILE *File=NULL;
if (!Filename)
{
return NULL;
}
File=fopen(Filename,"r");
if (File)
{
fclose(File);
return auxDIBImageLoad(Filename);
}
return NULL;
}
第二步:声明一个AUX_RGBImageRec 类型的指针数组,用于存取需要用到的图片,一个立方体,如果要求每个面的贴图都不一样,则需要准备6张位图,也就是这里声明的指针数组的元素要为6,以一张位图为例,即6个面都贴一样的图片
{
FILE *File=NULL;
if (!Filename)
{
return NULL;
}
File=fopen(Filename,"r");
if (File)
{
fclose(File);
return auxDIBImageLoad(Filename);
}
return NULL;
}
第二步:声明一个AUX_RGBImageRec 类型的指针数组,用于存取需要用到的图片,一个立方体,如果要求每个面的贴图都不一样,则需要准备6张位图,也就是这里声明的指针数组的元素要为6,以一张位图为例,即6个面都贴一样的图片
AUX_RGBImageRec *TextureImage[1]; //一张如片
memset(TextureImage,0,sizeof(void *) *1);
if (TextureImage[0]=LoadBMP(".//test.bmp"))
{
Status=TRUE;
glGenTextures(3, &texture[0]); // 创建纹理 3种
//创建线形滤波纹理
glBindTexture(GL_TEXTURE_2D, texture[1]);
glTexImage2D(GL_TEXTURE_2D, 0, 3,TextureImage[0]->sizeX, TextureImage[0]->sizeY,0, GL_RGB,
GL_UNSIGNED_BYTE, TextureImage [0]->data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // 线形滤波
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // 线形滤波
}
if (TextureImage[0])// 纹理是否存在
{
if (TextureImage[0]->data)// 纹理图像是否存在
{
free(TextureImage[0]->data);// 释放纹理图像占用的内存
}
free(TextureImage[0]);// 释放图像结构
}
具体绘制
memset(TextureImage,0,sizeof(void *) *1);
if (TextureImage[0]=LoadBMP(".//test.bmp"))
{
Status=TRUE;
glGenTextures(3, &texture[0]); // 创建纹理 3种
//创建线形滤波纹理
glBindTexture(GL_TEXTURE_2D, texture[1]);
glTexImage2D(GL_TEXTURE_2D, 0, 3,TextureImage[0]->sizeX, TextureImage[0]->sizeY,0, GL_RGB,
GL_UNSIGNED_BYTE, TextureImage [0]->data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // 线形滤波
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // 线形滤波
}
if (TextureImage[0])// 纹理是否存在
{
if (TextureImage[0]->data)// 纹理图像是否存在
{
free(TextureImage[0]->data);// 释放纹理图像占用的内存
}
free(TextureImage[0]);// 释放图像结构
}
具体绘制
glBegin(GL_QUADS);
// 前面
glNormal3f( 0.0f, 0.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);// 纹理和四边形的左上
// 后面
glNormal3f( 0.0f, 0.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); // 纹理和四边形的左下
// 顶面
glNormal3f( 0.0f, 1.0f, 0.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);// 纹理和四边形的右上
// 底面
glNormal3f( 0.0f, -1.0f, 0.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);// 纹理和四边形的右下
// 右面
glNormal3f( 1.0f, 0.0f, 0.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);// 纹理和四边形的左下
// 左面
glNormal3f( -1.0f, 1.0f, 0.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();
/* rtri+=0.2f;
rquad-=0.15f;*/
xrot+=0.1f;// X 轴旋转
yrot+=0.1f;// Y 轴旋转
//zrot+=0.1f;// Z 轴旋转}
我注意到最近卖的很火的iphone的首界面有个3D的立方箱体,当用户开机时,触摸这个立方体时,它会旋转着向上升起一段距离,感觉这种效果很眩,我想如果是基于OPenGL的话,应该就是给一个这个立方体贴图,然后,使其以视点坐标系绕Y轴和X轴以及Z轴旋转,并且在Y轴上做平移。
感觉现在很多手机公司都在一窝蜂的模仿抄袭IPHONE的界面,但是感觉在WM上怎么做都应该达不到苹果的这中效果,前天老板跟我表达了一个意思,让我实现一个类似于iphone 的天气预报的界面,我就直言不苇的说,界面实现不难,原理都差不多,但是WM系统和苹果的系统在TOUCH上差距很大,如果生硬按照算法来强行实现其类似惯性的效果,是不现实的
苹果就是苹果,乔布斯太牛了。
// 前面
glNormal3f( 0.0f, 0.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);// 纹理和四边形的左上
// 后面
glNormal3f( 0.0f, 0.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); // 纹理和四边形的左下
// 顶面
glNormal3f( 0.0f, 1.0f, 0.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);// 纹理和四边形的右上
// 底面
glNormal3f( 0.0f, -1.0f, 0.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);// 纹理和四边形的右下
// 右面
glNormal3f( 1.0f, 0.0f, 0.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);// 纹理和四边形的左下
// 左面
glNormal3f( -1.0f, 1.0f, 0.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();
/* rtri+=0.2f;
rquad-=0.15f;*/
xrot+=0.1f;// X 轴旋转
yrot+=0.1f;// Y 轴旋转
//zrot+=0.1f;// Z 轴旋转}
我注意到最近卖的很火的iphone的首界面有个3D的立方箱体,当用户开机时,触摸这个立方体时,它会旋转着向上升起一段距离,感觉这种效果很眩,我想如果是基于OPenGL的话,应该就是给一个这个立方体贴图,然后,使其以视点坐标系绕Y轴和X轴以及Z轴旋转,并且在Y轴上做平移。
感觉现在很多手机公司都在一窝蜂的模仿抄袭IPHONE的界面,但是感觉在WM上怎么做都应该达不到苹果的这中效果,前天老板跟我表达了一个意思,让我实现一个类似于iphone 的天气预报的界面,我就直言不苇的说,界面实现不难,原理都差不多,但是WM系统和苹果的系统在TOUCH上差距很大,如果生硬按照算法来强行实现其类似惯性的效果,是不现实的
苹果就是苹果,乔布斯太牛了。