Ramy Al Zuhouri
Ramy Al Zuhouri

Reputation: 21986

Draw a cube and rotate it: a part of the cube disappears

In this code I try to draw a cube.I try to draw all faces vertices anticlockwise.
The problem is that if I don't rotate the cube only the red face is drawn, if instead I rotate it of 5 degrees, I just see a part of the cube.

#import <OpenGL/OpenGL.h>
#import <GLUT/GLUT.h>

int width=500, height=500, depth=500;

void init()
{
    glEnable(GL_DEPTH_TEST);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(200, 200,-200, 200, 200, 0, 0, 1, 0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0,width,0,height);
    gluPerspective(90, 1, -100, 100);
    glViewport(0, 0, width, height);
}

void drawCube()
{
    int vertices[8][3]= { {100,100,0} , {300,100,0}, {300,300,0}, {100,300,0}, {100,100,300} , {300,100,300}, {300,300,300}, {100,300,300} };
    glBegin(GL_QUADS);

    glColor4f(1, 0, 0, 0);
    glVertex3iv(vertices[0]);
    glVertex3iv(vertices[1]);
    glVertex3iv(vertices[2]);
    glVertex3iv(vertices[3]);

    glVertex3iv(vertices[4]);
    glVertex3iv(vertices[5]);
    glVertex3iv(vertices[6]);
    glVertex3iv(vertices[7]);

    glColor4f(0, 1, 0, 0);
    glVertex3iv(vertices[1]);
    glVertex3iv(vertices[5]);
    glVertex3iv(vertices[6]);
    glVertex3iv(vertices[4]);

    glVertex3iv(vertices[0]);
    glVertex3iv(vertices[4]);
    glVertex3iv(vertices[7]);
    glVertex3iv(vertices[3]);

    glColor4f(0, 0, 1, 0);
    glVertex3iv(vertices[3]);
    glVertex3iv(vertices[2]);
    glVertex3iv(vertices[6]);
    glVertex3iv(vertices[7]);

    glVertex3iv(vertices[0]);
    glVertex3iv(vertices[1]);
    glVertex3iv(vertices[5]);
    glVertex3iv(vertices[4]);

    glEnd();
}


void display()
{
    glClearColor(0.0, 0.0, 0.0, 0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(200,200,150);
    glRotatef(5, 0, 1, 0);
    glTranslatef(-200,-200,-150);
    drawCube();
    glutSwapBuffers();
}

void idle(void)
{
}

int main(int argc, char * argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(width, height);
    glutCreateWindow("Test");
    glutDisplayFunc(display);
    glutIdleFunc(idle);
    init();
    glutMainLoop();
    return 0;
}

This is what I see:

Window

But I should see a rotated cube, so I should see the part of the other face on the right.My doubt is that I'm going wrong with drawing the vertices in anticlockwise order, or something else.

PS: the code is outdated, because at my university I don't have the possibility to study the newest version of OpenGL, and I must use GLUT.

Upvotes: 0

Views: 870

Answers (1)

Tim
Tim

Reputation: 35943

Couple problems:

  1. Your projection matrix setup is not sensical.

    Firstly, you should decide if you want an orthographic, or a perspective projection.

    If you want orthographic, use gluOrtho2d. If you want a perspective projection, use gluPerspective. Using both will generate a bizarre transformation that's certainly not what you want.

  2. gluPerspective can't have a negative near plane. The near plane should be greater than zero, perhaps something small like 1, with a far plane defining how far away from the camera you want the back clip plane to be. Since you seem to be using units in the hundreds, I might recommend a back plane of 1000 or so.

  3. You're calling gluLookAt, but erasing the view matrix by calling glLoadIdentity in display(). If you want a view matrix, don't erase it after you program it.

Upvotes: 1

Related Questions