opengl纹理glTexCoord2f工作不正常

opengl纹理glTexCoord2f工作不正常,opengl,glut,Opengl,Glut,我是opengl新手。我对glTexCoord2f很困惑。我不知道如何提供坐标。我只知道坐标应该是(0,0)(0,1)(1,0)和(1,1)。当我在平面上提供纹理(此处平面用于门)时,它无法正确显示bmp图像。我尝试过随机更改坐标,但图像的形状会发生变化,但它无法垂直显示图像。显示图像的坐标是多少(一扇直的垂直门) 我的完整代码 #include<stdio.h> #include<stdlib.h> #include<math.h>

我是opengl新手。我对glTexCoord2f很困惑。我不知道如何提供坐标。我只知道坐标应该是(0,0)(0,1)(1,0)和(1,1)。当我在平面上提供纹理(此处平面用于门)时,它无法正确显示bmp图像。我尝试过随机更改坐标,但图像的形状会发生变化,但它无法垂直显示图像。显示图像的坐标是多少(一扇直的垂直门)

我的完整代码

     #include<stdio.h>
     #include<stdlib.h>
    #include<math.h>
      #include<windows.h> 
     #include<GL/glut.h>

     double cameraAngle;
     double move_X, move_Y, move_Z;
    int canDrawGrid, canDrawAxis,canDrawBase;

     double cameraRadius, cameraHeight, cameraAngleDelta;
     int num_texture  = -1;
     GLuint grassimg,md1img,brick_d123,dome_top,dome_t_d,dome_t_d_2,floorimg,sideimg,main_door;


     int LoadBitmapImage(char *filename)
     {
    int i, j=0;
    FILE *l_file;
    unsigned char *l_texture;

    BITMAPFILEHEADER fileheader;
    BITMAPINFOHEADER infoheader;
    RGBTRIPLE rgb;

    num_texture++;

    if( (l_file = fopen(filename, "rb"))==NULL) return (-1);

    fread(&fileheader, sizeof(fileheader), 1, l_file);

    fseek(l_file, sizeof(fileheader), SEEK_SET);
    fread(&infoheader, sizeof(infoheader), 1, l_file);

    l_texture = (byte *) malloc(infoheader.biWidth * infoheader.biHeight * 4);
    memset(l_texture, 0, infoheader.biWidth * infoheader.biHeight * 4);
    for (i=0; i < infoheader.biWidth*infoheader.biHeight; i++)
        {
                fread(&rgb, sizeof(rgb), 1, l_file);

                l_texture[j+0] = rgb.rgbtRed;
                l_texture[j+1] = rgb.rgbtGreen;
                l_texture[j+2] = rgb.rgbtBlue;
                l_texture[j+3] = 255;
                j += 4;
        }
    fclose(l_file);

    glBindTexture(GL_TEXTURE_2D, num_texture);

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);

// glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    glTexImage2D(GL_TEXTURE_2D, 0, 4, infoheader.biWidth, infoheader.biHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, l_texture);
    gluBuild2DMipmaps(GL_TEXTURE_2D, 4, infoheader.biWidth, infoheader.biHeight, GL_RGBA, GL_UNSIGNED_BYTE, l_texture);

    free(l_texture);

    return (num_texture);

}

void loadImage()
{
    grassimg = LoadBitmapImage("image/brick.bmp");
    brick_d123 = LoadBitmapImage("image/brick_d123.bmp");
    md1img = LoadBitmapImage("image/m_d_1.bmp");
        dome_top = LoadBitmapImage("image/dome_top.bmp");
        dome_t_d = LoadBitmapImage("image/dome_t_d.bmp");
        dome_t_d_2 = LoadBitmapImage("image/dome_t_d_2.bmp");
        floorimg = LoadBitmapImage("image/floor.bmp");
        sideimg = LoadBitmapImage("image/side_1.bmp");
        main_door = LoadBitmapImage("image/main_door.bmp");
    printf("Load successful");
}


