Drawing a Cube in OpenGL

Started by
2 comments, last by GosuDrew 18 years, 10 months ago
I don't know why my cube is not being drawn correctly, I have all my vertices being drawn so that they appear counterclockwise on the screen and GL_CULL_FACE enabled. I can still see through some of the sides of the cube. Any ideas what is wrong with the below code?

#include <GL/glut.h>
#include <stdlib.h>
#include <math.h>

GLdouble spin = 0.0;

static GLfloat vertices[] = {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,
                             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,
                             -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};

static GLfloat colors[] = {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, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0,
                           1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,
                           0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0,
                           1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0,
                           0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0}; 
                           
   
void display(void)
{
   glClear(GL_COLOR_BUFFER_BIT);
   glLoadIdentity();

   glEnableClientState(GL_VERTEX_ARRAY);
   glEnableClientState(GL_COLOR_ARRAY);
   glVertexPointer(3, GL_FLOAT, 0, vertices);
   glColorPointer(3, GL_FLOAT, 0, colors);

   glTranslatef(0.0, 0.0, -200.0);
   glRotatef(spin, 1.0, 1.0, 1.0);
   glScalef(25.0, 25.0, 25.0);

   for (int i = 0; i < 24; i = i + 4)
   {
      glBegin(GL_QUADS);
      glArrayElement(i);
      glArrayElement(i+1);
      glArrayElement(i+2);
      glArrayElement(i+3);
      glEnd();
   }

   glutSwapBuffers();
   glFlush();
}

void spin_display()
{
   spin = spin + 1;
   if (spin > 360.0)
      spin = spin - 360;
   glutPostRedisplay();
}

void init (void) 
{  
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glShadeModel (GL_FLAT);
   glEnable(GL_CULL_FACE);
}

void reshape (int w, int h)
{
   glViewport(0, 0, (GLsizei) w, (GLsizei) h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glOrtho(-50, 50, -50, 50, 5, 1000);
   glMatrixMode(GL_MODELVIEW);
}

int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
   glutInitWindowSize(500, 500);
   glutCreateWindow(argv[0]);
   init();
   glutDisplayFunc(display);
   glutReshapeFunc(reshape);
   glutIdleFunc(spin_display);
   glutKeyboardFunc(keyboard);
   glutMainLoop();
   return 0;  
}

Advertisement
You're not using normals, and you are culling backfaces. Think about it. Should become blatantly obvious! (unless you don't know what normals are, in that case you shoudl look them up)
Okay, what about the far clip plane? You're going back 200 and scaling your cube. Is it possible they are being clipped? Okay, Nevermind that, I see you have set it to 1000.
I specified normals for each of the vertices and enabled GL_CULL_FACE followed by a call to glCullFace(GL_BACK), however I can still see through some polygons. I don't know why it is doing this. Any ideas?

#include <GL/glut.h>#include <stdlib.h>#include <math.h>GLdouble spin = 0.0;static GLfloat vertices[] = {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,                             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,                             -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};static GLfloat colors[] = {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, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0,                           1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,                           0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0,                           1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0,                           0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0}; static GLfloat normals[] = {0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0,                            0.0, 0.0, -1.0, 0.0, 0.0, -1.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, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0,                            0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0,                            0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0,                            -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0};                              void display(void){   glClear(GL_COLOR_BUFFER_BIT);   glLoadIdentity();   glEnableClientState(GL_VERTEX_ARRAY);   glEnableClientState(GL_NORMAL_ARRAY);   glEnableClientState(GL_COLOR_ARRAY);   glVertexPointer(3, GL_FLOAT, 0, vertices);   glNormalPointer(GL_FLOAT, 0, normals);   glColorPointer(3, GL_FLOAT, 0, colors);   glTranslatef(0.0, 0.0, -200.0);   glRotatef(spin, 1.0, 1.0, 1.0);   glScalef(25.0, 25.0, 25.0);   glCullFace(GL_BACK);   for (int i = 0; i < 24; i = i + 4)   {      glBegin(GL_QUADS);      glArrayElement(i);      glArrayElement(i+1);      glArrayElement(i+2);      glArrayElement(i+3);      glEnd();   }   glutSwapBuffers();   glFlush();}void spin_display(){   spin = spin + 1;   if (spin > 360.0)      spin = spin - 360;   glutPostRedisplay();}void init (void) {     glClearColor (0.0, 0.0, 0.0, 0.0);   glShadeModel (GL_FLAT);   glEnable(GL_CULL_FACE);}void reshape (int w, int h){   glViewport(0, 0, (GLsizei) w, (GLsizei) h);   glMatrixMode(GL_PROJECTION);   glLoadIdentity();   glOrtho(-50, 50, -50, 50, 5, 1000);   glMatrixMode(GL_MODELVIEW);}int main(int argc, char** argv){   glutInit(&argc, argv);   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);   glutInitWindowSize(500, 500);   glutCreateWindow(argv[0]);   init();   glutDisplayFunc(display);   glutReshapeFunc(reshape);   glutIdleFunc(spin_display);   glutMainLoop();   return 0;  }

This topic is closed to new replies.

Advertisement