如何在OpenGL中绘制多个立方体

时间:2012-04-30 06:55:11

标签: opengl

我想在空间的某些点使用glutSolidCube绘制几个立方体。我发现的示例只是调用glutSolidCube并且它可以工作,但是为我绘制多维数据集的唯一方法是该行是否包含在glBegin(GL_POLYGON)中,这在示例中我不需要看到了,我只得到一个立方体而不是几个立方体。我所拥有的是:

glColor3f(1, 0, 0);
glLoadIdentity();
glTranslatef(5,2,1);
glutSolidCube(1);


glLoadIdentity();
glTranslatef(10,8,0);
glutSolidCube(1);

glLoadIdentity();
glTranslatef(3,7,9);
glutSolidCube(1);

glLoadIdentity();
glTranslatef(1,4,6);
glutSolidCube(1);

当我跑步时,没有任何事情发生。我知道点在我的视图之外没有问题,因为如果我在相同点绘制顶点,我可以看到它们。据我所知,我读过的例子和文档中,我没有做错任何事情。有人能告诉我我做错了什么,或者给我一段代码来绘制多个立方体吗?

2 个答案:

答案 0 :(得分:6)

试试这个:

glColor3f(1, 0, 0);
glPushMatrix();
glTranslatef(5,2,1);
glutSolidCube(1);
glPopMatrix();

glPushMatrix();
glTranslatef(10,8,0);
glutSolidCube(1);
glPopMatrix();

glPushMatrix();
glTranslatef(3,7,9);
glutSolidCube(1);
glPopMatrix();

glPushMatrix();
glTranslatef(1,4,6);
glutSolidCube(1);
glPopMatrix();

不使用glLoadIdentity()重新设置模型视图矩阵。请注意,首先,您需要拨打glOrtho()glPerspective()来设置相机一次。

答案 1 :(得分:5)

#include <GL/glut.h>

void init()
{
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_COLOR_MATERIAL);
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    GLint viewport[4];
    glGetIntegerv(GL_VIEWPORT, viewport);
    double aspect = (double)viewport[2] / (double)viewport[3];
    gluPerspective(60, aspect, 1, 100);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    // move back a bit
    glTranslatef( 0, 0, -35 );

    static float angle = 0;
    angle += 1.0f;

    glPushMatrix();
        glTranslatef(0,0,0);
        glRotatef(angle, 0.1, 0.2, 0.5);
        glColor3ub(255,0,255);
        glutSolidCube(5);
    glPopMatrix();

    glPushMatrix();
        glTranslatef(10,-10,0);
        glRotatef(angle, 0.1, 0.2, 0.5);
        glColor3ub(255,0,0);
        glutSolidCube(5);
    glPopMatrix();

    glPushMatrix();
        glTranslatef(10,10,0);
        glRotatef(angle, 0.1, 0.2, 0.5);
        glColor3ub(0,255,0);
        glutSolidCube(5);
    glPopMatrix();

    glPushMatrix();
        glTranslatef(-10,10,0);
        glRotatef(angle, 0.1, 0.2, 0.5);
        glColor3ub(0,0,255);
        glutSolidCube(5);
    glPopMatrix();

    glPushMatrix();
        glTranslatef(-10,-10,0);
        glRotatef(angle, 0.1, 0.2, 0.5);
        glColor3ub(255,255,0);
        glutSolidCube(5);
    glPopMatrix();

    glutSwapBuffers();
}

void reshape(int w, int h)
{
    glViewport(0, 0, w, h);
}

void timer(int extra)
{
    glutPostRedisplay();
    glutTimerFunc(16, timer, 0);
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitWindowSize(640,480);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);
    glutCreateWindow("CUBES");

    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutTimerFunc(0, timer, 0);

    init();

    glutMainLoop();
    return 0;
}