void choto_gombuj(double tx,double ty, double tz,double deg,double axisX,double axisY,double axisZ,double sx,double sy, double sz){
    glPushMatrix();{
        glTranslatef(tx,ty,tz);
        glRotatef(deg,axisX,axisY,axisZ);
        glScalef(sx,sx,sz);
        //CG_base_cyclindeer
        GLUquadricObj *obj = gluNewQuadric();
        gluQuadricTexture(obj,GL_TRUE);

        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, brick_d123);
        gluCylinder(obj,190,190,60,20,20);
        }
        glDisable(GL_TEXTURE_2D);


        //CG_base_base_dakna
        glColor3f(0,0,0);

        glPushMatrix();{
                glTranslatef(0,0,59);
                glutSolidCone(189,1,20,20);
        }glPopMatrix();
        //CG_Cylinder_pillar_8
        glPushMatrix();{
        glTranslatef(120,120,59);
        glColor3f(1,1,1);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, grassimg);
            gluCylinder(obj,12,12,220,20,20);
        }
        glDisable(GL_TEXTURE_2D);
        }glPopMatrix();


        glPushMatrix();{
        glTranslatef(170,0,59);
        glColor3f(1,1,1);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, grassimg);
            gluCylinder(obj,12,12,220,20,20);
        }
        glDisable(GL_TEXTURE_2D);
        }glPopMatrix();



            glPushMatrix();{
        glTranslatef(120,-120,59);
        glColor3f(1,1,1);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, grassimg);
            gluCylinder(obj,12,12,220,20,20);
        }
        glDisable(GL_TEXTURE_2D);
        }glPopMatrix();

        glPushMatrix();{
            glTranslatef(0,-170,59);
        glColor3f(1,1,1);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, grassimg);
            gluCylinder(obj,12,12,220,20,20);
        }
        glDisable(GL_TEXTURE_2D);
        }glPopMatrix();

        glPushMatrix();{
            glTranslatef(-120,-120,59);
        glColor3f(1,1,1);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, grassimg);
            gluCylinder(obj,12,12,220,20,20);
        }
        glDisable(GL_TEXTURE_2D);
        }glPopMatrix();

        glPushMatrix();{
            glTranslatef(-170,0,59);
        glColor3f(1,1,1);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, grassimg);
            gluCylinder(obj,12,12,220,20,20);
        }
        glDisable(GL_TEXTURE_2D);
        }glPopMatrix();

        glPushMatrix();{
            glTranslatef(-120,120,59);
        glColor3f(1,1,1);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, grassimg);
            gluCylinder(obj,12,12,220,20,20);
        }
        glDisable(GL_TEXTURE_2D);
        }glPopMatrix();

        glPushMatrix();{
            glTranslatef(0,170,59);
        glColor3f(1,1,1);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, grassimg);
            gluCylinder(obj,12,12,220,20,20);
        }
        glDisable(GL_TEXTURE_2D);
        }glPopMatrix();



        glPushMatrix();{
            glTranslatef(0,0,220+59);
        glColor3f(1,1,1);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, md1img);
            gluCylinder(obj,220,0,60,20,20);
        }
        glDisable(GL_TEXTURE_2D);
        }glPopMatrix();




        // main_dome
        glPushMatrix();{
        glColor3f(1,1,1);
        glTranslatef(0,0,440);

        glPushMatrix();{
            glTranslatef(0,0,150);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, dome_t_d);
            GLUquadricObj *obj = gluNewQuadric();
            gluQuadricTexture(obj,GL_TRUE);
                gluCylinder(obj,160,0,130,20,20);
        }
        glDisable(GL_TEXTURE_2D);

        }glPopMatrix();

        double equ[4];
        equ[0]=0;
        equ[1]=0;
        equ[2]=1;
        equ[3]=150;

        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, dome_top);
            GLUquadricObj *obj = gluNewQuadric();
            gluQuadricTexture(obj,GL_TRUE);
            glClipPlane(GL_CLIP_PLANE0,equ);
            glEnable(GL_CLIP_PLANE0);{
                gluSphere(obj,220,20,20);
            }glDisable(GL_CLIP_PLANE0);
        }
        glDisable(GL_TEXTURE_2D);



    }glPopMatrix();


        //dome_top_balls
        glPushMatrix();{
                glTranslatef(0,0,740);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, dome_t_d_2);
            GLUquadricObj *obj = gluNewQuadric();
            gluQuadricTexture(obj,GL_TRUE);
                gluSphere(obj,40,20,20);
        }
        glDisable(GL_TEXTURE_2D);
        }glPopMatrix();


        glPushMatrix();{
                glTranslatef(0,0,810);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, dome_t_d_2);
            GLUquadricObj *obj = gluNewQuadric();
            gluQuadricTexture(obj,GL_TRUE);
                gluSphere(obj,35,20,20);
        }
        glDisable(GL_TEXTURE_2D);
        }glPopMatrix();



        glPushMatrix();{
                glTranslatef(0,0,865);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, dome_t_d_2);
            GLUquadricObj *obj = gluNewQuadric();
            gluQuadricTexture(obj,GL_TRUE);
                gluSphere(obj,30,20,20);
        }
        glDisable(GL_TEXTURE_2D);
        }glPopMatrix();

        glPushMatrix();{
                glTranslatef(0,0,910);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, dome_t_d_2);
            GLUquadricObj *obj = gluNewQuadric();
            gluQuadricTexture(obj,GL_TRUE);
                gluSphere(obj,25,20,20);
        }
        glDisable(GL_TEXTURE_2D);
        }glPopMatrix();




}glPopMatrix();
}

void minar(double tx,double ty, double tz,double deg,double axisX,double axisY,double axisZ){
    glPushMatrix();{
        glTranslatef(tx,ty,tz);
        glRotatef(deg,axisX,axisY,axisZ);
    //Minar_base
    GLUquadricObj *obj = gluNewQuadric();
        glColor3f(0,0,0);
        glPushMatrix();{
            gluCylinder(obj,150,140,240,20,20);
        }glPopMatrix();
    //Minar_base_base_dakna
    glColor3f(1,0,0);
    glPushMatrix();{
            glTranslatef(0,0,240);
            glutSolidCone(142,1,20,20);
    }glPopMatrix();
    //Minar_main_pillar

    glColor3f(1,1,1);
    glEnable(GL_TEXTURE_2D);{
        glBindTexture(GL_TEXTURE_2D, grassimg);
        GLUquadricObj *obj = gluNewQuadric();
        gluQuadricTexture(obj,GL_TRUE);
        gluCylinder(obj,105,70,1500,20,20);
    }
    glDisable(GL_TEXTURE_2D);

    //Minar_design_3_plate_1
    glPushMatrix();{
        glTranslatef(0,0,600);
        glRotatef(180,0,1,0);
        glColor3f(1,1,1);

        glEnable(GL_TEXTURE_2D);{
        glBindTexture(GL_TEXTURE_2D, md1img);
        GLUquadricObj *obj = gluNewQuadric();
        gluQuadricTexture(obj,GL_TRUE);
        gluCylinder(obj,135,0,100,20,20);
        }
        glDisable(GL_TEXTURE_2D);

        glEnable(GL_TEXTURE_2D);{
        glBindTexture(GL_TEXTURE_2D, brick_d123);
        GLUquadricObj *obj = gluNewQuadric();
        gluQuadricTexture(obj,GL_TRUE);
        gluCylinder(obj,135,0,1,20,20);
        }
        glDisable(GL_TEXTURE_2D);


    }glPopMatrix();
    ////Minar_design_3_plate_2
    glPushMatrix();{
        glTranslatef(0,0,1050);
        glColor3f(1,1,1);
        glRotatef(180,0,1,0);
        glEnable(GL_TEXTURE_2D);{
        glBindTexture(GL_TEXTURE_2D, md1img);
        GLUquadricObj *obj = gluNewQuadric();
        gluQuadricTexture(obj,GL_TRUE);
        gluCylinder(obj,120,0,100,20,20);
        }
        glDisable(GL_TEXTURE_2D);

        glEnable(GL_TEXTURE_2D);{
        glBindTexture(GL_TEXTURE_2D, brick_d123);
        GLUquadricObj *obj = gluNewQuadric();
        gluQuadricTexture(obj,GL_TRUE);
        gluCylinder(obj,120,0,1,20,20);
        }
        glDisable(GL_TEXTURE_2D);

    }glPopMatrix();
    ////Minar__design_3_plate_3
    glPushMatrix();{
        glTranslatef(0,0,1500);
        glColor3f(1,1,1);
        glRotatef(180,0,1,0);
        glEnable(GL_TEXTURE_2D);{
        glBindTexture(GL_TEXTURE_2D, md1img);
        GLUquadricObj *obj = gluNewQuadric();
        gluQuadricTexture(obj,GL_TRUE);
        gluCylinder(obj,105,0,100,20,20);
        }
        glDisable(GL_TEXTURE_2D);

        glEnable(GL_TEXTURE_2D);{
        glBindTexture(GL_TEXTURE_2D, brick_d123);
        GLUquadricObj *obj = gluNewQuadric();
        gluQuadricTexture(obj,GL_TRUE);
        gluCylinder(obj,105,0,1,20,20);
        }
        glDisable(GL_TEXTURE_2D);


    }glPopMatrix();
    choto_gombuj(0,0,1500,0,0,0,0,0.4,0.4,0.4);
}glPopMatrix();
}


