2015-10-29 2 views
-1

Я пытаюсь создать кубы в OpenGL/glut с помощью цикла for, но пока я получаю только переполнение.Создание кубов с петлей в opengl

вот код, чтобы создать куб с текстурами:

void Cubes1Class::render() 
{ 
    for (int face = 0; face < 6; face++) 
    { 
     if (face < 1) 
     { 
      glBindTexture(GL_TEXTURE_2D, texHandle[1]); 
      glBegin(GL_QUADS); 
      for (int vert = 0; vert <= 4; vert++) 
      { 
       glVertex3fv(VertsZ[FacesZ[face][vert]]); 
       glTexCoord2f(TexZ[vert][0], TexZ[vert][1]); 
      } 
     } 
     else 
     { 
      glBindTexture(GL_TEXTURE_2D, texHandle[0]); 
      glBegin(GL_QUADS); 
      for (int vert = 0; vert <= 4; vert++) 
      { 
       glVertex3fv(VertsZ[FacesZ[face][vert]]); 
       glTexCoord2f(TexZ[vert][0], TexZ[vert][1]); 
      } 
     } 
     glEnd(); 
    } 
} 

и это, где я пытаюсь сделать это с цикл:

CubesClass::CubesClass(int num) // constructor 
{ 
    numOfCubes = 3; 
    for (int i=0; i<numOfCubes; i++) 
    { 
     lst[i]=new Cubes1Class(); 
    } 
} 

void CubesClass::render() 
{ 
    int x = 0; 
    numOfCubes = 3; 

    for (x = 0; x < numOfCubes; x++) 
    { 
     glPushMatrix(); 
      glTranslatef(0.0, x, 0.0); 
      lst[x]->render(); 
     glPopMatrix(); 
    } 
} 

Я не могу понять, где я «Пошло не так.

Любая идея?

EDIT:

Кубики делают хорошо без для цикла, если я просто делаю то переводить затем сделать то переводить и т.д. Эти массивы:

static GLfloat VertsZ[8][3] = { 
    { -0.5, 0.5, -0.5 }, /* 0 left top rear */ 
    { 0.5, 0.5, -0.5 }, /* 1 right top rear */ 
    { 0.5, -0.5, -0.5 }, /* 2 right bottom rear */ 
    { -0.5, -0.5, -0.5 }, /* 3 left bottom rear */ 
    { -0.5, 0.5, 0.5 }, /* 4 left top front */ 
    { 0.5, 0.5, 0.5 }, /* 5 right top front */ 
    { 0.5, -0.5, 0.5 }, /* 6 right bottom front */ 
    { -0.5, -0.5, 0.5 } /* 7 left bottom front */ 
}; 

static GLuint FacesZ[6][4] = { 
    7, 6, 5, 4, /* front */ 
    6, 2, 1, 5, /* right */ 
    3, 7, 4, 0, /* left */ 
    5, 1, 0, 4, /* top */ 
    7, 6, 2, 3, /* bottom */ 
    2, 3, 0, 1 /* rear */ 
}; 

static GLfloat TexZ[4][2] = { 
    0.0, 0.0, 
    0.0, 1.0, 
    1.0, 1.0, 
    1.0, 0.0 
}; 

cubes1Class пуст в настоящее время

+0

Что вы подразумеваете под «get overflow»? – 1201ProgramAlarm

+0

Можете ли вы показать нам массивы 'VertsZ',' FacesZ' и 'TexZ'? Или еще лучше, можете ли вы дать полную декларацию и реализацию классов 'CubesClass' и' Cubes1Class'? – Tristram

+0

Как только я его визуализирую, он закроет окно, и в окне cmd он выдает ошибку openGL: переполнение стека. – GuyFawkes1313

ответ

0

Сейчас он не уверен, почему он просто не сделал извините, если я потратил впустую время:/

he re is end code:

#include "Cubes.h" 
#include "bitmap.h" 

static GLfloat VertsZ[8][3] = { 
{ -0.5, 0.5, -0.5 }, /* 0 left top rear */ 
{ 0.5, 0.5, -0.5 }, /* 1 right top rear */ 
{ 0.5, -0.5, -0.5 }, /* 2 right bottom rear */ 
{ -0.5, -0.5, -0.5 }, /* 3 left bottom rear */ 
{ -0.5, 0.5, 0.5 }, /* 4 left top front */ 
{ 0.5, 0.5, 0.5 }, /* 5 right top front */ 
{ 0.5, -0.5, 0.5 }, /* 6 right bottom front */ 
{ -0.5, -0.5, 0.5 } /* 7 left bottom front */ 
}; 

