[英]Initializing a multidimensional array of GLfloats in C++
我currenty有我脑袋里结对如何通过正确初始化行线 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,但是在那对我来说没有任何意义)的语法错误。 我希望我的问题很清楚,有人可以帮助我。 我在此站点或任何其他站点上都没有找到与我的问题类似的东西。
提前致谢!
语法的问题是通过说targetVertices [iii]来引用数组的第iii个索引,而不是整个列。 2D数组存储为1D数组,但提供[] []以方便访问。 您可以将它们称为一维或二维。
这是一种更可重用的方法。
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:
glBufferData(GL_ARRAY_BUFFER,
data.size()*sizeof(GLfloat),
&data[0],
GL_STREAM_DRAW);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.