void display(){
    //codes for Models, Camera

    //clear the display
    //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(0,0,0,0);  //color black
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);     //clear buffers to preset values

    /***************************
    / set-up camera (view) here
    ****************************/ 
    //load the correct matrix -- MODEL-VIEW matrix
    glMatrixMode(GL_MODELVIEW);     //specify which matrix is the current matrix

    //initialize the matrix
    glLoadIdentity();               //replace the current matrix with the identity matrix [Diagonals have 1, others have 0]

    //now give three info
    //1. where is the camera (viewer)?
    //2. where is the camera looking?
    //3. Which direction is the camera's UP direction?

    //gluLookAt(0,-150,20,  0,0,0,  0,0,1);
    gluLookAt(cameraRadius*sin(cameraAngle), -cameraRadius*cos(cameraAngle), cameraHeight,      0,0,0,      0,0,1);

    //again select MODEL-VIEW
    glMatrixMode(GL_MODELVIEW);


    /**************************************************
    / Grid and axes Lines(You can remove them if u want)
    ***************************************************/
    // draw the three major AXES

    if(canDrawAxis==1){
        glBegin(GL_LINES);
            //X axis
            glColor3f(0, 1, 0); //100% Green
            glVertex3f(-4000, 0, 0);
            glVertex3f( 4000, 0, 0);

            //Y axis
            glColor3f(0, 0, 1); //100% Blue
            glVertex3f(0, -4000, 0);    // intentionally extended to -150 to 150, no big deal
            glVertex3f(0,  4000, 0);

            //Z axis
            glColor3f(1, 1, 1); //100% White
            glVertex3f( 0, 0, -4000);
            glVertex3f(0, 0, 4000);
        glEnd();
    }

    if(canDrawGrid == 1){
    //some gridlines along the field
        int i;

        glColor3f(0.5, 0.5, 0.5);   //grey
        glBegin(GL_LINES);
            for(i=-160;i<=160;i++){

                if(i==0)
                    continue;   //SKIP the MAIN axes

                //lines parallel to Y-axis
                glVertex3f(i*20, -3600, 0);
                glVertex3f(i*20,  3600, 0);

                //lines parallel to X-axis
                glVertex3f(-3600, i*20, 0);
                glVertex3f( 3600, i*20, 0);
            }
        glEnd();

    }



    /****************************
    / Add your objects from here
    ****************************/

    if(canDrawBase == 1){

        //base_floor
        glColor3f(0,1,0);  
        glBegin(GL_QUADS);{
            glVertex3f(-3600,3600,0);
            glVertex3f(3600,3600,0);
            glVertex3f(3600,-3600,0);
            glVertex3f(-3600,-3600,0);
        }glEnd();
    }
    //taj_base
    glColor3f(1,1,1);
    //right_base_wall
    glEnable(GL_TEXTURE_2D);{
        glBindTexture(GL_TEXTURE_2D, sideimg);
        glBegin(GL_QUADS);{
            glColor3f(1,1,1);
            glTexCoord2f(0,1);
            glVertex3f(2000,2000,0);
            glTexCoord2f(0,0);
            glVertex3f(2000,-2000,0);
            glTexCoord2f(1,0);
            glVertex3f(2000,-2000,240);
            glTexCoord2f(1,1);
            glVertex3f(2000,2000,240);
        }glEnd();
    }
    glDisable(GL_TEXTURE_2D);

    glColor3f(1,1,1);
    //left_base_wall
    glEnable(GL_TEXTURE_2D);{
        glBindTexture(GL_TEXTURE_2D, sideimg);
        glBegin(GL_QUADS);{
            glColor3f(1,1,1);
            glTexCoord2f(0,1);
            glVertex3f(-2000,2000,0);
            glTexCoord2f(0,0);
            glVertex3f(-2000,-2000,0);
            glTexCoord2f(1,0);
            glVertex3f(-2000,-2000,240);
            glTexCoord2f(1,1);
            glVertex3f(-2000,2000,240);
        }glEnd();
    }
    glDisable(GL_TEXTURE_2D);


    glColor3f(1,1,1);
    //back_base_wall
    glEnable(GL_TEXTURE_2D);{
        glBindTexture(GL_TEXTURE_2D, sideimg);
        glBegin(GL_QUADS);{
            glColor3f(1,1,1);
            glTexCoord2f(0,1);
            glVertex3f(-2000,2000,0);
            glTexCoord2f(0,0);
            glVertex3f(2000,2000,0);
            glTexCoord2f(1,0);
            glVertex3f(2000,2000,240);
            glTexCoord2f(1,1);
            glVertex3f(-2000,2000,240);
        }glEnd();
    }
    glDisable(GL_TEXTURE_2D);


    glColor3f(1,1,1);
        //font__base_wall
    glEnable(GL_TEXTURE_2D);{
        glBindTexture(GL_TEXTURE_2D, sideimg);
        glBegin(GL_QUADS);{
            glColor3f(1,1,1);
            glTexCoord2f(0,1);
            glVertex3f(-2000,-2000,0);
            glTexCoord2f(0,0);
            glVertex3f(2000,-2000,0);
            glTexCoord2f(1,0);
            glVertex3f(2000,-2000,240);
            glTexCoord2f(1,1);
            glVertex3f(-2000,-2000,240);
        }glEnd();
    }
    glDisable(GL_TEXTURE_2D);



    glColor3f(1,1,1);
        //font_top_wall
    glEnable(GL_TEXTURE_2D);{
        glBindTexture(GL_TEXTURE_2D, floorimg);
        glBegin(GL_QUADS);{
            glColor3f(1,1,1);
            glTexCoord2f(0,1);
            glVertex3f(-2000,2000,240);
            glTexCoord2f(0,0);
            glVertex3f(2000,2000,240);
            glTexCoord2f(1,0);
            glVertex3f(2000,-2000,240);
            glTexCoord2f(1,1);
            glVertex3f(-2000,-2000,240);
        }glEnd();
    }
    glDisable(GL_TEXTURE_2D);










    /*//taj_base_shiri_cube
    glColor3f(1,0,0);
    glPushMatrix();{
            glTranslatef(0,-2050,120);
            //glRotatef(-16,1,0,0);
            glScalef(500,100,240);
            glutSolidCube(1);
        }glPopMatrix();

    */


    minar(-1950,-1950,0,0,0,0,0);
    minar(1950,-1950,0,0,0,0,0);
    minar(1950,1950,0,0,0,0,0);
    minar(-1950,1950,0,0,0,0,0);


    //taj_main_building
        glColor3f(1,1,1);
        glPushMatrix();{
            glTranslatef(0,-1200,240);
    glEnable(GL_TEXTURE_2D);{
        glBindTexture(GL_TEXTURE_2D, main_door);
        glBegin(GL_QUADS);{
            glTexCoord2f(0,0);
            glVertex3f(-400,0,0);
            glTexCoord2f(1,0);
            glVertex3f(400,0,0);
            glTexCoord2f(1,1);
            glVertex3f(400,0,1000);
            glTexCoord2f(1,1);
            glVertex3f(-400,0,1000);
        }glEnd();
    }
    glDisable(GL_TEXTURE_2D);
        }glPopMatrix();



    //ADD this line in the end --- if you use double buffer (i.e. GL_DOUBLE)
    glutSwapBuffers();
}

