2013-12-21 32 views
0

我现在正在脑海里结一个关于如何正确初始化GLFloats的一个数组,逐行。 据我所知,一个阵列可以这样写:用C++初始化一个GLfloats的多维数组

int a[2][2] = {{1,2},{3,4}} 

在我的情况,我有数组

GLfloat targetVertices[10][72]; 

为立方体的六个面的顶点(万个立方,准确地说)。立方坐标存储在

float targetX[10], targetY[10], targetZ[10]; 

数组中。我想初始化它是这样的:

for(iii = 0; iii <= 9; iii++) { 
    targetVertices[iii] = {     /*Side 1*/ 
          targetX[iii]-1, targetY[iii]-1, targetZ[iii]-1, 
          targetX[iii]-1, targetY[iii]-1, targetZ[iii]+1, 
          targetX[iii]-1, targetY[iii]+1, targetZ[iii]+1, 
          targetX[iii]-1, targetY[iii]+1, targetZ[iii]-1, 
              /*Side 2*/ 
          targetX[iii]+1, targetY[iii]-1, targetZ[iii]-1, 
          targetX[iii]+1, targetY[iii]-1, targetZ[iii]+1, 
          targetX[iii]+1, targetY[iii]+1, targetZ[iii]+1, 
          targetX[iii]+1, targetY[iii]+1, targetZ[iii]-1, 
              /*Side 3*/ 
          targetX[iii]-1, targetY[iii]-1, targetZ[iii]-1, 
          targetX[iii]-1, targetY[iii]-1, targetZ[iii]+1, 
          targetX[iii]+1, targetY[iii]-1, targetZ[iii]+1, 
          targetX[iii]+1, targetY[iii]-1, targetZ[iii]-1, 
              /*Side 4*/ 
          targetX[iii]-1, targetY[iii]+1, targetZ[iii]-1, 
          targetX[iii]-1, targetY[iii]+1, targetZ[iii]+1, 
          targetX[iii]+1, targetY[iii]+1, targetZ[iii]+1, 
          targetX[iii]+1, targetY[iii]+1, targetZ[iii]-1, 
              /*Side 5*/ 
          targetX[iii]-1, targetY[iii]-1, targetZ[iii]-1, 
          targetX[iii]-1, targetY[iii]+1, targetZ[iii]-1, 
          targetX[iii]+1, targetY[iii]+1, targetZ[iii]-1, 
          targetX[iii]+1, targetY[iii]-1, targetZ[iii]-1, 
              /*Side 6*/ 
          targetX[iii]-1, targetY[iii]-1, targetZ[iii]+1, 
          targetX[iii]-1, targetY[iii]+1, targetZ[iii]+1, 
          targetX[iii]+1, targetY[iii]+1, targetZ[iii]+1, 
          targetX[iii]+1, targetY[iii]-1, targetZ[iii]+1 
          }; 
} 

不幸的是,我总是告诉关于第一个波浪支架语法错误(C2059和C2143,但那些没有任何意义,我在那里) 。 我希望我的问题很清楚,有人可以帮助我。我还没有在这个或任何其他网站上发现任何类似于我的问题。

在此先感谢!

回答

1

你的语法问题是说targetVertices [iii]你指的是数组的iith索引,而不是整列。二维数组存储为一维数组,但为简单访问提供[] []。您可以将它们称为单维或二维。

这是一个更可重用的方法来解决这个问题。

void addVertex(std::vector<GLfloat> &data, GLfloat x, GLfloat y, GLfloat z) 
{ 
    data.push_back(x); 
    data.push_back(y); 
    data.push_back(z); 
} 

void addCube(std::vector<GLfloat> &data, GLfloat x, GLfloat y, GLfloat z) 
{ 
    addVertex(data, x-1, y-1, z-1); 
    addVertex(data, x-1, y-1, z+1); 
    addVertex(data, x-1, y+1, z+1); 
    addVertex(data, x-1, y+1, z-1); 

    addVertex(data, x+1, y-1, z-1); 
    addVertex(data, x+1, y-1, z+1); 
    addVertex(data, x+1, y+1, z+1); 
    addVertex(data, x+1, y+1, z-1); 

    addVertex(data, x-1, y-1, z-1); 
    addVertex(data, x-1, y-1, z+1); 
    addVertex(data, x+1, y-1, z+1); 
    addVertex(data, x+1, y-1, z-1); 

    addVertex(data, x-1, y+1, z-1); 
    addVertex(data, x-1, y+1, z+1); 
    addVertex(data, x+1, y+1, z+1); 
    addVertex(data, x+1, y+1, z-1); 

    addVertex(data, x-1, y-1, z-1); 
    addVertex(data, x-1, y+1, z-1); 
    addVertex(data, x+1, y+1, z-1); 
    addVertex(data, x+1, y-1, z-1); 

    addVertex(data, x-1, y-1, z+1); 
    addVertex(data, x-1, y+1, z+1); 
    addVertex(data, x+1, y+1, z+1); 
    addVertex(data, x+1, y-1, z+1); 
} 

void makeCubes(std::vector<GLfloat> &data) 
{ 
    float targetX[10], targetY[10], targetZ[10]; 
      data.clear(); 
      data.reserve(720); 

    //...initialize the above arrays... 

    for (int i=0; i<10; i++) 
    { 
     std::vector<GLfloat> newData; 
     addCube(newData, targetX[i], targetY[i], targetZ[i]); 
     data.insert(data.begin(), newData.begin(), newData.end()); 
    } 
} 

你可以很容易通过采取参照第一元件将其转换为一个C-数组:

std::vector<GLfloat> data; 
makeCubes(data); 
GLfloat *cArray = &data[0]; 

的呼叫到glBufferData c应该是这样的:

glBufferData(GL_ARRAY_BUFFER, 
      data.size()*sizeof(GLfloat), 
      &data[0], 
      GL_STREAM_DRAW); 
+0

非常感谢,我会尝试并实施您的解决方案。但是,出于理解的目的,为什么我不能简单地将数据逐行分配给我的数组?它适用于char数组(至少在ANSI-C中)。此外,我可能误解了,因为它本身不是一个初始化,而是一个赋值(我预先在两个嵌套for循环中初始化为全零)。它可能通过使用“新”关键字工作?如在写GLfloat * targetVertices;在我的头文件和构造函数中targetVertices = new GLfloat [] [];或者其他的东西? –

+0

您的语法问题是通过说targetVertices [iii]您指的是数组的iiith索引,而不是整列。请参阅2D数组存储为1D数组,但为简单访问提供[] []。您可以将它们称为单维或二维。如果您已经分配了10x72阵列,则不需要“新”。 –