9 Stimmen

Wie man mehrere Würfel in OpenGL zeichnet

Ich möchte mehrere Würfel zeichnen mit glutSolidCube in einigen Punkten im Raum. Die Beispiele, die ich gefunden habe, nennen einfach glutSolidCube und es funktioniert, aber ein Würfel wird bei mir nur gezeichnet, wenn die Linie von glBegin(GL_POLYGON) was in den Beispielen, die ich gesehen habe, nicht erforderlich ist, und ich erhalte nur einen Würfel anstelle von mehreren. Was ich habe, ist:

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);

Wenn ich dies ausführe, passiert nichts. Ich weiß, dass es kein Problem damit gibt, dass die Punkte außerhalb meiner Ansicht liegen, denn wenn ich Scheitelpunkte an denselben Punkten zeichne, kann ich sie sehen. Soweit ich aus den Beispielen und der Dokumentation, die ich gelesen habe, entnehmen kann, mache ich nichts falsch. Kann mir jemand sagen, was ich falsch mache, oder mir einen Codeschnipsel geben, der mehrere Würfel zeichnet?

9voto

John Alexiou Punkte 25680

Versuchen Sie dies:

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();

Ohne Neueinstellung der Modellansichtsmatrix mit glLoadIdentity() . Beachten Sie, dass Sie zu Beginn glOrtho() o glPerspective() um die Kamera einmal einzustellen.

7voto

genpfault Punkte 49237
#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;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X