void animate(){
    //codes for any changes in Models, Camera

    //cameraAngle += cameraAngleDelta;  // camera will rotate at 0.002 radians per frame.

    //codes for any changes in Models

    //MISSING SOMETHING? -- YES: add the following
    glutPostRedisplay();    //this will call the display AGAIN

}

void init(){
    //codes for initialization
    loadImage();
    cameraAngle = 0;    //angle in radian
    move_X = 0;
    move_Y = 0;
    move_Z = 0;
    canDrawGrid = 1;
    canDrawAxis = 1;
    canDrawBase = 1;
    cameraAngleDelta = .001;

    cameraRadius = 4000;
    cameraHeight = 500;

    //clear the screen
    glClearColor(0,0,0, 0);

    /************************
    / set-up projection here
    ************************/
    //load the PROJECTION matrix
    glMatrixMode(GL_PROJECTION);

    //initialize the matrix
    glLoadIdentity();

    /*
        gluPerspective() — set up a perspective projection matrix

        fovy -         Specifies the field of view angle, in degrees, in the y direction.
        aspect ratio - Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height).
        zNear -        Specifies the distance from the viewer to the near clipping plane (always positive).
        zFar  -        Specifies the distance from the viewer to the far clipping plane (always positive).
    */

    gluPerspective(70,  1,  0.1,    10000.0);

}

void keyboardListener(unsigned char key, int x,int y){
    switch(key){

        case '1':
            move_X += 1;
            break;

        case '2':   
            move_X -= 1;
            break;

        case '3':   
            move_Y += 1;
            break;
        case '4':   
            move_Y -= 1;
            break;

        case '5':   
            move_Z += 1;
            break;
        case '6':   
            move_Z -= 1;
            break;
        case '8':   

            break;

        case 'g':
            canDrawGrid ^= 1;
            break;

        case 'h':
            canDrawAxis ^= 1;
            break;

        case 'p':
            break;

        case 'z':
            canDrawBase ^= 1;
            break;

        default:
            break;
    }
}

void specialKeyListener(int key, int x,int y){
    switch(key){
        case GLUT_KEY_DOWN:     //down arrow key
            cameraRadius += 40;
            break;
        case GLUT_KEY_UP:       // up arrow key
            if(cameraRadius > 40)
                cameraRadius -= 40;
            break;

        case GLUT_KEY_RIGHT:
            cameraAngle += 0.05;
            break;
        case GLUT_KEY_LEFT:
            cameraAngle -= 0.05;
            break;

        case GLUT_KEY_PAGE_UP:
            cameraHeight += 40;
            break;
        case GLUT_KEY_PAGE_DOWN:
            cameraHeight -= 40;
            break;

        case GLUT_KEY_INSERT:
            break;

        case GLUT_KEY_HOME:
        //  cameraAngleDelta = 0.001; 
            break;
        case GLUT_KEY_END:
        //  cameraAngleDelta = 0;
            break;

        default:
            break;
    }
}

