使用 Opengl 绘制 3D 立方体

Posted

技术标签:

【中文标题】使用 Opengl 绘制 3D 立方体【英文标题】:Drawing cube 3D using Opengl 【发布时间】: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;

【问题讨论】:

【参考方案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;

【讨论】:

太棒了,我编译并运行了上面的代码,它就像魔法一样美丽。

以上是关于使用 Opengl 绘制 3D 立方体的主要内容,如果未能解决你的问题,请参考以下文章

渲染时 3D 立方体出现拉伸

在 android 中使用 opengl 在 glsurfaceview 中显示 3D 模型的问题

3D Computer Grapihcs Using OpenGL - 14 OpenGL Instancing

使用 VBO 使用 LWJGL 对 3D 立方体进行纹理处理

通过OpenGL理解前端渲染原理

OpenGL 在 GL_QUADS 之上绘制 GL_LINES