我使用 C++ 和 OpenGL 使用四边形、直线和点绘制了一个立方体。我现在正在尝试使我的代码更密集。为此,我想使用 for 循环。
我的立方体的顶点在一个二维数组中,如下所示:
double vertices[8][3] = {
{ 1.0f, 1.0f, 1.0f}, //0
{ 1.0f, 1.0f,-1.0f}, //1
{ 1.0f,-1.0f,-1.0f}, //2
{-1.0f,-1.0f,-1.0f}, //3
{-1.0f,-1.0f, 1.0f}, //4
{-1.0f, 1.0f, 1.0f}, //5
{-1.0f, 1.0f,-1.0f}, //6
{ 1.0f,-1.0f, 1.0f} //7
};
目前我使用线条绘制立方体的代码是
void drawLines(){
glBegin(GL_LINES);
//Front Lines
//Left
glVertex3f(vertices[5][0],vertices[5][1],vertices[5][2]);
glVertex3f(vertices[4][0],vertices[4][1],vertices[4][2]);
//Top
glVertex3f(vertices[5][0],vertices[5][1],vertices[5][2]);
glVertex3f(vertices[0][0],vertices[0][1],vertices[0][2]);
//Bottom
glVertex3f(vertices[4][0],vertices[4][1],vertices[4][2]);
glVertex3f(vertices[7][0],vertices[7][1],vertices[7][2]);
//Right
glVertex3f(vertices[7][0],vertices[7][1],vertices[7][2]);
glVertex3f(vertices[0][0],vertices[0][1],vertices[0][2]);
//Middle Lines
//Top Left
glVertex3f(vertices[6][0],vertices[6][1],vertices[6][2]);
glVertex3f(vertices[5][0],vertices[5][1],vertices[5][2]);
//Top Right
glVertex3f(vertices[1][0],vertices[1][1],vertices[1][2]);
glVertex3f(vertices[0][0],vertices[0][1],vertices[0][2]);
//Bottom Left
glVertex3f(vertices[3][0],vertices[3][1],vertices[3][2]);
glVertex3f(vertices[4][0],vertices[4][1],vertices[4][2]);
//Bottom Right
glVertex3f(vertices[2][0],vertices[2][1],vertices[2][2]);
glVertex3f(vertices[7][0],vertices[7][1],vertices[7][2]);
//Back Lines
//Left
glVertex3f(vertices[6][0],vertices[6][1],vertices[6][2]);
glVertex3f(vertices[3][0],vertices[3][1],vertices[3][2]);
//Top
glVertex3f(vertices[6][0],vertices[6][1],vertices[6][2]);
glVertex3f(vertices[1][0],vertices[1][1],vertices[1][2]);
//Bottom
glVertex3f(vertices[3][0],vertices[3][1],vertices[3][2]);
glVertex3f(vertices[2][0],vertices[2][1],vertices[2][2]);
//Right
glVertex3f(vertices[2][0],vertices[2][1],vertices[2][2]);
glVertex3f(vertices[1][0],vertices[1][1],vertices[1][2]);
glEnd(); // Done Drawing Edges
}
为了压缩我的代码,我试图使用 for 循环获得相同的结果,目前我有这个:
glBegin(GL_LINES);
for ( int i=0; i<8; i+=1 ) {
for (int j=0; j<8; j+=1) {
glVertex3f(vertices[i][0],vertices[i][1],vertices[i][2]);
glVertex3f(vertices[j][0],vertices[j][1],vertices[j][2]);
}
}
glEnd();
我的问题是,任何人都可以给我指导以获得与我的原始代码相同的结果吗?
最佳答案
为索引添加一个数组:
int[12][2] indices = {
{5,4},
{5,0},
{4,7},
{7,0},
{6,5},
{1,0},
{3,4},
{2,7},
{6,3},
{6,1},
{3,2},
{2,1}
}
然后循环:
glBegin(GL_LINES);
for ( int i=0; i<12; i+=1 ) {
glVertex3f(vertices[indices[i][0]][0],vertices[indices[i][0]][1],vertices[indices[i][0]][2]);
glVertex3f(vertices[indices[i][1]][0],vertices[indices[i][1]][1],vertices[indices[i][1]][2]);
}
glEnd();
但是,不建议像您一样使用旧的(和已弃用的)openGL 进行学习。相反,建议的方法是将顶点数据上传到 VBO;创建一组着色器并使用 glDrawArrays
或 glDrawElements
代替。
关于c++ - 使用 for 循环的 OpenGL 立方体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33606951/