opengl旋转方块

#include

#include

#include

#include

#include



#define ColoredVertex(c,v) do{ glColor3fv(c); glVertex3fv(v); }while(0)


GLfloat angle = 0.0f;

#define FileName "Bliss.bmp"


static GLint    ImageWidth;

static GLint    ImageHeight;

static GLint    PixelLength;

static GLubyte* PixelData;

void RevolveTriangle(){

    // glClear(GL_COLOR_BUFFER_BIT);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


        

    // 绘制像素

    glDrawPixels(ImageWidth, ImageHeight,

                 GL_BGR_EXT, GL_UNSIGNED_BYTE, PixelData);

    

    static int list = 0;

    glEnable(GL_DEPTH_TEST);

        if(list == 0){ //如果显示列表不存在,则创建

        GLfloat PointA[] = { 0.5f,-sqrt(6.0f)/12,-sqrt(3.0f)/6}, //设置4个角的位置

        PointB[] = {-0.5f,-sqrt(6.0f)/12,-sqrt(3.0f)/6},

        PointC[] = { 0.0f,-sqrt(6.0f)/12, sqrt(3.0f)/3},

        PointD[] = { 0.0f, sqrt(6.0f)/40};

        

        GLfloat ColorR[] = {1,0,0}, //设置4个角的颜色

        ColorG[] = {0,1,0},

        ColorB[] = {0,0,1},

        ColorY[] = {1,1,0};

        

        list = glGenLists(1);

        glNewList(list,GL_COMPILE);

        glBegin(GL_TRIANGLES); //画出4个三角形

        //平面BAD()

        ColoredVertex(ColorG,PointB);

        ColoredVertex(ColorR,PointA);

        ColoredVertex(ColorY,PointD);

        

        //平面ABC()

        ColoredVertex(ColorR,PointA);

        ColoredVertex(ColorG,PointB);

        ColoredVertex(ColorB,PointC);

        

        //平面ACD()

        ColoredVertex(ColorR,PointA);

        ColoredVertex(ColorB,PointC);

        ColoredVertex(ColorY,PointD);

        

        //平面CBD()

        ColoredVertex(ColorB,PointC);

        ColoredVertex(ColorG,PointB);

        ColoredVertex(ColorY,PointD);

        glEnd();

        glEndList();

    }

    //已经创建了显示列表,在每次绘制正四面体时将调用它

    glPushMatrix(); //入矩阵栈

    glRotatef(angle,1,0.5,0); //旋转

    glCallList(list); //调用列表

    glPopMatrix(); //出矩阵栈

    

    glutSwapBuffers();

}


void action(){

    if(angle >= 360.0f){

        angle = 0.0f;

    }

    angle+=2;

    RevolveTriangle();

}


int main(int argc,char *argv[]){

    FILE* pFile = fopen("/Users/Lion/Desktop/3.bmp", "rb");

    if( pFile == 0 )

        exit(0);

    

    // 读取图象的大小信息

    fseek(pFile, 0x0012, SEEK_SET);

    fread(&ImageWidth, sizeof(ImageWidth), 1, pFile);

    fread(&ImageHeight, sizeof(ImageHeight), 1, pFile);

    

    // 计算像素数据长度

    PixelLength = ImageWidth * 3;

    while( PixelLength % 4 != 0 )

        ++PixelLength;

    PixelLength *= ImageHeight;

    

    // 读取像素数据

    PixelData = (GLubyte*)malloc(PixelLength);

    if( PixelData == 0 )

        exit(0);

    

    fseek(pFile, 54, SEEK_SET);

    fread(PixelData, PixelLength, 1, pFile);

    

    // 关闭文件

    fclose(pFile);

    glutInit(&argc,argv);

    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);

    

    glutInitWindowPosition(200,200);

    glutInitWindowSize(640,480);

    glutCreateWindow("Revolve Triangle");

    

    glutDisplayFunc(&RevolveTriangle);

    glutIdleFunc(&action);

    glutMainLoop();

    free(PixelData);

    return 0;

}

你可能感兴趣的:(OpenGL)