WindowsCE & Linux 应用开发

从来疾风有劲草,自古沃土少苍松.

导航

关于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个面都贴一样的图片
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, 
03,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.0f0.0f1.0f);
glTexCoord2f(
0.0f0.0f);glVertex3f(-1.0f-1.0f1.0f);// 纹理和四边形的左下
glTexCoord2f(1.0f0.0f);glVertex3f( 1.0f-1.0f1.0f);// 纹理和四边形的右下
glTexCoord2f(1.0f1.0f);glVertex3f( 1.0f1.0f1.0f);// 纹理和四边形的右上
glTexCoord2f(0.0f1.0f);glVertex3f(-1.0f1.0f1.0f);// 纹理和四边形的左上

 
// 后面
glNormal3f( 0.0f0.0f,-1.0f);
glTexCoord2f(
1.0f0.0f);glVertex3f(-1.0f-1.0f-1.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f1.0f);glVertex3f(-1.0f1.0f-1.0f);// 纹理和四边形的右上
glTexCoord2f(0.0f1.0f);glVertex3f( 1.0f1.0f-1.0f);// 纹理和四边形的左上
glTexCoord2f(0.0f0.0f);glVertex3f( 1.0f-1.0f-1.0f); // 纹理和四边形的左下

 
// 顶面
glNormal3f( 0.0f1.0f0.0f);
glTexCoord2f(
0.0f1.0f);glVertex3f(-1.0f1.0f-1.0f);// 纹理和四边形的左上
glTexCoord2f(0.0f0.0f);glVertex3f(-1.0f1.0f1.0f);// 纹理和四边形的左下
glTexCoord2f(1.0f0.0f);glVertex3f( 1.0f1.0f1.0f);// 纹理和四边形的右下
glTexCoord2f(1.0f1.0f);glVertex3f( 1.0f1.0f-1.0f);// 纹理和四边形的右上

// 底面
glNormal3f( 0.0f-1.0f0.0f);
glTexCoord2f(
1.0f1.0f);glVertex3f(-1.0f-1.0f-1.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f1.0f);glVertex3f( 1.0f-1.0f-1.0f); // 纹理和四边形的左上
glTexCoord2f(0.0f0.0f);glVertex3f( 1.0f-1.0f1.0f);// 纹理和四边形的左下
glTexCoord2f(1.0f0.0f);glVertex3f(-1.0f-1.0f1.0f);// 纹理和四边形的右下

// 右面
glNormal3f( 1.0f0.0f0.0f);
glTexCoord2f(
1.0f0.0f);glVertex3f( 1.0f-1.0f-1.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f1.0f);glVertex3f( 1.0f1.0f-1.0f);// 纹理和四边形的右上
glTexCoord2f(0.0f1.0f);glVertex3f( 1.0f1.0f1.0f);// 纹理和四边形的左上
glTexCoord2f(0.0f0.0f);glVertex3f( 1.0f-1.0f1.0f);// 纹理和四边形的左下

// 左面
glNormal3f( -1.0f1.0f0.0f);
glTexCoord2f(
0.0f0.0f);glVertex3f(-1.0f-1.0f-1.0f); // 纹理和四边形的左下
glTexCoord2f(1.0f0.0f);glVertex3f(-1.0f-1.0f1.0f);// 纹理和四边形的右下
glTexCoord2f(1.0f1.0f);glVertex3f(-1.0f1.0f1.0f);// 纹理和四边形的右上
glTexCoord2f(0.0f1.0f);glVertex3f(-1.0f1.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上差距很大,如果生硬按照算法来强行实现其类似惯性的效果,是不现实的
       苹果就是苹果,乔布斯太牛了。

posted on 2008-07-02 23:56  zrs  阅读(376)  评论(0编辑  收藏  举报