void mouseListener(int button, int state, int x, int y){    //x, y is the x-y of the screen (2D)
    switch(button){
        case GLUT_LEFT_BUTTON:
            if(state == GLUT_DOWN){     // 2 times?? in ONE click? -- solution is checking DOWN or UP
                cameraAngleDelta = -cameraAngleDelta;   
            }
            break;

        case GLUT_RIGHT_BUTTON:
            if(cameraRadius > 40)
                cameraRadius -= 40;
            break;

        case GLUT_MIDDLE_BUTTON:
            //........
            break;

        default:
            break;
    }
}

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

    glutInit(&argc,argv);                           //initialize the GLUT library

    glutInitWindowSize(500, 500);
    glutInitWindowPosition(100, 100);

    /*
        glutInitDisplayMode - inits display mode
        GLUT_DOUBLE - allows for display on the double buffer window
        GLUT_RGBA - shows color (Red, green, blue) and an alpha
        GLUT_DEPTH - allows for depth buffer
    */
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGB);   

    glutCreateWindow("Some Title");

    init();                     //codes for initialization

    glEnable(GL_DEPTH_TEST);    //enable Depth Testing

    glutDisplayFunc(display);   //display callback function
    glutIdleFunc(animate);      //what you want to do in the idle time (when no drawing is occuring)

    glutKeyboardFunc(keyboardListener);
    glutSpecialFunc(specialKeyListener);

    glutMouseFunc(mouseListener);

    glutMainLoop();     //The main loop of OpenGL

    return 0;
}
#包括
#包括
#包括
#包括
#包括
双摄像机角度;
双动X,动Y,动Z;
int canDrawGrid、canDrawAxis、canDrawBase;
双摄像机,摄像机,摄像机三角洲;
int num_纹理=-1;
胶合草地、md1img、砖d123、穹顶、穹顶、穹顶、穹顶2、地板、侧面、大门;
int LoadBitmapImage(字符*文件名)
{
int i,j=0;
文件*l_文件;
无符号字符*l_纹理;
BITMAPFILEHEADER文件头;
BitMapInfo头信息头;
rgb三重rgb;
num_纹理++;
if((l_file=fopen(filename,“rb”))==NULL)返回(-1);
fread(&fileheader,sizeof(fileheader),1,l_文件);
fseek(l_文件、sizeof(文件头)、SEEK_集);
fread(&infoheader,sizeof(infoheader),1,l_文件);
l_纹理=(字节*)malloc(infoheader.biWidth*infoheader.biHeight*4);
memset(l_纹理,0,infoheader.biWidth*infoheader.biHeight*4);
对于(i=0;i     #include<stdio.h>
     #include<stdlib.h>
    #include<math.h>
      #include<windows.h> 
     #include<GL/glut.h>

     double cameraAngle;
     double move_X, move_Y, move_Z;
    int canDrawGrid, canDrawAxis,canDrawBase;

     double cameraRadius, cameraHeight, cameraAngleDelta;
     int num_texture  = -1;
     GLuint grassimg,md1img,brick_d123,dome_top,dome_t_d,dome_t_d_2,floorimg,sideimg,main_door;


     int LoadBitmapImage(char *filename)
     {
    int i, j=0;
    FILE *l_file;
    unsigned char *l_texture;

    BITMAPFILEHEADER fileheader;
    BITMAPINFOHEADER infoheader;
    RGBTRIPLE rgb;

    num_texture++;

    if( (l_file = fopen(filename, "rb"))==NULL) return (-1);

    fread(&fileheader, sizeof(fileheader), 1, l_file);

    fseek(l_file, sizeof(fileheader), SEEK_SET);
    fread(&infoheader, sizeof(infoheader), 1, l_file);

    l_texture = (byte *) malloc(infoheader.biWidth * infoheader.biHeight * 4);
    memset(l_texture, 0, infoheader.biWidth * infoheader.biHeight * 4);
    for (i=0; i < infoheader.biWidth*infoheader.biHeight; i++)
        {
                fread(&rgb, sizeof(rgb), 1, l_file);

                l_texture[j+0] = rgb.rgbtRed;
                l_texture[j+1] = rgb.rgbtGreen;
                l_texture[j+2] = rgb.rgbtBlue;
                l_texture[j+3] = 255;
                j += 4;
        }
    fclose(l_file);

    glBindTexture(GL_TEXTURE_2D, num_texture);

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);

// glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    glTexImage2D(GL_TEXTURE_2D, 0, 4, infoheader.biWidth, infoheader.biHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, l_texture);
    gluBuild2DMipmaps(GL_TEXTURE_2D, 4, infoheader.biWidth, infoheader.biHeight, GL_RGBA, GL_UNSIGNED_BYTE, l_texture);

    free(l_texture);

    return (num_texture);

}

void loadImage()
{
    grassimg = LoadBitmapImage("image/brick.bmp");
    brick_d123 = LoadBitmapImage("image/brick_d123.bmp");
    md1img = LoadBitmapImage("image/m_d_1.bmp");
        dome_top = LoadBitmapImage("image/dome_top.bmp");
        dome_t_d = LoadBitmapImage("image/dome_t_d.bmp");
        dome_t_d_2 = LoadBitmapImage("image/dome_t_d_2.bmp");
        floorimg = LoadBitmapImage("image/floor.bmp");
        sideimg = LoadBitmapImage("image/side_1.bmp");
        main_door = LoadBitmapImage("image/main_door.bmp");
    printf("Load successful");
}


void choto_gombuj(double tx,double ty, double tz,double deg,double axisX,double axisY,double axisZ,double sx,double sy, double sz){
    glPushMatrix();{
        glTranslatef(tx,ty,tz);
        glRotatef(deg,axisX,axisY,axisZ);
        glScalef(sx,sx,sz);
        //CG_base_cyclindeer
        GLUquadricObj *obj = gluNewQuadric();
        gluQuadricTexture(obj,GL_TRUE);

        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, brick_d123);
        gluCylinder(obj,190,190,60,20,20);
        }
        glDisable(GL_TEXTURE_2D);


        //CG_base_base_dakna
        glColor3f(0,0,0);

        glPushMatrix();{
                glTranslatef(0,0,59);
                glutSolidCone(189,1,20,20);
        }glPopMatrix();
        //CG_Cylinder_pillar_8
        glPushMatrix();{
        glTranslatef(120,120,59);
        glColor3f(1,1,1);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, grassimg);
            gluCylinder(obj,12,12,220,20,20);
        }
        glDisable(GL_TEXTURE_2D);
        }glPopMatrix();


        glPushMatrix();{
        glTranslatef(170,0,59);
        glColor3f(1,1,1);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, grassimg);
            gluCylinder(obj,12,12,220,20,20);
        }
        glDisable(GL_TEXTURE_2D);
        }glPopMatrix();



            glPushMatrix();{
        glTranslatef(120,-120,59);
        glColor3f(1,1,1);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, grassimg);
            gluCylinder(obj,12,12,220,20,20);
        }
        glDisable(GL_TEXTURE_2D);
        }glPopMatrix();

        glPushMatrix();{
            glTranslatef(0,-170,59);
        glColor3f(1,1,1);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, grassimg);
            gluCylinder(obj,12,12,220,20,20);
        }
        glDisable(GL_TEXTURE_2D);
        }glPopMatrix();

        glPushMatrix();{
            glTranslatef(-120,-120,59);
        glColor3f(1,1,1);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, grassimg);
            gluCylinder(obj,12,12,220,20,20);
        }
        glDisable(GL_TEXTURE_2D);
        }glPopMatrix();

        glPushMatrix();{
            glTranslatef(-170,0,59);
        glColor3f(1,1,1);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, grassimg);
            gluCylinder(obj,12,12,220,20,20);
        }
        glDisable(GL_TEXTURE_2D);
        }glPopMatrix();

        glPushMatrix();{
            glTranslatef(-120,120,59);
        glColor3f(1,1,1);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, grassimg);
            gluCylinder(obj,12,12,220,20,20);
        }
        glDisable(GL_TEXTURE_2D);
        }glPopMatrix();

        glPushMatrix();{
            glTranslatef(0,170,59);
        glColor3f(1,1,1);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, grassimg);
            gluCylinder(obj,12,12,220,20,20);
        }
        glDisable(GL_TEXTURE_2D);
        }glPopMatrix();



        glPushMatrix();{
            glTranslatef(0,0,220+59);
        glColor3f(1,1,1);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, md1img);
            gluCylinder(obj,220,0,60,20,20);
        }
        glDisable(GL_TEXTURE_2D);
        }glPopMatrix();




        // main_dome
        glPushMatrix();{
        glColor3f(1,1,1);
        glTranslatef(0,0,440);

        glPushMatrix();{
            glTranslatef(0,0,150);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, dome_t_d);
            GLUquadricObj *obj = gluNewQuadric();
            gluQuadricTexture(obj,GL_TRUE);
                gluCylinder(obj,160,0,130,20,20);
        }
        glDisable(GL_TEXTURE_2D);

        }glPopMatrix();

        double equ[4];
        equ[0]=0;
        equ[1]=0;
        equ[2]=1;
        equ[3]=150;

        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, dome_top);
            GLUquadricObj *obj = gluNewQuadric();
            gluQuadricTexture(obj,GL_TRUE);
            glClipPlane(GL_CLIP_PLANE0,equ);
            glEnable(GL_CLIP_PLANE0);{
                gluSphere(obj,220,20,20);
            }glDisable(GL_CLIP_PLANE0);
        }
        glDisable(GL_TEXTURE_2D);



    }glPopMatrix();


        //dome_top_balls
        glPushMatrix();{
                glTranslatef(0,0,740);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, dome_t_d_2);
            GLUquadricObj *obj = gluNewQuadric();
            gluQuadricTexture(obj,GL_TRUE);
                gluSphere(obj,40,20,20);
        }
        glDisable(GL_TEXTURE_2D);
        }glPopMatrix();


        glPushMatrix();{
                glTranslatef(0,0,810);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, dome_t_d_2);
            GLUquadricObj *obj = gluNewQuadric();
            gluQuadricTexture(obj,GL_TRUE);
                gluSphere(obj,35,20,20);
        }
        glDisable(GL_TEXTURE_2D);
        }glPopMatrix();



        glPushMatrix();{
                glTranslatef(0,0,865);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, dome_t_d_2);
            GLUquadricObj *obj = gluNewQuadric();
            gluQuadricTexture(obj,GL_TRUE);
                gluSphere(obj,30,20,20);
        }
        glDisable(GL_TEXTURE_2D);
        }glPopMatrix();

        glPushMatrix();{
                glTranslatef(0,0,910);
        glEnable(GL_TEXTURE_2D);{
            glBindTexture(GL_TEXTURE_2D, dome_t_d_2);
            GLUquadricObj *obj = gluNewQuadric();
            gluQuadricTexture(obj,GL_TRUE);
                gluSphere(obj,25,20,20);
        }
        glDisable(GL_TEXTURE_2D);
        }glPopMatrix();




}glPopMatrix();
}

