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

9

我想在空间中的一些点上使用 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);

当我运行这个程序时,什么都没有发生。我知道点的位置不在我的视图之外,因为如果我在相同的点处绘制顶点,我可以看到它们。从我阅读的示例和文档中可以看出,我没有做错任何事情。有人能告诉我我做错了什么或给我一个画多个立方体的代码片段吗?

你能在那里插入一些glGetError调用吗?检查它是否为非零值。 - Tim
问题类似于这个 - toolchainX
我在每个glutSolidCube行后添加了glGetError调用,它始终为0。 - Bob
2个回答

9

试试这个:

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()来设置相机。


确保在进行变换时发出glEnable(GL_NORMALIZED)以便重新规范化法向量。 - John Alexiou

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

谢谢您。比被采纳的答案更有帮助。 - nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接