static GLuint FacesZ[6][4] = { 
7, 6, 5, 4, /* front */ 
6, 2, 1, 5, /* right */ 
3, 7, 4, 0, /* left */ 
5, 1, 0, 4, /* top */ 
7, 6, 2, 3, /* bottom */ 
2, 3, 0, 1 /* rear */ 
}; 

static GLfloat NormalsZ[6][3] = { 
0, 0, 1, /* front */ 
1, 0, 0, /* right */ 
-1, 0, 0, /* left */ 
0, 1, 0, /* top */ 
0, -1, 0, /* bottom */ 
0, 0, -1 /* rear */ 
}; 

static GLfloat TexZ[4][2] = { 
{0.0, 0.0 }, 
{0.0, 1.0 }, 
{1.0, 1.0 }, 
{1.0, 0.0 } 
}; 

static CBitmap *bmp0; // the texture 
static CBitmap *bmp1; // the texture 
static GLuint texHandle[2]; // the open gl texture handle 

void readTextureFile() 
{ 
bmp0= new CBitmap("metal.bmp"); 
printf("bmp size %d %d\n",bmp0->GetWidth(),bmp0->GetHeight()); 

bmp1= new CBitmap("starTexture3.bmp"); 
printf("bmp size %d %d\n",bmp1->GetWidth(),bmp1->GetHeight()); 

glGenTextures(2, &texHandle[0]); 

// Texture handle will be bound to the BMP bitmap data just 
// as it was read in... 
glBindTexture(GL_TEXTURE_2D, texHandle[0]); 
glTexImage2D(GL_TEXTURE_2D, 
     0,        // Mipmap level 0 
     3,        // 3 bytes [R,G,B] per pixel 
     bmp0->GetWidth(), // width of bitmap 
     bmp0->GetHeight(), // height of bitmap 
     0,        // no border pixels 
     GL_RGBA,      // bitmap pixel format 
     GL_UNSIGNED_BYTE,    // format for GL to store it 
     bmp0->GetBits()    // pointer to the pixel data 
); 

glBindTexture(GL_TEXTURE_2D, texHandle[1]); 
glTexImage2D(GL_TEXTURE_2D, 
     0,        // Mipmap level 0 
     3,        // 3 bytes [R,G,B] per pixel 
     bmp1->GetWidth(), // width of bitmap 
     bmp1->GetHeight(), // height of bitmap 
     0,        // no border pixels 
     GL_RGBA,      // bitmap pixel format 
     GL_UNSIGNED_BYTE,    // format for GL to store it 
     bmp1->GetBits()    // pointer to the pixel data 
); 

} 
// ------------------------- Cubes1Class ----------------------------- 

Cubes1Class::Cubes1Class() // constructor 
{ 

} 

void Cubes1Class::render() 
{ 
for (int face = 0; face < 6; face++) 
{ 
    if (face < 1) 
    { 
     glBindTexture(GL_TEXTURE_2D, texHandle[1]); 
     glBegin(GL_QUADS); 
     for (int vert = 0; vert <= 4; vert++) 
     { 
      glTexCoord2f(TexZ[vert][0], TexZ[vert][1]); 
      glVertex3fv(VertsZ[FacesZ[face][vert]]); 
     } 
    } 
    else 
    { 
     glBindTexture(GL_TEXTURE_2D, texHandle[0]); 
     glBegin(GL_QUADS); 
     for (int vert = 0; vert <= 4; vert++) 
     { 
      glTexCoord2f(TexZ[vert][0], TexZ[vert][1]); 
      glVertex3fv(VertsZ[FacesZ[face][vert]]); 
     } 
    } 
    glEnd(); 


} 
} 

// ------------------------- CubesClass ----------------------------- 

//Cubes1Class *lst[MAX_NUM_CUBES]; // the cubes 
//GLfloat angle[MAX_NUM_CUBES]; // the cubes rotations 

CubesClass::CubesClass(int num) // constructor 
{ 
    numOfCubes = 4; 
    for (int i=0; i<numOfCubes; i++) 
    { 
     lst[i]=new Cubes1Class(); 
    } 
} 

void CubesClass::render() // draw it 
{ 
    for (int i=0; i<numOfCubes; i++) 
    { 
     glPushMatrix(); 
      glTranslatef(0.0, i, 0.0); 

      lst[i]->render(); 
     glPopMatrix(); 
    } 
} 
Смежные вопросы