void minar(double tx,double ty, double tz,double deg,double axisX,double axisY,double axisZ){
    glPushMatrix();{
        glTranslatef(tx,ty,tz);
        glRotatef(deg,axisX,axisY,axisZ);
    //Minar_base
    GLUquadricObj *obj = gluNewQuadric();
        glColor3f(0,0,0);
        glPushMatrix();{
            gluCylinder(obj,150,140,240,20,20);
        }glPopMatrix();
    //Minar_base_base_dakna
    glColor3f(1,0,0);
    glPushMatrix();{
            glTranslatef(0,0,240);
            glutSolidCone(142,1,20,20);
    }glPopMatrix();
    //Minar_main_pillar

    glColor3f(1,1,1);
    glEnable(GL_TEXTURE_2D);{
        glBindTexture(GL_TEXTURE_2D, grassimg);
        GLUquadricObj *obj = gluNewQuadric();
        gluQuadricTexture(obj,GL_TRUE);
        gluCylinder(obj,105,70,1500,20,20);
    }
    glDisable(GL_TEXTURE_2D);

    //Minar_design_3_plate_1
    glPushMatrix();{
        glTranslatef(0,0,600);
        glRotatef(180,0,1,0);
        glColor3f(1,1,1);

        glEnable(GL_TEXTURE_2D);{
        glBindTexture(GL_TEXTURE_2D, md1img);
        GLUquadricObj *obj = gluNewQuadric();
        gluQuadricTexture(obj,GL_TRUE);
        gluCylinder(obj,135,0,100,20,20);
        }
        glDisable(GL_TEXTURE_2D);

        glEnable(GL_TEXTURE_2D);{
        glBindTexture(GL_TEXTURE_2D, brick_d123);
        GLUquadricObj *obj = gluNewQuadric();
        gluQuadricTexture(obj,GL_TRUE);
        gluCylinder(obj,135,0,1,20,20);
        }
        glDisable(GL_TEXTURE_2D);


    }glPopMatrix();
    ////Minar_design_3_plate_2
    glPushMatrix();{
        glTranslatef(0,0,1050);
        glColor3f(1,1,1);
        glRotatef(180,0,1,0);
        glEnable(GL_TEXTURE_2D);{
        glBindTexture(GL_TEXTURE_2D, md1img);
        GLUquadricObj *obj = gluNewQuadric();
        gluQuadricTexture(obj,GL_TRUE);
        gluCylinder(obj,120,0,100,20,20);
        }
        glDisable(GL_TEXTURE_2D);

        glEnable(GL_TEXTURE_2D);{
        glBindTexture(GL_TEXTURE_2D, brick_d123);
        GLUquadricObj *obj = gluNewQuadric();
        gluQuadricTexture(obj,GL_TRUE);
        gluCylinder(obj,120,0,1,20,20);
        }
        glDisable(GL_TEXTURE_2D);

    }glPopMatrix();
    ////Minar__design_3_plate_3
    glPushMatrix();{
        glTranslatef(0,0,1500);
        glColor3f(1,1,1);
        glRotatef(180,0,1,0);
        glEnable(GL_TEXTURE_2D);{
        glBindTexture(GL_TEXTURE_2D, md1img);
        GLUquadricObj *obj = gluNewQuadric();
        gluQuadricTexture(obj,GL_TRUE);
        gluCylinder(obj,105,0,100,20,20);
        }
        glDisable(GL_TEXTURE_2D);

        glEnable(GL_TEXTURE_2D);{
        glBindTexture(GL_TEXTURE_2D, brick_d123);
        GLUquadricObj *obj = gluNewQuadric();
        gluQuadricTexture(obj,GL_TRUE);
        gluCylinder(obj,105,0,1,20,20);
        }
        glDisable(GL_TEXTURE_2D);


    }glPopMatrix();
    choto_gombuj(0,0,1500,0,0,0,0,0.4,0.4,0.4);
}glPopMatrix();
}


