【问题标题】:Drawing cube 3D using Opengl使用 Opengl 绘制 3D 立方体
【发布时间】:2013-11-20 20:25:14
【问题描述】:

我想使用 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;
}

【问题讨论】:

    标签: c++ opengl glut


    【解决方案1】:

    你需要做几件事:

    • specialKeys 传递给glutSpecialFunc(),而不是glutDisplayFunc()
    • 设置GL_PROJECTIONGL_MODELVIEW 矩阵
    • 将相机向后移动一点
    • display() 的末尾添加一个glutSwapBuffers()

    例子:

    #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;
    }
    

    【讨论】:

    • 太棒了,我编译并运行了上面的代码,它就像魔法一样美丽。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多