2013-11-20 254 views
1

我想使用OpenGL繪製3D立方體這是我的新代碼如何糾正錯誤........................ .................................................. .....使用Opengl繪製立方體3D

float ver[8][3] = 
{ 
    {-1.0,-1.0,1.0}, 
    {-1.0,1.0,1.0}, 
    {1.0,1.0,1.0}, 
    {1.0,-1.0,1.0}, 

    {-1.0,1.0,-1.0}, 
    {1.0,1.0,-1.0}, 

}; 

GLfloat color[8][3] = 
{ 
    {0.0,0.0,0.0}, 
    {1.0,0.0,0.0}, 
    {1.0,1.0,0.0}, 
    {0.0,1.0,0.0}, 

    {1.0,1.0,1.0}, 
    {0.0,1.0,1.0}, 
}; 

void quad(int a,int b,int c,int d) 
{ 
    glBegin(GL_QUADS); 
    glColor3fv(color[a]); 
    glVertex3fv(ver[a]); 

    glColor3fv(color[b]); 
    glVertex3fv(ver[b]); 

    glColor3fv(color[d]); 
    glVertex3fv(ver[d]); 
    glEnd(); 
} 

void colorcube() 
{ 
    quad(0,3,2,1); 
    quad(2,3,7,6); 
} 
void display(){ 
    // Clear screen and Z-buffer 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 

    // Reset transformations 
    glLoadIdentity(); 
    colorcube(); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); 
    glutInitWindowSize(640, 480); 
    glutCreateWindow("GLUT"); 
    glutDisplayFunc(display); 
    glutDisplayFunc(specialKeys); 
    glEnable(GL_DEPTH_TEST); 
    glutMainLoop(); 
    return 0; 
} 

回答

9

你需要做幾件事情:

  • specialKeysglutSpecialFunc(),不glutDisplayFunc()
  • 設置GL_PROJECTIONGL_MODELVIEW矩陣
  • 移動相機回位
  • 添加glutSwapBuffers()display()

實施例的端部:

#include <GL/glut.h> 

float ver[8][3] = 
{ 
    {-1.0,-1.0,1.0}, 
    {-1.0,1.0,1.0}, 
    {1.0,1.0,1.0}, 
    {1.0,-1.0,1.0}, 
    {-1.0,-1.0,-1.0}, 
    {-1.0,1.0,-1.0}, 
    {1.0,1.0,-1.0}, 
    {1.0,-1.0,-1.0}, 
}; 

GLfloat color[8][3] = 
{ 
    {0.0,0.0,0.0}, 
    {1.0,0.0,0.0}, 
    {1.0,1.0,0.0}, 
    {0.0,1.0,0.0}, 
    {0.0,0.0,1.0}, 
    {1.0,0.0,1.0}, 
    {1.0,1.0,1.0}, 
    {0.0,1.0,1.0}, 
}; 

void quad(int a,int b,int c,int d) 
{ 
    glBegin(GL_QUADS); 
    glColor3fv(color[a]); 
    glVertex3fv(ver[a]); 

    glColor3fv(color[b]); 
    glVertex3fv(ver[b]); 

    glColor3fv(color[c]); 
    glVertex3fv(ver[c]); 

    glColor3fv(color[d]); 
    glVertex3fv(ver[d]); 
    glEnd(); 
} 

void colorcube() 
{ 
    quad(0,3,2,1); 
    quad(2,3,7,6); 
    quad(0,4,7,3); 
    quad(1,2,6,5); 
    quad(4,5,6,7); 
    quad(0,1,5,4); 
} 

double rotate_y = 0; 
double rotate_x = 0; 
void specialKeys(int key, int x, int y) 
{ 
    if (key == GLUT_KEY_RIGHT) 
     rotate_y += 5; 
    else if (key == GLUT_KEY_LEFT) 
     rotate_y -= 5; 
    else if (key == GLUT_KEY_UP) 
     rotate_x += 5; 
    else if (key == GLUT_KEY_DOWN) 
     rotate_x -= 5; 
    glutPostRedisplay(); 
} 

void display() 
{ 
    glClearColor(0, 0, 0, 1); 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    int w = glutGet(GLUT_WINDOW_WIDTH); 
    int h = glutGet(GLUT_WINDOW_HEIGHT); 
    gluPerspective(60, w/h, 0.1, 100); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    gluLookAt 
     ( 
     3, 3, 3, 
     0, 0, 0, 
     0, 0, 1 
     ); 

    glRotatef(rotate_x, 1.0, 0.0, 0.0); 
    glRotatef(rotate_y, 0.0, 1.0, 0.0); 
    colorcube(); 

    glutSwapBuffers(); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); 
    glutInitWindowSize(640, 480); 
    glutCreateWindow("GLUT"); 
    glutDisplayFunc(display); 
    glutSpecialFunc(specialKeys); 
    glEnable(GL_DEPTH_TEST); 
    glutMainLoop(); 
    return 0; 
}