void display(){
    //codes for Models, Camera

    //clear the display
    //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(0,0,0,0);  //color black
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);     //clear buffers to preset values

    /***************************
    / set-up camera (view) here
    ****************************/ 
    //load the correct matrix -- MODEL-VIEW matrix
    glMatrixMode(GL_MODELVIEW);     //specify which matrix is the current matrix

    //initialize the matrix
    glLoadIdentity();               //replace the current matrix with the identity matrix [Diagonals have 1, others have 0]

    //now give three info
    //1. where is the camera (viewer)?
    //2. where is the camera looking?
    //3. Which direction is the camera's UP direction?

    //gluLookAt(0,-150,20,  0,0,0,  0,0,1);
    gluLookAt(cameraRadius*sin(cameraAngle), -cameraRadius*cos(cameraAngle), cameraHeight,      0,0,0,      0,0,1);

    //again select MODEL-VIEW
    glMatrixMode(GL_MODELVIEW);


    /**************************************************
    / Grid and axes Lines(You can remove them if u want)
    ***************************************************/
    // draw the three major AXES

    if(canDrawAxis==1){
        glBegin(GL_LINES);
            //X axis
            glColor3f(0, 1, 0); //100% Green
            glVertex3f(-4000, 0, 0);
            glVertex3f( 4000, 0, 0);

            //Y axis
            glColor3f(0, 0, 1); //100% Blue
            glVertex3f(0, -4000, 0);    // intentionally extended to -150 to 150, no big deal
            glVertex3f(0,  4000, 0);

            //Z axis
            glColor3f(1, 1, 1); //100% White
            glVertex3f( 0, 0, -4000);
            glVertex3f(0, 0, 4000);
        glEnd();
    }

    if(canDrawGrid == 1){
    //some gridlines along the field
        int i;

        glColor3f(0.5, 0.5, 0.5);   //grey
        glBegin(GL_LINES);
            for(i=-160;i<=160;i++){

                if(i==0)
                    continue;   //SKIP the MAIN axes

                //lines parallel to Y-axis
                glVertex3f(i*20, -3600, 0);
                glVertex3f(i*20,  3600, 0);

                //lines parallel to X-axis
                glVertex3f(-3600, i*20, 0);
                glVertex3f( 3600, i*20, 0);
            }
        glEnd();

    }



    /****************************
    / Add your objects from here
    ****************************/

    if(canDrawBase == 1){

        //base_floor
        glColor3f(0,1,0);  
        glBegin(GL_QUADS);{
            glVertex3f(-3600,3600,0);
            glVertex3f(3600,3600,0);
            glVertex3f(3600,-3600,0);
            glVertex3f(-3600,-3600,0);
        }glEnd();
    }
    //taj_base
    glColor3f(1,1,1);
    //right_base_wall
    glEnable(GL_TEXTURE_2D);{
        glBindTexture(GL_TEXTURE_2D, sideimg);
        glBegin(GL_QUADS);{
            glColor3f(1,1,1);
            glTexCoord2f(0,1);
            glVertex3f(2000,2000,0);
            glTexCoord2f(0,0);
            glVertex3f(2000,-2000,0);
            glTexCoord2f(1,0);
            glVertex3f(2000,-2000,240);
            glTexCoord2f(1,1);
            glVertex3f(2000,2000,240);
        }glEnd();
    }
    glDisable(GL_TEXTURE_2D);

    glColor3f(1,1,1);
    //left_base_wall
    glEnable(GL_TEXTURE_2D);{
        glBindTexture(GL_TEXTURE_2D, sideimg);
        glBegin(GL_QUADS);{
            glColor3f(1,1,1);
            glTexCoord2f(0,1);
            glVertex3f(-2000,2000,0);
            glTexCoord2f(0,0);
            glVertex3f(-2000,-2000,0);
            glTexCoord2f(1,0);
            glVertex3f(-2000,-2000,240);
            glTexCoord2f(1,1);
            glVertex3f(-2000,2000,240);
        }glEnd();
    }
    glDisable(GL_TEXTURE_2D);


    glColor3f(1,1,1);
    //back_base_wall
    glEnable(GL_TEXTURE_2D);{
        glBindTexture(GL_TEXTURE_2D, sideimg);
        glBegin(GL_QUADS);{
            glColor3f(1,1,1);
            glTexCoord2f(0,1);
            glVertex3f(-2000,2000,0);
            glTexCoord2f(0,0);
            glVertex3f(2000,2000,0);
            glTexCoord2f(1,0);
            glVertex3f(2000,2000,240);
            glTexCoord2f(1,1);
            glVertex3f(-2000,2000,240);
        }glEnd();
    }
    glDisable(GL_TEXTURE_2D);


    glColor3f(1,1,1);
        //font__base_wall
    glEnable(GL_TEXTURE_2D);{
        glBindTexture(GL_TEXTURE_2D, sideimg);
        glBegin(GL_QUADS);{
            glColor3f(1,1,1);
            glTexCoord2f(0,1);
            glVertex3f(-2000,-2000,0);
            glTexCoord2f(0,0);
            glVertex3f(2000,-2000,0);
            glTexCoord2f(1,0);
            glVertex3f(2000,-2000,240);
            glTexCoord2f(1,1);
            glVertex3f(-2000,-2000,240);
        }glEnd();
    }
    glDisable(GL_TEXTURE_2D);



    glColor3f(1,1,1);
        //font_top_wall
    glEnable(GL_TEXTURE_2D);{
        glBindTexture(GL_TEXTURE_2D, floorimg);
        glBegin(GL_QUADS);{
            glColor3f(1,1,1);
            glTexCoord2f(0,1);
            glVertex3f(-2000,2000,240);
            glTexCoord2f(0,0);
            glVertex3f(2000,2000,240);
            glTexCoord2f(1,0);
            glVertex3f(2000,-2000,240);
            glTexCoord2f(1,1);
            glVertex3f(-2000,-2000,240);
        }glEnd();
    }
    glDisable(GL_TEXTURE_2D);










    /*//taj_base_shiri_cube
    glColor3f(1,0,0);
    glPushMatrix();{
            glTranslatef(0,-2050,120);
            //glRotatef(-16,1,0,0);
            glScalef(500,100,240);
            glutSolidCube(1);
        }glPopMatrix();

    */


    minar(-1950,-1950,0,0,0,0,0);
    minar(1950,-1950,0,0,0,0,0);
    minar(1950,1950,0,0,0,0,0);
    minar(-1950,1950,0,0,0,0,0);


    //taj_main_building
        glColor3f(1,1,1);
        glPushMatrix();{
            glTranslatef(0,-1200,240);
    glEnable(GL_TEXTURE_2D);{
        glBindTexture(GL_TEXTURE_2D, main_door);
        glBegin(GL_QUADS);{
            glTexCoord2f(0,0);
            glVertex3f(-400,0,0);
            glTexCoord2f(1,0);
            glVertex3f(400,0,0);
            glTexCoord2f(1,1);
            glVertex3f(400,0,1000);
            glTexCoord2f(1,1);
            glVertex3f(-400,0,1000);
        }glEnd();
    }
    glDisable(GL_TEXTURE_2D);
        }glPopMatrix();



    //ADD this line in the end --- if you use double buffer (i.e. GL_DOUBLE)
    glutSwapBuffers();
}

void animate(){
    //codes for any changes in Models, Camera

    //cameraAngle += cameraAngleDelta;  // camera will rotate at 0.002 radians per frame.

    //codes for any changes in Models

    //MISSING SOMETHING? -- YES: add the following
    glutPostRedisplay();    //this will call the display AGAIN

}

void init(){
    //codes for initialization
    loadImage();
    cameraAngle = 0;    //angle in radian
    move_X = 0;
    move_Y = 0;
    move_Z = 0;
    canDrawGrid = 1;
    canDrawAxis = 1;
    canDrawBase = 1;
    cameraAngleDelta = .001;

    cameraRadius = 4000;
    cameraHeight = 500;

    //clear the screen
    glClearColor(0,0,0, 0);

    /************************
    / set-up projection here
    ************************/
    //load the PROJECTION matrix
    glMatrixMode(GL_PROJECTION);

    //initialize the matrix
    glLoadIdentity();

    /*
        gluPerspective() — set up a perspective projection matrix

        fovy -         Specifies the field of view angle, in degrees, in the y direction.
        aspect ratio - Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height).
        zNear -        Specifies the distance from the viewer to the near clipping plane (always positive).
        zFar  -        Specifies the distance from the viewer to the far clipping plane (always positive).
    */

    gluPerspective(70,  1,  0.1,    10000.0);

}

void keyboardListener(unsigned char key, int x,int y){
    switch(key){

        case '1':
            move_X += 1;
            break;

        case '2':   
            move_X -= 1;
            break;

        case '3':   
            move_Y += 1;
            break;
        case '4':   
            move_Y -= 1;
            break;

        case '5':   
            move_Z += 1;
            break;
        case '6':   
            move_Z -= 1;
            break;
        case '8':   

            break;

        case 'g':
            canDrawGrid ^= 1;
            break;

        case 'h':
            canDrawAxis ^= 1;
            break;

        case 'p':
            break;

        case 'z':
            canDrawBase ^= 1;
            break;

        default:
            break;
    }
}

void specialKeyListener(int key, int x,int y){
    switch(key){
        case GLUT_KEY_DOWN:     //down arrow key
            cameraRadius += 40;
            break;
        case GLUT_KEY_UP:       // up arrow key
            if(cameraRadius > 40)
                cameraRadius -= 40;
            break;

        case GLUT_KEY_RIGHT:
            cameraAngle += 0.05;
            break;
        case GLUT_KEY_LEFT:
            cameraAngle -= 0.05;
            break;

        case GLUT_KEY_PAGE_UP:
            cameraHeight += 40;
            break;
        case GLUT_KEY_PAGE_DOWN:
            cameraHeight -= 40;
            break;

        case GLUT_KEY_INSERT:
            break;

        case GLUT_KEY_HOME:
        //  cameraAngleDelta = 0.001; 
            break;
        case GLUT_KEY_END:
        //  cameraAngleDelta = 0;
            break;

        default:
            break;
    }
}

void mouseListener(int button, int state, int x, int y){    //x, y is the x-y of the screen (2D)
    switch(button){
        case GLUT_LEFT_BUTTON:
            if(state == GLUT_DOWN){     // 2 times?? in ONE click? -- solution is checking DOWN or UP
                cameraAngleDelta = -cameraAngleDelta;   
            }
            break;

        case GLUT_RIGHT_BUTTON:
            if(cameraRadius > 40)
                cameraRadius -= 40;
            break;

        case GLUT_MIDDLE_BUTTON:
            //........
            break;

        default:
            break;
    }
}

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

    glutInit(&argc,argv);                           //initialize the GLUT library

    glutInitWindowSize(500, 500);
    glutInitWindowPosition(100, 100);

    /*
        glutInitDisplayMode - inits display mode
        GLUT_DOUBLE - allows for display on the double buffer window
        GLUT_RGBA - shows color (Red, green, blue) and an alpha
        GLUT_DEPTH - allows for depth buffer
    */
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGB);   

    glutCreateWindow("Some Title");

    init();                     //codes for initialization

    glEnable(GL_DEPTH_TEST);    //enable Depth Testing

    glutDisplayFunc(display);   //display callback function
    glutIdleFunc(animate);      //what you want to do in the idle time (when no drawing is occuring)

    glutKeyboardFunc(keyboardListener);
    glutSpecialFunc(specialKeyListener);

    glutMouseFunc(mouseListener);

    glutMainLoop();     //The main loop of OpenGL

    return 0;
}
glPixelStorei (GL_UNPACK_ALIGNMENT, 1);